Авторизация



Счетчики

Обмен ссылками

Блог программиста
Главная Форум Реализация хеш-функци...
 Форум
Добро пожаловать Гость   [Зарегистрироваться]  Войти
Ответить
 Тема :Реализация хеш-функции MD5.. 15-05-2010 04:39:07 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Пытаюсь реализовать хеш-функцию MD5 по алгоритму, приведенному в болтшинстве источников.
Написал хеш функцию, но она не работает, т.е. работает, но не правильно(выдает неверный хеш-код).

Алгоритм можно глянуть на википедии: http://ru.wikipedia.org/wiki/MD5 и в прекрепленном файле.

вот мой код:

Unit1.h
Code:
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TEdit *Edit1; TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; String GetHash(String inStr); __int64 F(__int64 X,__int64 Y,__int64 Z); __int64 G(__int64 X,__int64 Y,__int64 Z); __int64 H(__int64 X,__int64 Y,__int64 Z); __int64 I(__int64 X,__int64 Y,__int64 Z); //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif


Прикрепленные файлы
 md5.zip [549 KB] ::
IP сохранен
Последний раз редактировалось: 15-05-2010 04:39:07 Автор rudolf т.к.
Цитировать
 Тема :Re:Реализация хеш-функции MD5.. 15-05-2010 04:36:09 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Unit1.cpp
