Векторизованная реализация MD5 в С# не возвращает правильный хэшC#

Место общения программистов C#
Ответить
Anonymous
 Векторизованная реализация MD5 в С# не возвращает правильный хэш

Сообщение Anonymous »

Я пытался реализовать md5 на C#, вот код:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;
using Microsoft.Build.Evaluation;

namespace md5vc
{
internal class Program
{
static void Main(string[] args)
{
Vector[] msg = new Vector[16];

for(int i = 0; i < 16; i++)
{
msg[i] = new Vector(0);
}

MD5.md5round(msg);

Console.WriteLine("done...  result :");
Console.Write(MD5.a[0].ToString("x8") + MD5.b[0].ToString("x8") + MD5.c[0].ToString("x8") + MD5.d[0].ToString("x8"));
Console.ReadKey();
}
}

public static class MD5
{
public static Vector K0xd76aa478 = new Vector(0xd76aa478);
public static Vector K0xe8c7b756 = new Vector(0xe8c7b756);
public static Vector K0x242070db = new Vector(0x242070db);
public static Vector K0xc1bdceee = new Vector(0xc1bdceee);
public static Vector K0xf57c0faf = new Vector(0xf57c0faf);
public static Vector K0x4787c62a = new Vector(0x4787c62a);
public static Vector K0xa8304613 = new Vector(0xa8304613);
public static Vector K0xfd469501 = new Vector(0xfd469501);
public static Vector K0x698098d8 = new Vector(0x698098d8);
public static Vector K0x8b44f7af = new Vector(0x8b44f7af);
public static Vector K0xffff5bb1 = new Vector(0xffff5bb1);
public static Vector K0x895cd7be = new Vector(0x895cd7be);
public static Vector K0x6b901122 = new Vector(0x6b901122);
public static Vector K0xfd987193 = new Vector(0xfd987193);
public static Vector K0xa679438e = new Vector(0xa679438e);
public static Vector K0x49b40821 = new Vector(0x49b40821);
public static Vector K0xf61e2562 = new Vector(0xf61e2562);
public static Vector K0xc040b340 = new Vector(0xc040b340);
public static Vector K0x265e5a51 = new Vector(0x265e5a51);
public static Vector K0xe9b6c7aa = new Vector(0xe9b6c7aa);
public static Vector K0xd62f105d = new Vector(0xd62f105d);
public static Vector K0x02441453 = new Vector(0x02441453);
public static Vector K0xd8a1e681 = new Vector(0xd8a1e681);
public static Vector K0xe7d3fbc8 = new Vector(0xe7d3fbc8);
public static Vector K0x21e1cde6 = new Vector(0x21e1cde6);
public static Vector K0xc33707d6 = new Vector(0xc33707d6);
public static Vector K0xf4d50d87 = new Vector(0xf4d50d87);
public static Vector K0x455a14ed = new Vector(0x455a14ed);
public static Vector K0xa9e3e905 = new Vector(0xa9e3e905);
public static Vector K0xfcefa3f8 = new Vector(0xfcefa3f8);
public static Vector K0x676f02d9 = new Vector(0x676f02d9);
public static Vector K0x8d2a4c8a = new Vector(0x8d2a4c8a);
public static Vector K0xfffa3942 = new Vector(0xfffa3942);
public static Vector K0x8771f681 = new Vector(0x8771f681);
public static Vector K0x6d9d6122 = new Vector(0x6d9d6122);
public static Vector K0xfde5380c = new Vector(0xfde5380c);
public static Vector K0xa4beea44 = new Vector(0xa4beea44);
public static Vector K0x4bdecfa9 = new Vector(0x4bdecfa9);
public static Vector K0xf6bb4b60 = new Vector(0xf6bb4b60);
public static Vector K0xbebfbc70 = new Vector(0xbebfbc70);
public static Vector K0x289b7ec6 = new Vector(0x289b7ec6);
public static Vector K0xeaa127fa = new Vector(0xeaa127fa);
public static Vector K0xd4ef3085 = new Vector(0xd4ef3085);
public static Vector K0x04881d05 = new Vector(0x04881d05);
public static Vector K0xd9d4d039 = new Vector(0xd9d4d039);
public static Vector K0xe6db99e5 = new Vector(0xe6db99e5);
public static Vector K0x1fa27cf8 = new Vector(0x1fa27cf8);
public static Vector K0xc4ac5665 = new Vector(0xc4ac5665);

public static Vector  K0xf4292244 = new Vector(0xf4292244);
public static Vector K0x432aff97 = new Vector(0x432aff97);
public static Vector K0xab9423a7 = new Vector(0xab9423a7);
public static Vector K0xfc93a039 = new Vector(0xfc93a039);
public static Vector K0x655b59c3 = new Vector(0x655b59c3);
public static Vector K0x8f0ccc92 = new Vector(0x8f0ccc92);
public static Vector K0xffeff47d = new Vector(0xffeff47d);
public static Vector K0x85845dd1 = new Vector(0x85845dd1);
public static Vector K0x6fa87e4f = new Vector(0x6fa87e4f);
public static Vector K0xfe2ce6e0 = new Vector(0xfe2ce6e0);
public static Vector K0xa3014314 = new Vector(0xa3014314);
public static Vector K0x4e0811a1 = new Vector(0x4e0811a1);
public static Vector K0xf7537e82 = new Vector(0xf7537e82);
public static Vector K0xbd3af235 = new Vector(0xbd3af235);
public static Vector K0x2ad7d2bb = new Vector(0x2ad7d2bb);
public static Vector K0xeb86d391 = new Vector(0xeb86d391);

public static Vector a = new Vector(0x67452301);
public static Vector b = new Vector(0xefcdab89);
public static Vector c = new Vector(0x98badcfe);
public static Vector d = new Vector(0x10325476);

public static int[] s = new int[64]
{
7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,
5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,
4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,
6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21
};

public static void md5round(Vector[] msg)
{
Vector A = new Vector(0x67452301);
Vector B = new Vector(0xefcdab89);
Vector C = new Vector(0x98badcfe);
Vector  D = new Vector(0x10325476);

step(F, ref A, ref B, ref C, ref D, msg[0], K0xd76aa478, s[0]);
step(F, ref D, ref A, ref B, ref C, msg[1], K0xe8c7b756, s[1]);
step(F, ref C, ref D, ref A, ref B, msg[2], K0x242070db, s[2]);
step(F, ref B, ref C, ref D, ref A, msg[3], K0xc1bdceee, s[3]);
step(F, ref A, ref B, ref C, ref D, msg[4], K0xf57c0faf, s[4]);
step(F, ref D, ref A, ref B, ref C, msg[5], K0x4787c62a, s[5]);
step(F, ref C, ref D, ref A, ref B, msg[6], K0xa8304613, s[6]);
step(F, ref B, ref C, ref D, ref A, msg[7], K0xfd469501, s[7]);
step(F, ref A, ref B, ref C, ref D, msg[8], K0x698098d8, s[8]);
step(F, ref D, ref A, ref B, ref C, msg[9], K0x8b44f7af, s[9]);
step(F, ref C, ref D, ref A, ref B, msg[10], K0xffff5bb1, s[10]);
step(F, ref B, ref C, ref D, ref A, msg[11], K0x895cd7be, s[11]);
step(F, ref A, ref B, ref C, ref D, msg[12], K0x6b901122, s[12]);
step(F, ref D, ref A, ref B, ref C, msg[13], K0xfd987193, s[13]);
step(F, ref C, ref D, ref A, ref B, msg[14], K0xa679438e, s[14]);
step(F, ref B, ref C, ref D, ref A, msg[15], K0x49b40821, s[15]);

step(G, ref A, ref B, ref C, ref D, msg[1], K0xf61e2562, s[16]);
step(G, ref D, ref A, ref B, ref C, msg[6], K0xc040b340, s[17]);
step(G, ref C, ref D, ref A, ref B, msg[11], K0x265e5a51, s[18]);
step(G, ref B, ref C, ref D, ref A, msg[0], K0xe9b6c7aa, s[19]);
step(G, ref A, ref B, ref C, ref D, msg[5], K0xd62f105d, s[20]);
step(G, ref D, ref A, ref B, ref C, msg[10], K0x02441453, s[21]);
step(G, ref C, ref D, ref A, ref B, msg[15], K0xd8a1e681, s[22]);
step(G, ref B, ref C, ref D, ref A, msg[4], K0xe7d3fbc8, s[23]);
step(G, ref A, ref B, ref C, ref D, msg[9], K0x21e1cde6, s[24]);
step(G, ref D, ref A, ref B, ref C, msg[14], K0xc33707d6, s[25]);
step(G, ref C, ref D, ref A, ref B, msg[3], K0xf4d50d87, s[26]);
step(G, ref B, ref C, ref D, ref A, msg[8], K0x455a14ed, s[27]);
step(G, ref A, ref B, ref C, ref D, msg[13], K0xa9e3e905, s[28]);
step(G, ref D, ref A, ref B, ref C, msg[2], K0xfcefa3f8, s[29]);
step(G, ref C, ref D, ref A, ref B, msg[7], K0x676f02d9, s[30]);
step(G, ref B, ref C, ref D, ref A, msg[12], K0x8d2a4c8a, s[31]);

step(H, ref A, ref B, ref C, ref D, msg[5], K0xfffa3942, s[32]);
step(H, ref D, ref A, ref B, ref C, msg[8], K0x8771f681, s[33]);
step(H, ref C, ref D, ref A, ref B, msg[11], K0x6d9d6122, s[34]);
step(H, ref B, ref C, ref D, ref A, msg[14], K0xfde5380c, s[35]);
step(H, ref A, ref B, ref C, ref D, msg[1], K0xa4beea44, s[36]);
step(H, ref D, ref A, ref B, ref C, msg[4], K0x4bdecfa9, s[37]);
step(H, ref C, ref D, ref A, ref B, msg[7], K0xf6bb4b60, s[38]);
step(H, ref B, ref C, ref D, ref A, msg[10], K0xbebfbc70, s[39]);
step(H, ref A, ref B, ref C, ref D, msg[13], K0x289b7ec6, s[40]);
step(H, ref D, ref A, ref B, ref C, msg[0], K0xeaa127fa, s[41]);
step(H, ref C, ref D, ref A, ref B, msg[3], K0xd4ef3085, s[42]);
step(H, ref B, ref C, ref D, ref A, msg[6], K0x04881d05, s[43]);
step(H, ref A, ref B, ref C, ref D, msg[9], K0xd9d4d039, s[44]);
step(H, ref D, ref A, ref B, ref C, msg[12], K0xe6db99e5, s[45]);
step(H, ref C, ref D, ref A, ref B, msg[15], K0x1fa27cf8, s[46]);
step(H, ref B, ref C, ref D, ref A, msg[2], K0xc4ac5665, s[47]);

step(I, ref A, ref B, ref C, ref D, msg[0], K0xf4292244, s[48]);
step(I, ref D, ref A, ref B, ref C, msg[7], K0x432aff97, s[49]);
step(I, ref C, ref D, ref A, ref B, msg[14], K0xab9423a7, s[50]);
step(I, ref B, ref C, ref D, ref A, msg[5], K0xfc93a039, s[51]);
step(I, ref A, ref B, ref C, ref D, msg[12], K0x655b59c3, s[52]);
step(I, ref D, ref A, ref B, ref C, msg[3], K0x8f0ccc92, s[53]);
step(I, ref C, ref D, ref A, ref B, msg[10], K0xffeff47d, s[54]);
step(I, ref B, ref C, ref D, ref A, msg[1], K0x85845dd1, s[55]);
step(I, ref A, ref B, ref C, ref D, msg[8], K0x6fa87e4f, s[56]);
step(I, ref D, ref A, ref B, ref C, msg[15], K0xfe2ce6e0, s[57]);
step(I, ref C, ref D, ref A, ref B, msg[6], K0xa3014314, s[58]);
step(I, ref B, ref C, ref D, ref A, msg[13], K0x4e0811a1,  s[59]);
step(I, ref A, ref B, ref C, ref D, msg[4], K0xf7537e82, s[60]);
step(I, ref D, ref A, ref B, ref C, msg[11], K0xbd3af235, s[61]);
step(I, ref C, ref D, ref A, ref B, msg[2], K0x2ad7d2bb, s[62]);
step(I, ref B, ref C, ref D, ref A, msg[9], K0xeb86d391, s[63]);

a = Vector.Add(a, A);
b = Vector.Add(b, B);
c = Vector.Add(c, C);
d = Vector.Add(d, D);

}

public static void step(Func f,
ref Vector a, ref Vector b, ref Vector c, ref Vector d, Vector x, Vector t, int s)
{
a = Vector.Add(a, f(b, c, d));
a = Vector.Add(a, x);
a = Vector.Add(a, t);

a = rotl(a, s);
a = Vector.Add(a, b);
}

public static Vector rotl(Vector x, int s)
{
uint rotatedValue = (x[0] > (32 - s));
return new Vector(rotatedValue);
}

public static Vector F(Vectorb, Vector c, Vector d)
{
Vector temp = Vector.BitwiseOr(Vector.BitwiseAnd(b, c), Vector.AndNot(b, d));
return temp;
}

public static Vector G(Vector b, Vector c, Vector d)
{
Vector temp = Vector.BitwiseOr(Vector.BitwiseAnd(d, b), Vector.AndNot(d, c));
return temp;
}

public static Vector H(Vector b, Vector c, Vector d)
{
Vector temp = Vector.Xor(b, Vector.Xor(c, d));
return temp;
}

public static Vector I(Vector b, Vector c, Vector d)
{
Vector temp = Vector.Xor(c, Vector.BitwiseOr(b, ~d));
return temp;
}

}
}
Я проверил константы K, все они такие же, как в стандарте MD5. Я проверил пошаговую функцию, но она тоже должна работать нормально. Я не знаю, в чем проблема.
Я реализовал на основе реализации SimonGoater: https://github.com/FastAsChuff/MD5-SIMD ... 5simdtest3 .c
Когда я устанавливаю все блоки сообщений на ноль, в основной функции код возвращает f420b6f76bf128bc8251435b7b28313d, который не является MD5-хешем печально известного нулевого ввода, d41d8cd98f00b204e9800998ecf8427e
Я не знаю, в чем проблема.

Подробнее здесь: https://stackoverflow.com/questions/792 ... rrect-hash
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»