VC++下使用md5函数
使用windows的动态链接库advapi32.dll.
此动态链接库提供以下md5函数:
MD5Init(&ctx);
MD5Update(&ctx, buf, len);
MD5Final(&ctx);
具体使用如下
新建文件 common.h
-
#include <windows.h>
-
/* Data structure for MD5 (Message-Digest) computation */
-
typedef struct {
-
ULONG i[2]; /* number of _bits_ handled mod 2^64 */
-
ULONG buf[4]; /* scratch buffer */
-
unsigned char in[64]; /* input buffer */
-
unsigned char digest[16]; /* actual digest after MD5Final call */
-
} MD5_CTX;
-
#define MD5DIGESTLEN 16
-
#define PROTO_LIST(list) list
-
/*
-
* MTS: Each of these assumes MD5_CTX is locked against simultaneous use.
-
*/
-
typedef void (WINAPI* PMD5Init) PROTO_LIST ((MD5_CTX *));
-
typedef void (WINAPI* PMD5Update) PROTO_LIST ((MD5_CTX *, const unsigned char *, unsigned int));
-
typedef void (WINAPI* PMD5Final )PROTO_LIST ((MD5_CTX *));
-
//end globle define
-
class Ccommon
-
{
-
public:
-
Ccommon();
-
virtual ~Ccommon();
-
const char * md5(const char * str);
-
const char * Hex2ASC(const BYTE *Hex, int Len);
-
PMD5Init MD5Init;
-
PMD5Update MD5Update;
-
PMD5Final MD5Final;
-
};
新建文件 common.cpp
-
#include "stdafx.h"
-
#include "common.h"
-
//
-
// Construction/Destruction
-
//
-
Ccommon::Ccommon()
-
{
-
}
-
Ccommon::~Ccommon()
-
{
-
}
-
const char * Ccommon::Hex2ASC(const BYTE *Hex, int Len)
-
{
-
static char ASC[4096 * 2];
-
int i;
-
for (i = 0; i < Len; i++)
-
{
-
ASC[i * 2] = "0123456789abcdef"[Hex[i] >> 4];
-
ASC[i * 2 + 1] = "0123456789abcdef"[Hex[i] & 0x0F];
-
}
-
ASC[i * 2] = 0;
-
return ASC;
-
}
-
const char * Ccommon::md5(const char * str)
-
{
-
MD5_CTX ctx;
-
const unsigned char * buf = reinterpret_cast<const unsigned char *>(str);
-
int len = strlen(str);
-
HINSTANCE hDLL;
-
if ( (hDLL = LoadLibraryA("advapi32.dll")) > 0 )
-
{
-
MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");
-
MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");
-
MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");
-
MD5Init(&ctx);
-
MD5Update(&ctx, buf, len);
-
MD5Final(&ctx);
-
}
-
return Hex2ASC(ctx.digest, 16);
-
}
调用方法
-
//引入头文件
-
#include "common.h"
-
//声明类
-
Ccommon md5Class;
-
name=md5Class.md5(name);
注意事项
MD5加密后的大小写是由 Hex2ASC函数里
-
ASC[i * 2] = "0123456789abcdef"[Hex[i] >> 4];
-
ASC[i * 2 + 1] = "0123456789abcdef"[Hex[i] & 0x0F];
这两句代码控制的 这里我改为了小写 默认应该是大写 看大家需求而定
如果需要大写改为:
-
ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4];
-
ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
-
相关文章
- C++日志之获取函数的名字,行号,文件名
- C++ 函数特性_参数默认值
- Word处理控件Aspose.Words功能演示:使用 C++ 保护或取消保护 Word 文档
- c++ template函数的声明和实现需要在同一个文件中
- 【原创】Sublime Text 3快捷配置c++的编译,运行,gdb环境
- 51 C++ - 抽象基类和纯虚函数(pure virtual function)
- C++程序设计-第12周函数序设计上机实践项目
- 【C++入门第三期】auto 和 范围for 及 指针空值nullptr
- C#调用C++函数来与串口通信
- C++中头文件(.h)和源文件(.cpp)都应该写些什么
- [C/C++]关于C++11中的std::move和std::forward
- 使用BLADE构建c++工程管理
- C++ 虚函数表解析
- 《C和C++程序员面试秘笈》——1.12 C++中main函数执行完后还执行其他语句吗
- 《C++面向对象高效编程(第2版)》——3.15 函数返回值
- 《从缺陷中学习C/C++》导读
- 【CSDN竞赛第33期】C++题解
- DevC++ 控制台项目初始代码修改方法
- C/C++ split函数 num2str str2num函数
- 104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++版本)
- WindowsclientC/C++编程规范“建议”——函数
- linux 下Eclipse for C/C++的不常见设置
- 关于汉诺塔,C++代码,代码效果演算
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
- C++ 实现聊天室(群聊、单聊、文件传送)
- C++调用空指针对象的成员函数成功的理解