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
Я не знаю, в чем проблема.
Я пытался реализовать md5 на C#, вот код: [code]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); }
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 void md5round(Vector[] msg) { Vector A = new Vector(0x67452301); Vector B = new Vector(0xefcdab89); Vector C = new Vector(0x98badcfe); Vector D = new Vector(0x10325476);
} } [/code] Я проверил константы K, все они такие же, как в стандарте MD5. Я проверил пошаговую функцию, но она тоже должна работать нормально. Я не знаю, в чем проблема. Я реализовал на основе реализации SimonGoater: https://github.com/FastAsChuff/MD5-SIMD-Test/blob/main/md5simdtest3 .c Когда я устанавливаю все блоки сообщений на ноль, в основной функции код возвращает f420b6f76bf128bc8251435b7b28313d, который не является MD5-хешем печально известного нулевого ввода, d41d8cd98f00b204e9800998ecf8427e Я не знаю, в чем проблема.