А в шестнадцатеричной системе счисления как отрицательные числа записываются? В смысле у них как и в десятичной знак ставится или у них какая - нибудь часть за знак отвечает?
Ни в коем случае знак не ставится. Это не очень легкий вопрос. Вот тут хорошая статья по этой теме. Ровно в середине рассказывается про отрицательные шестнадцатиричный числа.
Вот еще нашел по теме готовую программу. Только она на ассемблере Скачать: http://www.mestack.narod.ru/soft/set/MD5.RAR Скриншот: http://www.mestack.narod.ru/scr/MD5.JPG
Я реализовал этот алгоритм на C. Работает он так: берём нужный нам md5 хеш разбиваем его на 4 равные части, запускаем программу и вводим эти части начиная с правой. Например у нас есть хеш: d8578edf8458ce06fbc5bb76a58c5ca4 Делим его на 4 части: d8578edf 8458ce06 fbc5bb76 a58c5ca4 запускаем программу и вводим их в таком порядке: 1. a58c5ca4 2. fbc5bb76 3. 8458ce06 4. d8578edf программа выводит выравненное значение коллизии. Вот сам код: Code: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h> DWORD cycler(DWORD a, int s) { return (a>>s) | (a<<32-s); } DWORD F(DWORD x, DWORD y, DWORD z) { return ((x&y)|(~x&z)); } DWORD G(DWORD x, DWORD y, DWORD z) { return ((x&z)|(~z&y)); } DWORD H(DWORD x, DWORD y, DWORD z) { return (x^y^z); } DWORD I(DWORD x, DWORD y, DWORD z) { return (y^(~z|x)); } int main() { DWORD A, B, C, D; scanf("%x", &A); scanf("%x", &B); scanf("%x", &C); scanf("%x", &D); A-=0x01234567; B-=0x89abcdef; C-=0xfedcba98; D-=0x76543210; DWORD X[16]; int s[4]; int k[16]; k[0]=9; k[1]=2; k[2]=11; k[3]=4; k[4]=13; k[5]=6; k[6]=15; k[7]=8; k[8]=1; k[9]=10; k[10]=3; k[11]=12; k[12]=5; k[13]=14; k[14]=7; k[15]=0; s[0]=21; s[1]=15; s[2]=10; s[3]=6; int i; DWORD T[64]; for(i=0;i<64;i++) T[i]=(unsigned long)(4294967296*fabs(sin(i+1))); int r=0; //Round 4 for(i=0;i<16;i++,r++) { if(r==0) { X[k[i]] = cycler((B-C),s[r])-(I(C,D,A)+T[63-i]); B=0x00000000; } if(r==1) { X[k[i]] = cycler((C-D),s[r])-(I(D,A,B)+T[63-i]); C=0x00000000; } if(r==2) { X[k[i]] = cycler((D-A),s[r])-(I(A,B,C)+T[63-i]); D=0x00000000; } if(r==3) { X[k[i]] = cycler((A-B),s[r])-(I(B,C,D)+T[63-i]); A=0x00000000; r=-1; } } s[0]=23; s[1]=16; s[2]=11; s[3]=4; k[0]=2; k[1]=15; k[2]=12; k[3]=9; k[4]=6; k[5]=3; k[6]=0; k[7]=13; k[8]=10; k[9]=7; k[10]=4; k[11]=1; k[12]=14; k[13]=11; k[14]=8; k[15]=5; //Round 3 for(i=0, r=0;i<16;i++,r++) { if(r==0) { X[k[i]] = cycler((B-C),s[r])-(H(C,D,A)+T[47-i]); B=0x00000000; } if(r==1) { X[k[i]] = cycler((C-D),s[r])-(H(D,A,B)+T[47-i]); C=0x00000000; } if(r==2) { X[k[i]] = cycler((D-A),s[r])-(H(A,B,C)+T[47-i]); D=0x00000000; } if(r==3) { X[k[i]] = cycler((A-B),s[r])-(H(B,C,D)+T[47-i]); A=0x00000000; r=-1; } } s[0]=20; s[1]=14; s[2]=9; s[3]=5; k[0]=12; k[1]=7; k[2]=2; k[3]=13; k[4]=8; k[5]=3; k[6]=14; k[7]=9; k[8]=4; k[9]=15; k[10]=10; k[11]=5; k[12]=0; k[13]=11; k[14]=6; k[15]=1; //Round 2 for(i=0, r=0;i<16;i++,r++) { if(r==0) { X[k[i]] = cycler((B-C),s[r])-(G(C,D,A)+T[31-i]); B=0x00000000; } if(r==1) { X[k[i]] = cycler((C-D),s[r])-(G(D,A,B)+T[31-i]); C=0x00000000; } if(r==2) { X[k[i]] = cycler((D-A),s[r])-(G(A,B,C)+T[31-i]); D=0x00000000; } if(r==3) { X[k[i]] = cycler((A-B),s[r])-(G(B,C,D)+T[31-i]); A=0x00000000; r=-1; } } s[0]=22; s[1]=17; s[2]=12; s[3]=7; //Round 1 X[15]=0x00000080; X[14]=0x00000000; B = cycler((B-C),s[0])-(F(C,D,A)+T[15])-X[15]; C = cycler((C-D),s[1])-(F(D,A,B)+T[14])-X[14]; for(i=13, r=2;i>4;i--) { X[i]=0x00000000; if(r==0) B = cycler((B-C),s[r])-(F(C,D,A)+T[i])-X[i]; if(r==1) C = cycler((C-D),s[r])-(F(D,A,B)+T[i])-X[i]; if(r==2) D = cycler((D-A),s[r])-(F(A,B,C)+T[i])-X[i]; if(r==3) A = cycler((A-B),s[r])-(F(B,C,D)+T[i])-X[i]; } X[4]=0x10000000; A = cycler((A-B),s[3])-(F(B,C,D)+T[4])-X[4]; for(i=0;i<4;i++) { DWORD An, Bn, Cn, Dn; if(i==0) { Bn=0x89abcdef; X[3-i] = cycler((B-C),s[r])-(F(C,D,A)+T[i])-Bn; B=Bn; } if(i==1) { Cn=0xfedcba98; X[3-i] = cycler((C-D),s[r])-(F(D,A,B)+T[i])-Cn; C=Cn; } if(i==2) { Dn=0x76543210; X[3-i] = cycler((D-A),s[r])-(F(A,B,C)+T[i])-Dn; D=Dn; } if(i==3) { An=0x01234567; X[3-i] = cycler((A-B),s[r])-(F(B,C,D)+T[i])-An; A=An; } } // Printing result for(i=0;i<16;i++) printf("%x", X[i]); printf("\n"); system("PAUSE"); return 0; } P.S Код довольно кривой. К тому же его можно сократить раза в два. И я пока не понял правильно она работает или нет.