用C++实现MD5加密


我用的VS2008,里面有一个库函数是MD5CryptoServiceProvider。这个可以直接得到,但是网上都是C#的,有谁能写个C++的?我用C++写,但是参数传不进去。

15 个解决方案

#1


csdn下载频道有

#2


http://search.download.csdn.net/search/md5

#3


msdn查询CryptCreateHash()函数,里面有示例代码

#4


引用 2 楼 jennyvenus 的回复:
http://search.download.csdn.net/search/md5


例如 http://download.csdn.net/source/415640

#5


引用 2 楼 jennyvenus 的回复:
http://search.download.csdn.net/search/md5


那个里面的都是很复杂的那种。没有我要的这种简单的实现。

#6


md5没你想象那么复杂,无非是多次置换,自己去实现一次大有裨益,比单纯要代码好多了

#7


引用 6 楼 postyourinformation 的回复:
md5没你想象那么复杂,无非是多次置换,自己去实现一次大有裨益,比单纯要代码好多了


MD5只是程序里的一个部分,没有必要根据MD5算法去写一个出来。直接用库函数给出的,不是简洁得多么?

#8


引用 7 楼 enen_enen 的回复:
引用 6 楼 postyourinformation 的回复:
md5没你想象那么复杂,无非是多次置换,自己去实现一次大有裨益,比单纯要代码好多了


MD5只是程序里的一个部分,没有必要根据MD5算法去写一个出来。直接用库函数给出的,不是简洁得多么?

不用做算法,库函数是用的

#9


引用 8 楼 tzxx 的回复:
引用 7 楼 enen_enen 的回复:
引用 6 楼 postyourinformation 的回复:
md5没你想象那么复杂,无非是多次置换,自己去实现一次大有裨益,比单纯要代码好多了


MD5只是程序里的一个部分,没有必要根据MD5算法去写一个出来。直接用库函数给出的,不是简洁得多么?

不用做算法,库函数是用的



用查到的库函数写的时候。里面的 array<Byte>^ MD5hash( array<Byte>^data )
这是什么意思,用法是什么?我想往里面传递CString类型的,怎么办?是要转化么?那个到底是个什么类型的东西?

#10


那里面那么多种实现,您都看了?md5之类的hash,正规使用流程都是3级函数,init + update + final。

#11


不能简单的输入一段字符串,然后输出经MD5加密之后的值么?

#12


这是个vc6控制台程序,自己编译下,结果是32位的,如果要16位的,前8位和后8位去掉,中间16位就是

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>

#define SINGLE_ONE_BIT 0x80
#define BLOCK_SIZE 512
#define MOD_SIZE 448
#define APP_SIZE 64
#define BITS 8

// MD5 Chaining Variable
#define A 0x67452301UL
#define B 0xEFCDAB89UL
#define C 0x98BADCFEUL
#define D 0x10325476UL

// Four auxiliary functions
#define F( X, Y, Z ) ( ( (X) & (Y) ) | ( (~(X)) & (Z) ) )
#define G( X, Y, Z ) ( ( (X) & (Z) ) | ( (Y) & (~(Z)) ) )
#define H( X, Y, Z ) ( (X) ^ (Y) ^ (Z) )
#define I( X, Y, Z ) ( (Y) ^ ( (X) | (~(Z)) ) )

// common function
#define LOGIC_SHIFT_LEFT( x, c ) ( ((x) << (c)) | ((x) >> (32 - c)) )

#define FF( a, b, c, d, Mj, s, ti ) \
    (a = b + LOGIC_SHIFT_LEFT( ( a + F( b, c, d ) + Mj + ti ), s ))    //FF( a, b, c, d, w[0], 7, 0xd76aa478);
#define GG( a, b, c, d, Mj, s, ti ) \
    (a = b + LOGIC_SHIFT_LEFT( ( a + G( b, c, d ) + Mj + ti ), s ))

#define HH( a, b, c, d, Mj, s, ti ) \
    (a = b + LOGIC_SHIFT_LEFT( ( a + H( b, c, d ) + Mj + ti ), s ))
#define II( a, b, c, d, Mj, s, ti ) \
    (a = b + LOGIC_SHIFT_LEFT( ( a + I( b, c, d ) + Mj + ti ), s ))


// Creating own types
#ifdef UINT64
# undef UINT64
#endif

#ifdef UINT32
# undef UINT32
#endif


typedef unsigned  __int64   UINT64; //long long 在WIN32中用__int64
typedef unsigned  long      UINT32;  //long 是32位的
typedef struct
{
    char * message;
    UINT64 length;
}STRING;



// Pre-processin
UINT32 count_padding_bits ( UINT32 length )
{
    UINT32 div = length * BITS / BLOCK_SIZE;
    UINT32 mod = length * BITS % BLOCK_SIZE;
    UINT32 c_bits;



    if ( mod == 0 )
        c_bits = BLOCK_SIZE;
    else
        c_bits = ( MOD_SIZE + BLOCK_SIZE - mod ) % BLOCK_SIZE;



    return c_bits / BITS;
}



STRING append_padding_bits ( char * argv )
{
    UINT32 msg_length = strlen ( argv );
    UINT32 bit_length = count_padding_bits ( msg_length );
    UINT64 app_length = msg_length * BITS;
    STRING string;



    string.message = (char *)malloc(msg_length + bit_length + APP_SIZE / BITS);


    strncpy ( string.message, argv, msg_length );
    memset ( string.message + msg_length, 0, bit_length );
    memmove ( string.message + msg_length + bit_length, (char *)&app_length, sizeof( UINT64 ) );
    string.message [ msg_length ] = (char)SINGLE_ONE_BIT;



    string.length = msg_length + bit_length + sizeof( UINT64 );

    return string;
}



