MD5 Hashing

I'm working on implementing the MD5 hash. I basically just took the pseudocode from wikipedia (https://en.wikipedia.org/wiki/MD5) and converted it to C++. I don't have the padding part added yet -- I just have it hardcoded like the message is an empty string. However, the digest for the empty string should be d41d8cd98f00b204e9800998ecf8427e. I am getting 227b7f48d21283f63bc9bbc15b44ea1a. What could the problem be?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <iomanip>
using namespace std;

unsigned int rotateL(unsigned int x, int n)
{
    return ((x) << n) | ((x) >> (32 - n));
}

int main()
{
	// per-round shift amounts
	unsigned int r[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};
	
	// binary integer part of the sines of integers (Radians) as constants
	unsigned int k[64] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee
	    				 ,0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501
	        			 ,0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be
	        			 ,0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821
	       				 ,0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa
	        			 ,0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8
	        			 ,0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed
				         ,0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a
				         ,0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c
				         ,0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70
				         ,0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05
				         ,0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665
				         ,0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039
				         ,0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1
				         ,0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1
				         ,0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };
	
	//Initialize Vars
	unsigned int a = 0x67452301;
	unsigned int b = 0xefcdab89;
	unsigned int c = 0x98badcfe;
	unsigned int d = 0x10325476;
	
	// TODO: append single 1 bit
	
	// TODO: pad with 0's until message length is 448 bits
	
	// message hard coded for empty string
	// for empty string, m = 1000... and so on, for 512 bits total. 
	unsigned int m[16] = {0x80000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	    				 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
	    				 
		
	//Make a copy of above
	unsigned int A = a;
	unsigned int B = b;
	unsigned int C = c;
	unsigned int D = d;
	
	int F;	
	int g;
	for(int i = 0; i <= 63; i++)
	{
		if(i >= 0 && i <= 15)
		{
	   		F = (B & C) | ((~B) & D);
	    	g = i;
		}
		else if(i >= 16 && i <= 31)
		{
			F = (D & B) | ((~D) & C);
			g = (5*i + 1)% 16;	
		}
		else if(i >= 32 && i <= 47)
		{
			F = B ^ C ^ D;
			g = (3*i + 5) % 16;
		}
		else if(i >= 48 && i <= 63)
		{
			F = C ^ (B | (~D));
			g = (7*i) % 16;
		}
		
		int dTemp = D;
		D = C;
		C = B;
		B = B + rotateL((A + F + k[i] + m[g]), r[i]);
		A = dTemp;
	}
	
	a += A;
	b += B;
	c += C;
	d += D;
	
	cout << "Digest: " << 
	hex << a << 
	hex << b << 
	hex << c << 
	hex << d << endl;
	
	return 0;
}
Last edited on
Topic archived. No new replies allowed.