Code:
//--------------------------------------------------------------------------- #include <vcl.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- String GetHash(String inStr) { int length=inStr.Length(); int rests=length%64; int size=0; if(rests < 56) { size=length-rests+56+8; } else { size=length+64-rests+56+8; } unsigned char *inChar=new unsigned char[size]; for(int i=0;i<length;i++) { inChar[i]=inStr[i+1]; } inChar[length]=128; for(int i=length+1;i<size;i++) { inChar[i]=0; } //Step2 unsigned long lengthBit=(unsigned long)length*8; unsigned char bits[8]; for(int i=0;i<8;i++) { bits[i]=(lengthBit >> i*8) & 0xFF; inChar[size-8+i]=bits[i]; } //Step3 __int64 A=0x67452301, B=0xefcdab89, C=0x98badcfe, D=0x10325476; int T[64]; for(int i=0;i<64;i++) { T[i]=pow(2,32)*fabs(sin(i)); } __int32 X[16]; for(int i=0;i<16;i++) { X[i]=inChar[i]|inChar[i+1]<<8|inChar[i+2]<<16|inChar[i+3]<<24; } //Step4 __int64 AA,BB,CC,DD; AA=A; BB=B; CC=C; DD=D; //Раунд1: A=B + ((A + F(B,C,D) + X[0] + T[0]) << 7); D=A + ((D + F(A,B,C) + X[1] + T[1]) << 12); C=D + ((C + F(D,A,B) + X[2] + T[2]) << 17); B=C + ((B + F(C,D,A) + X[3] + T[3]) << 22); A=B + ((A + F(B,C,D) + X[4] + T[4]) << 7); D=A + ((D + F(A,B,C) + X[5] + T[5]) << 12); C=D + ((C + F(D,A,B) + X[6] + T[6]) << 17); B=C + ((B + F(C,D,A) + X[7] + T[7]) << 22); A=B + ((A + F(B,C,D) + X[8] + T[8]) << 7); D=A + ((D + F(A,B,C) + X[9] + T[9]) << 12); C=D + ((C + F(D,A,B) + X[10] + T[10]) << 17); B=C + ((B + F(C,D,A) + X[11] + T[11]) << 22); A=B + ((A + F(B,C,D) + X[12] + T[12]) << 7); D=A + ((D + F(A,B,C) + X[13] + T[13]) << 12); C=D + ((C + F(D,A,B) + X[14] + T[14]) << 17); B=C + ((B + F(C,D,A) + X[15] + T[15]) << 22); //Раунд2 A=B + ((A + G(B,C,D) + X[1] + T[16]) << 5); D=A + ((D + G(A,B,C) + X[6] + T[17]) << 9); C=D + ((C + G(D,A,B) + X[11] + T[18]) << 14); B=C + ((B + G(C,D,A) + X[0] + T[19]) << 20); A=B + ((A + G(B,C,D) + X[5] + T[20]) << 5); D=A + ((D + G(A,B,C) + X[10] + T[21]) << 9); C=D + ((C + G(D,A,B) + X[15] + T[22]) << 14); B=C + ((B + G(C,D,A) + X[4] + T[23]) << 20); A=B + ((A + G(B,C,D) + X[9] + T[24]) << 5); D=A + ((D + G(A,B,C) + X[14] + T[25]) << 9); C=D + ((C + G(D,A,B) + X[3] + T[26]) << 14); B=C + ((B + G(C,D,A) + X[8] + T[27]) << 20); A=B + ((A + G(B,C,D) + X[13] + T[28]) << 5); D=A + ((D + G(A,B,C) + X[2] + T[29]) << 9); C=D + ((C + G(D,A,B) + X[7] + T[30]) << 14); B=C + ((B + G(C,D,A) + X[12] + T[31]) << 20); //Раунд3 A=B + ((A + H(B,C,D) + X[5] + T[32]) << 4); D=A + ((D + H(A,B,C) + X[8] + T[33]) << 11); C=D + ((C + H(D,A,B) + X[11] + T[34]) << 16); B=C + ((B + H(C,D,A) + X[14] + T[35]) << 23); A=B + ((A + H(B,C,D) + X[1] + T[36]) << 4); D=A + ((D + H(A,B,C) + X[4] + T[37]) << 11); C=D + ((C + H(D,A,B) + X[7] + T[38]) << 16); B=C + ((B + H(C,D,A) + X[10] + T[39]) << 23); A=B + ((A + H(B,C,D) + X[13] + T[40]) << 4); D=A + ((D + H(A,B,C) + X[0] + T[41]) << 11); C=D + ((C + H(D,A,B) + X[3] + T[42]) << 16); B=C + ((B + H(C,D,A) + X[6] + T[43]) << 23); A=B + ((A + H(B,C,D) + X[9] + T[44]) << 4); D=A + ((D + H(A,B,C) + X[12] + T[45]) << 11); C=D + ((C + H(D,A,B) + X[15] + T[46]) << 16); B=C + ((B + H(C,D,A) + X[2] + T[47]) << 23); //Раунд4 A=B + ((A + H(B,C,D) + X[0] + T[48]) << 6); D=A + ((D + H(A,B,C) + X[7] + T[49]) << 10); C=D + ((C + H(D,A,B) + X[14] + T[50]) << 15); B=C + ((B + H(C,D,A) + X[5] + T[51]) << 21); A=B + ((A + H(B,C,D) + X[12] + T[52]) << 6); D=A + ((D + H(A,B,C) + X[3] + T[53]) << 10); C=D + ((C + H(D,A,B) + X[10] + T[54]) << 15); B=C + ((B + H(C,D,A) + X[1] + T[55]) << 21); A=B + ((A + H(B,C,D) + X[8] + T[56]) << 6); D=A + ((D + H(A,B,C) + X[15] + T[57]) << 10); C=D + ((C + H(D,A,B) + X[6] + T[58]) << 15); B=C + ((B + H(C,D,A) + X[13] + T[59]) << 21); A=B + ((A + H(B,C,D) + X[4] + T[60]) << 6); D=A + ((D + H(A,B,C) + X[11] + T[61]) << 10); C=D + ((C + H(D,A,B) + X[2] + T[62]) << 15); B=C + ((B + H(C,D,A) + X[9] + T[63]) << 21); A=AA + A; B=BB + B; C=CC + C; D=DD + D; //Step5 String out; out+=IntToHex(A,0)+IntToHex(B,0)+IntToHex(C,0)+IntToHex(D,0); return out; } //---------------------------------------------------------- __int64 F(__int64 X,__int64 Y,__int64 Z) { return ((X & Y) | (~ X & Z)); } __int64 G(__int64 X,__int64 Y,__int64 Z) { return ((X & Z) | (Y & ~ Z)); } __int64 H(__int64 X,__int64 Y,__int64 Z) { return (X ^ Y ^ Z); } __int64 I(__int64 X,__int64 Y,__int64 Z) { return (Y ^ (X | ~ Z)); } void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage(GetHash(Edit1->Text)); Button1->Caption=IntToStr(GetHash(Edit1->Text).Length()); } //---------------------------------------------------------------------------
IP сохранен
Цитировать
 Тема :Re:Реализация хеш-функции MD5.. 15-05-2010 04:38:17 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Вот исходник моей программы.


Captain, пожалуйста, гляньте, что тут не так.

Прикрепленные файлы
 hash.zip [898 KB] ::
IP сохранен
Последний раз редактировалось: 15-05-2010 04:38:17 Автор rudolf т.к.
Цитировать
Ответить
Страница # 


Powered by ccBoard