int main ( int argc, char *argv[] )
{
    STRING string;
    UINT32 w[16];
    UINT32 h0, a;
    UINT32 h1, b;
    UINT32 h2, c;
    UINT32 h3, d;
    unsigned char r[16];
    int i;
    int j;
    char m[16],md5[512]={0};
char word[512];

    gets(word);




        string = append_padding_bits (word);



        h0 = A;
        h1 = B;
        h2 = C;
        h3 = D;



        for ( j = 0; j < string.length; j += BLOCK_SIZE / BITS)
        {
            memmove ( (char *)w, string.message + j, BLOCK_SIZE / BITS );




            a = h0;
            b = h1;
            c = h2;
            d = h3;



            // Round 1
            FF( a, b, c, d, w[0], 7, 0xd76aa478);
            FF( d, a, b, c, w[1], 12, 0xe8c7b756);
            FF( c, d, a, b, w[2], 17, 0x242070db);
            FF( b, c, d, a, w[3], 22, 0xc1bdceee);
            FF( a, b, c, d, w[4], 7, 0xf57c0faf);
            FF( d, a, b, c, w[5], 12, 0x4787c62a);
            FF( c, d, a, b, w[6], 17, 0xa8304613);
            FF( b, c, d, a, w[7], 22, 0xfd469501);
            FF( a, b, c, d, w[8], 7, 0x698098d8);
            FF( d, a, b, c, w[9], 12, 0x8b44f7af);
            FF( c, d, a, b, w[10], 17, 0xffff5bb1);
            FF( b, c, d, a, w[11], 22, 0x895cd7be);
            FF( a, b, c, d, w[12], 7, 0x6b901122);
            FF( d, a, b, c, w[13], 12, 0xfd987193);
            FF( c, d, a, b, w[14], 17, 0xa679438e);
            FF( b, c, d, a, w[15], 22, 0x49b40821);



            // Round 2
            GG( a, b, c, d, w[1], 5, 0xf61e2562 );
            GG( d, a, b, c, w[6], 9, 0xc040b340 );
            GG( c, d, a, b, w[11], 14, 0x265e5a51 );
            GG( b, c, d, a, w[0], 20, 0xe9b6c7aa );
            GG( a, b, c, d, w[5], 5, 0xd62f105d );
            GG( d, a, b, c, w[10], 9, 0x02441453 );
            GG( c, d, a, b, w[15], 14, 0xd8a1e681 );
            GG( b, c, d, a, w[4], 20, 0xe7d3fbc8 );
            GG( a, b, c, d, w[9], 5, 0x21e1cde6 );
            GG( d, a, b, c, w[14], 9, 0xc33707d6 );
            GG( c, d, a, b, w[3], 14, 0xf4d50d87 );
            GG( b, c, d, a, w[8], 20, 0x455a14ed );
            GG( a, b, c, d, w[13], 5, 0xa9e3e905 );
            GG( d, a, b, c, w[2], 9, 0xfcefa3f8 );
            GG( c, d, a, b, w[7], 14, 0x676f02d9 );
            GG( b, c, d, a, w[12], 20, 0x8d2a4c8a );



            // Round 3
            HH( a, b, c, d, w[5], 4, 0xfffa3942 );
            HH( d, a, b, c, w[8], 11, 0x8771f681 );
            HH( c, d, a, b, w[11], 16, 0x6d9d6122 );
            HH( b, c, d, a, w[14], 23, 0xfde5380c );
            HH( a, b, c, d, w[1], 4, 0xa4beea44 );
            HH( d, a, b, c, w[4], 11, 0x4bdecfa9 );
            HH( c, d, a, b, w[7], 16, 0xf6bb4b60 );
            HH( b, c, d, a, w[10], 23, 0xbebfbc70 );
            HH( a, b, c, d, w[13], 4, 0x289b7ec6 );
            HH( d, a, b, c, w[0], 11, 0xeaa127fa );
            HH( c, d, a, b, w[3], 16, 0xd4ef3085 );
            HH( b, c, d, a, w[6], 23, 0x04881d05 );
            HH( a, b, c, d, w[9], 4, 0xd9d4d039 );
            HH( d, a, b, c, w[12], 11, 0xe6db99e5 );
            HH( c, d, a, b, w[15], 16, 0x1fa27cf8 );
            HH( b, c, d, a, w[2], 23, 0xc4ac5665 );



            // Round 4
         II( a, b, c, d, w[0], 6, 0xf4292244 );
            II( d, a, b, c, w[7], 10, 0x432aff97 );
            II( c, d, a, b, w[14], 15, 0xab9423a7 );
            II( b, c, d, a, w[5], 21, 0xfc93a039 );
            II( a, b, c, d, w[12], 6, 0x655b59c3 );
            II( d, a, b, c, w[3], 10, 0x8f0ccc92 );
            II( c, d, a, b, w[10], 15, 0xffeff47d );
            II( b, c, d, a, w[1], 21, 0x85845dd1 );
            II( a, b, c, d, w[8], 6, 0x6fa87e4f );
            II( d, a, b, c, w[15], 10, 0xfe2ce6e0 );
            II( c, d, a, b, w[6], 15, 0xa3014314 );
            II( b, c, d, a, w[13], 21, 0x4e0811a1 );
            II( a, b, c, d, w[4], 6, 0xf7537e82 );
            II( d, a, b, c, w[11], 10, 0xbd3af235 );
            II( c, d, a, b, w[2], 15, 0x2ad7d2bb );
            II( b, c, d, a, w[9], 21, 0xeb86d391 );



            h0 += a;
            h1 += b;
            h2 += c;
            h3 += d;
        }



        memmove ( r +  0, (char *)&h0, sizeof(h0) );
        memmove ( r +  4, (char *)&h1, sizeof(h1) );
        memmove ( r +  8, (char *)&h2, sizeof(h2) );
        memmove ( r + 12, (char *)&h3, sizeof(h3) );


        for ( i = 0; i < 16; i++ )
{
            sprintf ( m,"%02x", r[i] );  //:%02x 是指输出两位16 进制数.如果不足两位则在前面补0
strcat(md5,m);
//puts(m);
        }
    puts(md5);
        putchar ( '\n' );
        // printf ( "%08x%08x%08x%08x\n", h0, h1, h2, h3 );
 



    return EXIT_SUCCESS;
}

#13


引用 11 楼 enen_enen 的回复:
不能简单的输入一段字符串,然后输出经MD5加密之后的值么?

VC里没有现成的函数
不过网上有大家封装的类
没人让你研究算法
不过东西还是要自己下功夫找吧

#14


引用 13 楼 xianglitian 的回复:
引用 11 楼 enen_enen 的回复:

不能简单的输入一段字符串,然后输出经MD5加密之后的值么?

VC里没有现成的函数
不过网上有大家封装的类
没人让你研究算法
不过东西还是要自己下功夫找吧

俺脚着楼主还得过来问的,字符串就分编码了.........

#15


引用 14 楼 jennyvenus 的回复:
引用 13 楼 xianglitian 的回复:
引用 11 楼 enen_enen 的回复:

不能简单的输入一段字符串,然后输出经MD5加密之后的值么?

VC里没有现成的函数
不过网上有大家封装的类
没人让你研究算法
不过东西还是要自己下功夫找吧

俺脚着楼主还得过来问的,字符串就分编码了.........

呵呵
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告