VC++下使用md5函数

4 篇文章 0 订阅

使用windows的动态链接库advapi32.dll.

此动态链接库提供以下md5函数:

MD5Init(&ctx);
MD5Update(&ctx, buf, len);
MD5Final(&ctx);

具体使用如下

新建文件 common.h

 

 
  1. #include <windows.h>

  2. /* Data structure for MD5 (Message-Digest) computation */

  3. typedef struct {

  4. ULONG i[2]; /* number of _bits_ handled mod 2^64 */

  5. ULONG buf[4]; /* scratch buffer */

  6. unsigned char in[64]; /* input buffer */

  7. unsigned char digest[16]; /* actual digest after MD5Final call */

  8. } MD5_CTX;

  9.  
  10.  
  11. #define MD5DIGESTLEN 16

  12.  
  13. #define PROTO_LIST(list) list

  14.  
  15.  
  16. /*

  17. * MTS: Each of these assumes MD5_CTX is locked against simultaneous use.

  18. */

  19. typedef void (WINAPI* PMD5Init) PROTO_LIST ((MD5_CTX *));

  20. typedef void (WINAPI* PMD5Update) PROTO_LIST ((MD5_CTX *, const unsigned char *, unsigned int));

  21. typedef void (WINAPI* PMD5Final )PROTO_LIST ((MD5_CTX *));

  22.  
  23. //end globle define

  24.  
  25.  
  26.  
  27.  
  28.  
  29. class Ccommon

  30. {

  31. public:

  32. Ccommon();

  33. virtual ~Ccommon();

  34. const char * md5(const char * str);

  35. const char * Hex2ASC(const BYTE *Hex, int Len);

  36. PMD5Init MD5Init;

  37. PMD5Update MD5Update;

  38. PMD5Final MD5Final;

  39.  
  40. };


新建文件 common.cpp

 

 

 
  1. #include "stdafx.h"

  2. #include "common.h"

  3.  
  4. //

  5. // Construction/Destruction

  6. //

  7.  
  8. Ccommon::Ccommon()

  9. {

  10.  
  11. }

  12.  
  13. Ccommon::~Ccommon()

  14. {

  15.  
  16. }

  17.  
  18. const char * Ccommon::Hex2ASC(const BYTE *Hex, int Len)

  19. {

  20. static char ASC[4096 * 2];

  21. int i;

  22.  
  23. for (i = 0; i < Len; i++)

  24. {

  25. ASC[i * 2] = "0123456789abcdef"[Hex[i] >> 4];

  26. ASC[i * 2 + 1] = "0123456789abcdef"[Hex[i] & 0x0F];

  27. }

  28. ASC[i * 2] = 0;

  29. return ASC;

  30. }

  31.  
  32.  
  33. const char * Ccommon::md5(const char * str)

  34. {

  35. MD5_CTX ctx;

  36. const unsigned char * buf = reinterpret_cast<const unsigned char *>(str);

  37. int len = strlen(str);

  38. HINSTANCE hDLL;

  39. if ( (hDLL = LoadLibraryA("advapi32.dll")) > 0 )

  40. {

  41.  
  42. MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");

  43. MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");

  44. MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");

  45.  
  46. MD5Init(&ctx);

  47. MD5Update(&ctx, buf, len);

  48. MD5Final(&ctx);

  49. }

  50. return Hex2ASC(ctx.digest, 16);

  51. }


调用方法

 

 

 
  1. //引入头文件

  2. #include "common.h"

  3. //声明类

  4. Ccommon md5Class;

  5. name=md5Class.md5(name);

  6.  

 

注意事项

MD5加密后的大小写是由 Hex2ASC函数里

 
  1. ASC[i * 2] = "0123456789abcdef"[Hex[i] >> 4];

  2. ASC[i * 2 + 1] = "0123456789abcdef"[Hex[i] & 0x0F];

这两句代码控制的 这里我改为了小写 默认应该是大写 看大家需求而定

 

如果需要大写改为:

 

 
  1. ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4];

  2. ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];

  3.  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值