CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 1 of 1
  1. #1
    Join Date
    Oct 2010
    Posts
    60

    Question MD5 Generator not working.

    I'm trying to write an MD5 generator (for integrity checks, not actual hashing), but it doesn't seem to be working right. And it only operates on a 512-bit chunk, for now. Hashing the empty string should get d41d8cd98f00b204e9800998ecf8427e, but instead I get a9e8a4dad18c439323fdd27947ce0fc7. The only thing I can think it would be is either an error in the k array or some business with endians. Since I've double checked k, and it seems to be correct, I'm thinking it's the latter, but I can't spot it for the life of me. What am I doing wrong? EDIT: checked k-values with the floor(abs(sin(i + 1)) * pow(2, 32)), and all are correct.

    Header:
    Code:
    #ifndef MD5_H_
    #define MD5_H_
    
    #include <stdint.h>
    #include <stdio.h>
    
    const int md5_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
    };
    
    const uint32_t md5_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
    };
    
    const uint32_t md5_h[4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
    
    int main(int argc, char** argv);
    void hashMD5(uint32_t password [], uint32_t hash[16]);
    uint32_t leftrotate(uint32_t x, int c);
    
    #endif
    Source:
    Code:
    #include "md5.h"
    
    int main(int argc, char** argv)
    {
    	uint32_t str [] = {
    			0x800000, 0x000000, 0x000000, 0x000000,
    			0x000000, 0x000000, 0x000000, 0x000000,
    			0x000000, 0x000000, 0x000000, 0x000000,
    			0x000000, 0x000000, 0x000000, 0x000000
    	};
    
    	uint32_t hash [4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
    
    	hashMD5(str, hash);
    }
    
    void hashMD5(uint32_t password[], uint32_t hash[4])
    {
    	uint32_t a = hash[0];
    	uint32_t b = hash[1];
    	uint32_t c = hash[2];
    	uint32_t d = hash[3];
    
    	uint32_t f, g;
    
    	for(int i = 0; i < 64; i++)
    	{
    		if(i < 16)
    		{
    			f = (b & c) | (~b & d);
    			g = i;
    		}
    		else if(i < 32)
    		{
    			f = (d & b) | (~d & c);
    			g = (5 * i + 1) % 16;
    		}
    		else if(i < 48)
    		{
    			f = b ^ c ^ d;
    			g = (3 * i + 5) % 16;
    		}
    		else
    		{
    			f = c ^ (b | ~d);
    			g = (7 * i) % 16;
    		}
    		uint32_t temp = d;
    		d = c;
    		c = b;
    		b = b + leftrotate(a + f + md5_k[i] + password[g], md5_r[i]);
    		a = temp;
    	}
    
    	hash[0] += a;
    	hash[1] += b;
    	hash[2] += c;
    	hash[3] += d;
    
    	printf("a: %x, b: %x, c: %x, d: %x, all: %x%x%x%x\n",
    			hash[0], hash[1], hash[2], hash[3],
    			hash[0], hash[1], hash[2], hash[3]);
    }
    
    uint32_t leftrotate(uint32_t x, int c)
    {
    	return (x << c) | (x >> (32 - c));
    }
    Last edited by henryswanson; March 15th, 2012 at 09:38 PM.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured