• / 9

MD5算法简介及两种实现方法.docx

配套讲稿:

如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

特殊限制:

部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

关 键  词:
MD5算法简介及两种实现方法.docx
资源描述:

《MD5算法简介及两种实现方法.docx》由会员分享,可在线阅读,更多相关《MD5算法简介及两种实现方法.docx(9页珍藏版)》请在微传网上搜索。

1、MD5 算法简介及两种实现方法我们先来看看 RFC 文档中对 MD5 的描述:This document describes the MD5 message-digest algorithm(摘要 ). Th e algorithm takes as input a message of arbitrary length(任意长度) and produces as output a 128-bit "fingerprint" or "message digest" of the inpu t. It is conjectured that it is comp。

2、utationally infeasible(不可实行的) toproduce two messages having the same message digest, or to produce anymessage having a given prespecified target message digest. The MD5 alg orithm is intended for digital signature applications, where a large file mu st be "compressed" in a secure manner befo。

3、re being encrypted with a pri vate (secret) key under a public-key cryptosystem such as RSA.从上面的 RFC 描述中,能够总结出MD5 摘要算法两个最重要的特性:不可逆,无法由结果退出输入two messages不可能拥有相同的摘要信息,保证一对一正是这两个特性保证了 MD5 在数字签名中的应用, 将一个需要签名的大文件转换为等价的 128bit 的摘要信息,再用私钥对 128bit 的摘要信息进行加密。摘要的结果是 128bit 的,因此网上经常看。

4、到的 32 位/16 位 MD5 中的位对应的是 16 进制的 32 和 16,128bit 刚好是 32 字节。MD5 只是一个摘要算法, 由于它具有上面讲的两个特性,在实际中 (专门多网站 )也被用来对密码进行摘要,起到加密的作用。算法实现关于 MD5 的算法实现,因此能够参考 RFC 文档中的源代码,只是如果只在 Windows 平台应用的话,完全能够偷懒,调用 Windows 现有的 API 函数,只需三个 API 就能够搞定,专门简单,呵呵! ,分不是 MD5Init 、M D5Update、MD5Final ,只是这三个函数没有在 wi。

5、ndows 的 .h 头文件中有定义,也没有相应的import library ,需要自己声明它们的函数原型,这三个函数的具体实现在Cryptdll.dll 中,需要动态加载!实现一:下面是具体的源代码,用Cryptdll.dll 中的三个 api 实现:用法: MD5.exe[ 空格 ]input_message#include "stdafx.h"#include #include #include using name。

6、space std;typedef struct{ULONG i[2];ULONG buf[4];unsigned char in[64];unsigned char digest[16];} MD5_CTX;typedef void (CALLBACK* MD5Init_Tpye)(MD5_CTX* context); typedef void (CALLBACK* MD5Update_Tpye)(MD5_CTX* context,unsigned char* input,。

7、unsigned int inlen);typedef void (CALLBACK*MD5Final_Tpye)(MD5_CTX*context);int main(int argc, char **argv){if (argc != 2){cout << "args count err!" << endl;return 0;}HINSTANCE hDLL = LoadLibrary(L"Cryptdll.dll");if (hDLL ==。

8、 NULL){return -1;}MD5Init_TpyeMD5Init;MD5Update_Tpye MD5Update;MD5Final_TpyeMD5Final;MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init"); MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update");MD5Final = (MD5Final_Tpye)GetProcAddress(h。

9、DLL, "MD5Final"); if (MD5Init == NULL || MD5Update == NULL || MD5Final == NULL){FreeLibrary(hDLL);return -1;}MD5_CTXmd5_context;MD5Init(&md5_context);unsigned char src[100];unsigned length = strlen(argv[1]);memcpy(src, argv[1], lengt。

10、h);MD5Update(&md5_context, src, length);MD5Final(&md5_context);char dest[100] = { 0 };char *p = dest;for(int i = 0; i < 16; ++i){sprintf_s(p, 3, "%02x", md5_context.digest[i]); p += 2;}cout << dest << endl;FreeLibrary(hDLL);return 0;。

11、}实现二:一个 Win Crypto API 封装的类 Cmd5Capi,使用到了 MFC 中的 CString 类,用法 :CString input, output;// 选择一output = md5. Digest(input);// 选择二Cmd5Capi md5(in);out = md5.GetDigest();////////////////////////////////////////////////////////////////////////。

12、// md5Capi.h: interface for the Cmd5Capi class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MD5CAPI_H__438D2BEF_6F1B_4C5C_830F_0E7B6D1FD7E2__INCLUDED_)#define AFX_MD5CAPI_H__438D2BEF_6F1B_4C5C_830F_0E7B6D1F D7E2__INCLUDED_#if。

13、 _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include // Cryptographic API Prototypes and Definitionsclass Cmd5Capi{public:CString &Digest(CString & csBuffer);CString &GetDigest(void);Cmd5Capi(CSt。

14、ring & csBuffer);Cmd5Capi();virtual ~Cmd5Capi();CStringcsDigest;};#endif//////////////////////////////////////////////////////////////////////// md5Capi.cpp: implementation of the Cmd5Capi class.// Calcule MD5 Digest using。

15、 the WIN Crypto API.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "md5Capi.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////。

16、////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////Cmd5Capi::Cmd5Capi(){csDigest.Empty();}Cmd5Capi::Cmd5Capi(CString & csBuffer){Digest(csBuffe。

17、r);}Cmd5Capi::~Cmd5Capi(){}CString &Cmd5Capi::GetDigest(void){return csDigest;}CString &Cmd5Capi::Digest(CString & csBuffer){HCRYPTPROV hCryptProv;HCRYPTHASH hHash;BYTE bHash[0x7f];。

18、DWORD dwHashLen= 16; // The MD5 algorithm always returns 16 bytes.DWORD cbContent= csBuffer.GetLength();BYTE*pbContent= (BYTE*)csBuffer.GetBuffer(cbContent);if(CryptAcquireContext(&hCryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET。

19、)){if(CryptCreateHash(hCryptProv,CALG_MD5,// algorithm identifier definitions see: wincrypt.h0, 0, &hHash)){if(CryptHashData(hHash, pbContent, cbContent, 0)){if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0)){// Make a s。

20、tring version of the numeric digest value csDigest.Empty();CString tmp;for (int i = 0; i<16; i++){tmp.Format("%02x", bHash[i]);csDigest+=tmp;}}else csDigest=_T("Error getting hash param");}else csDigest=_T("Error hashing data");}else csDigest=_T("Error creating hash");}else csDigest=_T("Error acquiring context");CryptDestroyHash(hHash);CryptReleaseContext(hCryptProv, 0);csBuffer.ReleaseBuffer();return csDigest;} 。

展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:MD5算法简介及两种实现方法.docx
链接地址:https://www.weizhuannet.com/p-11848754.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网版权所有

     经营许可证编号:冀ICP备18006529号-1 公安局备案号:13028102000124

收起
展开