Главная / FAQ по Builder'у / 160 Криптография. MD5 с 128 битным ключем...

160 Криптография. MD5 с 128 битным ключем.


 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
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz