Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Can anyone explain me md5 in detail?

Status
Not open for further replies.

mosfets.bjt

Junior Member level 3
Joined
Sep 25, 2007
Messages
27
Helped
2
Reputation
4
Reaction score
2
Trophy points
1,283
Activity points
1,605
hi,

i need a detailed explaination of how md5 algorithm works,

kindly post any links to authors site, i have already read a lot of explaination about it,

there is some confusion which i dont know is present in my mind because i tried the it to code in C myself but could'nt get the correct encrypted md5 value. my code tries to encrypt md5 has of the word "wix"(without quotes, lowercase, no spaces).
plz tell me the error in my code or PLZ explain how to encrypt data using md5 algorithm.

also plz tell what would be the bit representation of "wix" that we will use in md5 algorithm??


my C code is below



#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>



#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
void main()
{

unsigned long int A = 0x67452301;
unsigned long int B = 0xEFCDAB89; //inititialize the buffer
unsigned long int C = 0x98BADCFE;
unsigned long int D = 0x10325476;
long int x;

unsigned long int temp_A;
unsigned long int temp_B;
unsigned long int temp_C;
unsigned long int temp_D;

unsigned long int T[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, 0x699d6122, 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}; // non linear matrix
int i;

unsigned long int X[16] = {0x80786977,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18000000};

printf("enter ABCD, ENTER 1 TO USE DEFAULT VALUES, ENTER 2 FOR NEW VALUES ");
scanf("%d",&x);


if(x == 1)
{
temp_A = A;
temp_B = B;
temp_C = C;
temp_D = D;
}
else if(x == 2)
{
printf("A = ?\n");
scanf("%x",&temp_A);

printf("B = ?\n");
scanf("%x",&temp_B);

printf("C = ?\n");
scanf("%x",&temp_C);

printf("D = ?\n");
scanf("%x",&temp_D);
}




//--------------------------------------------------------------------------
//round 1
//--------------------------------------------------------------------------

temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + F(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[0]) & 0xFFFFFFFF) + T[1-1]) & 0xFFFFFFFF),7)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + F(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[1]) & 0xFFFFFFFF) + T[2-1]) & 0xFFFFFFFF),12)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + F(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[2]) & 0xFFFFFFFF) + T[3-1]) & 0xFFFFFFFF),17)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + F(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[3]) & 0xFFFFFFFF) + T[4-1]) & 0xFFFFFFFF),22)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + F(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[4]) & 0xFFFFFFFF) + T[5-1]) & 0xFFFFFFFF),7)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + F(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[5]) & 0xFFFFFFFF) + T[6-1]) & 0xFFFFFFFF),12)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + F(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[6]) & 0xFFFFFFFF) + T[7-1]) & 0xFFFFFFFF),17)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + F(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[7]) & 0xFFFFFFFF) + T[8-1]) & 0xFFFFFFFF),22)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + F(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[8]) & 0xFFFFFFFF) + T[9-1]) & 0xFFFFFFFF),7)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + F(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[9]) & 0xFFFFFFFF) + T[10-1]) & 0xFFFFFFFF),12)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + F(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[10]) & 0xFFFFFFFF) + T[11-1]) & 0xFFFFFFFF),17)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + F(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[11]) & 0xFFFFFFFF) + T[12-1]) & 0xFFFFFFFF),22)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + F(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[12]) & 0xFFFFFFFF) + T[13-1]) & 0xFFFFFFFF),7)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + F(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[13]) & 0xFFFFFFFF) + T[14-1]) & 0xFFFFFFFF),12)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + F(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[14]) & 0xFFFFFFFF) + T[15-1]) & 0xFFFFFFFF),17)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + F(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[15]) & 0xFFFFFFFF) + T[16-1]) & 0xFFFFFFFF),22)) & 0xFFFFFFFF);



printf("\n\n--------------After round 1------------------\n\n");

printf("\n\nA = %x\n",temp_A);
printf("B = %x\n",temp_B);
printf("C = %x\n",temp_C);
printf("D = %x\n",temp_D);

//--------------------------------------------------------------------------
//round 2
//--------------------------------------------------------------------------

temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + G(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[1]) & 0xFFFFFFFF) + T[17-1]) & 0xFFFFFFFF),5)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + G(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[6]) & 0xFFFFFFFF) + T[18-1]) & 0xFFFFFFFF),9)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + G(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[11]) & 0xFFFFFFFF) + T[19-1]) & 0xFFFFFFFF),14)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + G(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[0]) & 0xFFFFFFFF) + T[20-1]) & 0xFFFFFFFF),20)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + G(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[5]) & 0xFFFFFFFF) + T[21-1]) & 0xFFFFFFFF),5)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + G(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[10]) & 0xFFFFFFFF) + T[22-1]) & 0xFFFFFFFF),9)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + G(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[15]) & 0xFFFFFFFF) + T[23-1]) & 0xFFFFFFFF),14)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + G(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[4]) & 0xFFFFFFFF) + T[24-1]) & 0xFFFFFFFF),20)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + G(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[9]) & 0xFFFFFFFF) + T[25-1]) & 0xFFFFFFFF),5)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + G(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[14]) & 0xFFFFFFFF) + T[26-1]) & 0xFFFFFFFF),9)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + G(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[3]) & 0xFFFFFFFF) + T[27-1]) & 0xFFFFFFFF),14)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + G(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[8]) & 0xFFFFFFFF) + T[28-1]) & 0xFFFFFFFF),20)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + G(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[13]) & 0xFFFFFFFF) + T[29-1]) & 0xFFFFFFFF),5)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + G(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[2]) & 0xFFFFFFFF) + T[30-1]) & 0xFFFFFFFF),9)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + G(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[7]) & 0xFFFFFFFF) + T[31-1]) & 0xFFFFFFFF),14)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + G(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[12]) & 0xFFFFFFFF) + T[32-1]) & 0xFFFFFFFF),20)) & 0xFFFFFFFF);



printf("\n\n--------------After round 2------------------\n\n");

printf("\n\nA = %x\n",temp_A);
printf("B = %x\n",temp_B);
printf("C = %x\n",temp_C);
printf("D = %x\n",temp_D);


//--------------------------------------------------------------------------
//round 3
//--------------------------------------------------------------------------


temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + H(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[5]) & 0xFFFFFFFF) + T[33-1]) & 0xFFFFFFFF),4)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + H(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[8]) & 0xFFFFFFFF) + T[34-1]) & 0xFFFFFFFF),11)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + H(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[11]) & 0xFFFFFFFF) + T[35-1]) & 0xFFFFFFFF),16)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + H(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[14]) & 0xFFFFFFFF) + T[36-1]) & 0xFFFFFFFF),23)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + H(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[1]) & 0xFFFFFFFF) + T[37-1]) & 0xFFFFFFFF),4)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + H(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[4]) & 0xFFFFFFFF) + T[38-1]) & 0xFFFFFFFF),11)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + H(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[7]) & 0xFFFFFFFF) + T[39-1]) & 0xFFFFFFFF),16)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + H(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[10]) & 0xFFFFFFFF) + T[40-1]) & 0xFFFFFFFF),23)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + H(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[13]) & 0xFFFFFFFF) + T[41-1]) & 0xFFFFFFFF),4)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + H(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[0]) & 0xFFFFFFFF) + T[42-1]) & 0xFFFFFFFF),11)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + H(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[3]) & 0xFFFFFFFF) + T[43-1]) & 0xFFFFFFFF),16)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + H(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[6]) & 0xFFFFFFFF) + T[44-1]) & 0xFFFFFFFF),23)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + H(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[9]) & 0xFFFFFFFF) + T[45-1]) & 0xFFFFFFFF),4)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + H(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[12]) & 0xFFFFFFFF) + T[46-1]) & 0xFFFFFFFF),11)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + H(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[15]) & 0xFFFFFFFF) + T[47-1]) & 0xFFFFFFFF),16)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + H(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[2]) & 0xFFFFFFFF) + T[48-1]) & 0xFFFFFFFF),23)) & 0xFFFFFFFF);



