Главная
Поиск
Карта сайта
Форум
Все страницы
Главное меню
Главная
Стандартный C++
Borland C++ 3.1
Borland C++ Builder
Учебник C++
Скачать программы
Гостевая
Форум
Учебник по созданию игр
Авторизация
Логин
Пароль
Запомнить меня
Забыли пароль?
Забыли логин?
Счетчики
Обмен ссылками
Блог программиста
Главная
Форум
Реализация хеш-функци...
Форум
Список форумов
Последние сообщения
Добро пожаловать Гость
[Зарегистрироваться]
Войти
Ответить
Тема :Реализация хеш-функции MD5..
15-05-2010 04:39:07
rudolf
char
Онлайн с
: 24-02-2010 11:03:24
Сообщения
: 31
Среда обитания
:
0
Пытаюсь реализовать хеш-функцию 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
Среда обитания
:
0
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
Среда обитания
:
0
Вот исходник моей программы.
Captain, пожалуйста, гляньте, что тут не так.
Прикрепленные файлы
hash.zip [898 KB]
::
IP сохранен
Последний раз редактировалось: 15-05-2010 04:38:17 Автор rudolf т.к.
Цитировать
Ответить
Страница #
5
10
15
20
25
30
50
100
Все
Powered by
ccBoard