MD5 с 128 битным ключом везде валяется: c+h файл. На всякий случай кидаю.
Прикол в том, что он был портирован на Delphi, а мне пришлось портировать
назад в cpp ;) . Выглядит чуть красивее чем на "C", который изобилует
вложеными макросами и прочей требухой.
.h
---------
#ifndef _MD5_h
#define _MD5_h
#include <windows.h> // для типов BYTE, DWORD, WORD
#include <string>
using namespace std;
typedef BYTE TMD5Byte64[64];
typedef BYTE TMD5Byte16[16];
typedef DWORD TMD5Int16[16];
typedef DWORD TMD5Int4[4];
typedef DWORD TMD5Int2[2];
typedef DWORD TLongWordBuf[16];
typedef BYTE TByteBuf[64];
typedef DWORD TDigestLongWord[4];
struct TMD5Ctx
{
TMD5Int4 State;
TMD5Int2 Count;
TMD5Byte64 Buffer;
DWORD BLen;
};
//prototypes
string MD5Result(string st);
void xCalcMD5(void* Input, int InputLen, TMD5Byte16 Digest);
void MD5Init(TMD5Ctx& Context);
void MD5Update(TMD5Ctx& Context, const void* ChkBuf, DWORD Len);
void MD5Final(TMD5Byte16 Digest, TMD5Ctx& Context);
#endif
--------
.cpp
--------
#include "MD5.h"
#include <stdio.h>
// ---------------------------------------------
inline DWORD ROL(DWORD x, DWORD n)
{
return ((x << n) | (x >> (32-n)));
}
// ---------------------------------------------
inline void FF(DWORD& a, DWORD b, DWORD c, DWORD d, DWORD x, DWORD s, DWORD ac)
{
a = ROL(a+x+ac + ((b & c) | ((~b) & d)), s) + b;
}
// ---------------------------------------------
inline void GG(DWORD& a, DWORD b, DWORD c, DWORD d, DWORD x, DWORD s, DWORD ac)
{
a = ROL(a+x+ac + (b & d | c & ~d), s) + b;
}
// ---------------------------------------------
inline void HH(DWORD& a, DWORD b, DWORD c, DWORD d, DWORD x, DWORD s, DWORD ac)
{
a = ROL(a+x+ac + (b^c^d), s) + b;
}
// ---------------------------------------------
inline void II(DWORD& a, DWORD b, DWORD c, DWORD d, DWORD x, DWORD s, DWORD ac)
{
a = ROL(a+x+ac + (c ^ (b | ~d)), s) + b;
}
// ---------------------------------------------
void Transform (void* Accu, const void* Buf)
{
DWORD* lAccu = (DWORD*)Accu;
DWORD* lBuf = (DWORD*)Buf;
DWORD a = lAccu[0];
DWORD b = lAccu[1];
DWORD c = lAccu[2];
DWORD d = lAccu[3];
//
FF( a, b, c, d, lBuf[ 0], 7, 3614090360);
FF( d, a, b, c, lBuf[ 1], 12, 3905402710);
FF( c, d, a, b, lBuf[ 2], 17, 606105819);
FF( b, c, d, a, lBuf[ 3], 22, 3250441966);
FF( a, b, c, d, lBuf[ 4], 7, 4118548399);
FF( d, a, b, c, lBuf[ 5], 12, 1200080426);
FF( c, d, a, b, lBuf[ 6], 17, 2821735955);
FF( b, c, d, a, lBuf[ 7], 22, 4249261313);
FF( a, b, c, d, lBuf[ 8], 7, 1770035416);
FF( d, a, b, c, lBuf[ 9], 12, 2336552879);
FF( c, d, a, b, lBuf[10], 17, 4294925233);
FF( b, c, d, a, lBuf[11], 22, 2304563134);
FF( a, b, c, d, lBuf[12], 7, 1804603682);
FF( d, a, b, c, lBuf[13], 12, 4254626195);
FF( c, d, a, b, lBuf[14], 17, 2792965006);
FF( b, c, d, a, lBuf[15], 22, 1236535329);
GG( a, b, c, d, lBuf[ 1], 5, 4129170786);
GG( d, a, b, c, lBuf[ 6], 9, 3225465664);
GG( c, d, a, b, lBuf[11], 14, 643717713);
GG( b, c, d, a, lBuf[ 0], 20, 3921069994);
GG( a, b, c, d, lBuf[ 5], 5, 3593408605);
GG( d, a, b, c, lBuf[10], 9, 38016083);
GG( c, d, a, b, lBuf[15], 14, 3634488961);
GG( b, c, d, a, lBuf[ 4], 20, 3889429448);
GG( a, b, c, d, lBuf[ 9], 5, 568446438);
GG( d, a, b, c, lBuf[14], 9, 3275163606);
GG( c, d, a, b, lBuf[ 3], 14, 4107603335);
GG( b, c, d, a, lBuf[ 8], 20, 1163531501);
GG( a, b, c, d, lBuf[13], 5, 2850285829);
GG( d, a, b, c, lBuf[ 2], 9, 4243563512);
GG( c, d, a, b, lBuf[ 7], 14, 1735328473);
GG( b, c, d, a, lBuf[12], 20, 2368359562);
HH( a, b, c, d, lBuf[ 5], 4, 4294588738);
HH( d, a, b, c, lBuf[ 8], 11, 2272392833);
HH( c, d, a, b, lBuf[11], 16, 1839030562);
HH( b, c, d, a, lBuf[14], 23, 4259657740);
HH( a, b, c, d, lBuf[ 1], 4, 2763975236);
HH( d, a, b, c, lBuf[ 4], 11, 1272893353);
HH( c, d, a, b, lBuf[ 7], 16, 4139469664);
HH( b, c, d, a, lBuf[10], 23, 3200236656);
HH( a, b, c, d, lBuf[13], 4, 681279174);
HH( d, a, b, c, lBuf[ 0], 11, 3936430074);
HH( c, d, a, b, lBuf[ 3], 16, 3572445317);
HH( b, c, d, a, lBuf[ 6], 23, 76029189);
HH( a, b, c, d, lBuf[ 9], 4, 3654602809);
HH( d, a, b, c, lBuf[12], 11, 3873151461);
HH( c, d, a, b, lBuf[15], 16, 530742520);
HH( b, c, d, a, lBuf[ 2], 23, 3299628645);
II( a, b, c, d, lBuf[ 0], 6, 4096336452);
II( d, a, b, c, lBuf[ 7], 10, 1126891415);
II( c, d, a, b, lBuf[14], 15, 2878612391);
II( b, c, d, a, lBuf[ 5], 21, 4237533241);
II( a, b, c, d, lBuf[12], 6, 1700485571);
II( d, a, b, c, lBuf[ 3], 10, 2399980690);
II( c, d, a, b, lBuf[10], 15, 4293915773);
II( b, c, d, a, lBuf[ 1], 21, 2240044497);
II( a, b, c, d, lBuf[ 8], 6, 1873313359);
II( d, a, b, c, lBuf[15], 10, 4264355552);
II( c, d, a, b, lBuf[ 6], 15, 2734768916);
II( b, c, d, a, lBuf[13], 21, 1309151649);
II( a, b, c, d, lBuf[ 4], 6, 4149444226);
II( d, a, b, c, lBuf[11], 10, 3174756917);
II( c, d, a, b, lBuf[ 2], 15, 718787259);
II( b, c, d, a, lBuf[ 9], 21, 3951481745);
lAccu[0] += a;
lAccu[1] += b;
lAccu[2] += c;
lAccu[3] += d;
}
// ---------------------------------------------
void MD5Init(TMD5Ctx& Context)
{
Context.BLen = 0;
Context.Count[0] = 0;
Context.Count[1] = 0;
// magic constants ;)
Context.State[0] = 0x67452301;
Context.State[1] = 0xEFCDAB89;
Context.State[2] = 0x98BADCFE;
Context.State[3] = 0x10325476;
}
// ---------------------------------------------
void MD5Update (TMD5Ctx& Context, const void* ChkBuf, DWORD Len)
{
DWORD Left;
if ( (Context.Count[0] + DWORD(Len << 3)) < Context.Count[0] )
{
++Context.Count[1];
}
Context.Count[0] += Len << 3;
Context.Count[1] += Len >> 29;
const BYTE* bufPtr = (const BYTE*)ChkBuf;
if ( Context.BLen > 0 )
{
Left = 64 - Context.BLen;
if ( Left < Len ) Left = Len;
memcpy(&Context.Buffer[Context.BLen], bufPtr, Left);
Context.BLen += Left;
bufPtr += Left;
if ( Context.BLen < 64 ) return;
Transform(Context.State, Context.Buffer);
Context.BLen = 0;
Len -= Left;
}
while ( Len >= 64 )
{
Transform(Context.State, bufPtr);
bufPtr += 64;
Len -= 64;
}
if ( Len > 0)
{
Context.BLen = Len;
memcpy(Context.Buffer, bufPtr, Context.BLen );
}
}
// ---------------------------------------------
void MD5Final( TMD5Byte16 Digest, TMD5Ctx& Context)
{
TMD5Byte64 WorkBuf;
DWORD WorkLen;
memcpy(Digest, Context.State, sizeof(TMD5Byte16));
memcpy(WorkBuf, Context.Buffer, Context.BLen);
//pad out to block of form (0..55, BitLo, BitHi)
WorkBuf[Context.BLen] = 0x80;
WorkLen = Context.BLen + 1;
if ( WorkLen > 56 )
{
memset(&WorkBuf[WorkLen], 0, 64-WorkLen);
Transform(Digest, WorkBuf);
WorkLen = 0;
}
memset(&WorkBuf[WorkLen], 0, 56 - WorkLen);
((DWORD*)WorkBuf)[14] = Context.Count[0];
((DWORD*)WorkBuf)[15] = Context.Count[1];
Transform(Digest, WorkBuf);
memset(&Context, 0, sizeof(Context));
}
// ---------------------------------------------
void xCalcMD5(void* Input, int InputLen, BYTE* Digest)
{
TMD5Ctx Context;
MD5Init(Context);
MD5Update(Context, Input, InputLen);
MD5Final(Digest,Context);
}
// ---------------------------------------------
string DigestToStr(const BYTE* digest)
{
unsigned char rr;
for (int i=0;i<16;i++)
{
rr = digest[i];
printf("%x",rr);
}
return " ";
}
// ---------------------------------------------
string MD5Result(string st)
{
TMD5Byte16 Digest;
xCalcMD5((void*)st.c_str(), 5, Digest);
return DigestToStr(Digest);
}
// ---------------------------------------------
Alex Bessonov 2:454/1.61
---
*Примечание от Alex Bessonov (фрагмент из эхоконференции):
>У MD5 нет ключа :)
имелась ввиду генерация ключа ;)
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|