printf("\n\n--------------After round 3------------------\n\n");

printf("\n\nA = %x\n",temp_A);
printf("B = %x\n",temp_B);
printf("C = %x\n",temp_C);
printf("D = %x\n",temp_D);


//--------------------------------------------------------------------------
//round 4
//--------------------------------------------------------------------------


temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + I(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[0]) & 0xFFFFFFFF) + T[49-1]) & 0xFFFFFFFF),6)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + I(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[7]) & 0xFFFFFFFF) + T[50-1]) & 0xFFFFFFFF),10)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + I(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[14]) & 0xFFFFFFFF) + T[51-1]) & 0xFFFFFFFF),15)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + I(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[5]) & 0xFFFFFFFF) + T[52-1]) & 0xFFFFFFFF),21)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + I(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[12]) & 0xFFFFFFFF) + T[53-1]) & 0xFFFFFFFF),6)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + I(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[3]) & 0xFFFFFFFF) + T[54-1]) & 0xFFFFFFFF),10)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + I(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[10]) & 0xFFFFFFFF) + T[55-1]) & 0xFFFFFFFF),15)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + I(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[1]) & 0xFFFFFFFF) + T[56-1]) & 0xFFFFFFFF),21)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + I(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[8]) & 0xFFFFFFFF) + T[57-1]) & 0xFFFFFFFF),6)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + I(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[15]) & 0xFFFFFFFF) + T[58-1]) & 0xFFFFFFFF),10)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + I(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[6]) & 0xFFFFFFFF) + T[59-1]) & 0xFFFFFFFF),15)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + I(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[13]) & 0xFFFFFFFF) + T[60-1]) & 0xFFFFFFFF),21)) & 0xFFFFFFFF);
temp_A = ((temp_B + ROTATE_LEFT(((((((temp_A + I(temp_B,temp_C,temp_D)) & 0xFFFFFFFF) + X[4]) & 0xFFFFFFFF) + T[61-1]) & 0xFFFFFFFF),6)) & 0xFFFFFFFF);
temp_D = ((temp_A + ROTATE_LEFT(((((((temp_D + I(temp_A,temp_B,temp_C)) & 0xFFFFFFFF) + X[11]) & 0xFFFFFFFF) + T[62-1]) & 0xFFFFFFFF),10)) & 0xFFFFFFFF);
temp_C = ((temp_D + ROTATE_LEFT(((((((temp_C + I(temp_D,temp_A,temp_B)) & 0xFFFFFFFF) + X[2]) & 0xFFFFFFFF) + T[63-1]) & 0xFFFFFFFF),15)) & 0xFFFFFFFF);
temp_B = ((temp_C + ROTATE_LEFT(((((((temp_B + I(temp_C,temp_D,temp_A)) & 0xFFFFFFFF) + X[9]) & 0xFFFFFFFF) + T[64-1]) & 0xFFFFFFFF),21)) & 0xFFFFFFFF);



printf("\n\n--------------After round 4------------------\n\n");

printf("\n\nA = %x\n",temp_A);
printf("B = %x\n",temp_B);
printf("C = %x\n",temp_C);
printf("D = %x\n",temp_D);


A = ((A + temp_A) & 0xFFFFFFFF);
B = ((B + temp_B) & 0xFFFFFFFF);
C = ((C + temp_C) & 0xFFFFFFFF);
D = ((D + temp_D) & 0xFFFFFFFF);


printf("\n\n--------------final------------------\n\n");

printf("\n\nA = %x\n",A);
printf("B = %x\n",B);
printf("C = %x\n",C);
printf("D = %x\n",D);



printf("md5: %x%x%x%x\n",A,B,C,D);

}
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top