user-0 提问: 求一个md5的头文件，里面直接包含实现方法的那种

回复:
user: user-0
content: 引用 7 楼 u012006886 的回复:你平时用的平台可以直接调用命令行吗，如果可以的话，直接用md5sum这个命令加上相关参数就可以获取到MD5值了 可以把头文件或dll文件放在项目里，然后调用里面的方法

user: user-1
content: 直接使用Openssl里面的MD5加密，

user: user-2
content: 你平时用的平台可以直接调用命令行吗，如果可以的话，直接用md5sum这个命令加上相关参数就可以获取到MD5值了

user: user-0
content: 引用 1 楼 paschen 的回复:http://blog.csdn.net/xhhjin/article/details/8450686 看不太懂，可以把md5.c里的代码直接放在md5.h里吗，而且最终调用的方法名和参数能简单介绍下吗

user: user-3
content: http://blog.csdn.net/xhhjin/article/details/8450686

user: user-0
content: 引用 3 楼 paschen 的回复:[quote=引用 2 楼 qq_25824067 的回复:] [quote=引用 1 楼 paschen 的回复:] http://blog.csdn.net/xhhjin/article/details/8450686 看不太懂，可以把md5.c里的代码直接放在md5.h里吗，而且最终调用的方法名和参数能简单介绍下吗[/quote]  网上很多讲解的，如果再不会你可以直接使用微软提供的API：Crypt开头系列的，可以实现MD5的加密[/quote] 我是放在loadrunner里使用的……

user: user-4
content: 再供参考：#include <stdio.h> #include <math.h> #include <string.h> #include <memory.h> const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}}; const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));  0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,  0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,  0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,  0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,  0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,  0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,  0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,  0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391 }; const int serial[64]={  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,  1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,  5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,  0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }; void func(unsigned long& a,           unsigned long b,           unsigned long c,           unsigned long d,           unsigned long M,           unsigned long t,           int s,           int turn) {     unsigned long temp;     switch(turn) {     case 0:         temp=(b&c)|((~b)&d);         break;     case 1:         temp=(d&b)|((~d)&c);         break;     case 2:         temp=b^c^d;         break;     case 3:         temp=c^(b|(~d));         break;     }     temp+=M+t+a;     _asm {         mov ecx,s         rol temp,cl     }     a=b+temp; } void MD512(const unsigned long M[16],unsigned long hash[4]) {     int i,j,index=0;     for (i=0;i<4;i++)         for (j=0;j<4;j++) {             func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);             index++;             func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);             index++;             func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);             index++;             func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);             index++;         } }  void MD5(char* M,int nLen,unsigned long output[4]) {     int i,j;     unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};     unsigned long hash[4];      //填充     __int64 BitsLen=nLen*8;     int oldlen=nLen;     while(nLen%64!=56) {         M[nLen++]=0;     }     M[oldlen]=0x80u;     *(__int64*)(M+nLen)=BitsLen;     nLen+=8;      //开始处理分组     for (i=0;i<nLen;i+=64) {         memcpy(hash,Hash,sizeof(long)*4);         MD512((const unsigned long*)&M[i],hash);//处理512bits分组         for (j=0;j<4;j++)             Hash[j]+=hash[j];     }      //处理输出。     for (i=0;i<4;i++)         for (j=3;j>=0;j--) {             *((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);         } } int main() {     int i;     char szMessage[1000]={0};     printf("input a string:\n>>>");     scanf("%s",szMessage);     unsigned long output[4];     MD5(szMessage,strlen(szMessage),output);     for (i=0;i<4;i++)         printf("%08lx",output[i]);     printf("\n");     return 0; }

user: user-4
content: 仅供参考：#pragma comment(lib,"advapi32") #include <windows.h> #include <wincrypt.h> #include <stdio.h> #include <string.h> int main() {     int L;     HCRYPTPROV hProv = 0;     HCRYPTHASH hHash = 0;     BYTE *pbHash = NULL;     DWORD dwHashLen;     #define BUFFER_SIZE 256     BYTE pbBuffer[BUFFER_SIZE];     DWORD dwCount;     DWORD i;      if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {//Get a handle to the default provider.         printf("Error %x during CryptAcquireContext!\n", GetLastError());         goto done;     }     if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {//Create a hash object.         printf("Error %x during CryptBeginHash!\n", GetLastError());         goto done;     }     printf("Input a string:");fflush(stdout);     fgets((char *)pbBuffer,BUFFER_SIZE,stdin);     L=strlen((char *)pbBuffer);     if ('\n'==pbBuffer[L-1]) {pbBuffer[L-1]=0;L--;}     if(!CryptHashData(hHash, pbBuffer, L, 0)) {//Put the hash in buffer.         printf("Error %x during CryptHashData!\n", GetLastError());         goto done;     }     dwCount = sizeof(DWORD);     if(!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE *)&dwHashLen,&dwCount, 0)) {//Read the hash value size and allocate memory.         printf("Error %x during reading hash size!\n", GetLastError());         goto done;     }     if((pbHash = (BYTE *)malloc(dwHashLen)) == NULL) {         printf("Out of memory!\n");         goto done;     }     if(!CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &dwHashLen, 0)) {//Read the hash value.         printf("Error %x during reading hash value!\n", GetLastError());         goto done;     }     for(i = 0 ; i < dwHashLen ; i++) {//Print the hash value.         printf("%02x",pbHash[i]);     }     printf("\n"); done:     if (pbHash) free(pbHash);//Free memory.     if(hHash) CryptDestroyHash(hHash);//Destroy the hash object.     if(hProv) CryptReleaseContext(hProv,0);//Release the CSP handle.     return 0; } //Input a string:abc //900150983cd24fb0d6963f7d28e17f72 //

user: user-3
content: 引用 2 楼 qq_25824067 的回复:[quote=引用 1 楼 paschen 的回复:] http://blog.csdn.net/xhhjin/article/details/8450686 看不太懂，可以把md5.c里的代码直接放在md5.h里吗，而且最终调用的方法名和参数能简单介绍下吗[/quote]  网上很多讲解的，如果再不会你可以直接使用微软提供的API：Crypt开头系列的，可以实现MD5的加密