静态库lib编程和MFC中DES加密的研究

今天要做一个lib,提供DES加密功能。

创建lib工程可以在vc中新建->win32项目->lib ,可以选择支持mfc或者不支持mfc。这个lib工程编译好会产生lib文件,如果你再提供头文件,就可以给其他工程调用。在lib中编好的函数,可以在其他工程中直接调用。

例如,我最开始选择支持mfc的lib,然后在这个lib种新建一个类,名字叫CEncrypt,vc自动产生Encrypt.h和Encrypt.cpp两个文件。在头文件中定义函数CString Encrypt(CString sSrcMsg),并在定义文件中实现它。然后编译生成Encryption.lib,要调用这个lib,可以在解决方案中添加一个工程,随便什么工程,这里我添加一个对话框,要调用首先把Encrypt.h和Encryption.lib拷贝到对话框工程,在要调用的文件中

#include "Encryption.h"

#pragam comment (lib, "Encryption.lib")

申明一个对象

CEncrypt Encrypt;

 CString  str = Encrypt.Encrypt("hello");这个str就是hello的des加密结果。

当然 这是类的实现, 在后来不要我用mfc的lib中,我没有创建类,而是直接用一个函数就实现了。当然在调用的时候也不要特别去创造类的对象了。似乎在支持mfc的lib不能用mfc的对话框工程来调试,可能要改一些项目属性,我改了好久也没有改过来,总是提示什么什么重定义了。

   DES的研究,利用mfc的atlcrypt.h来实现DES的加密算法是一件很容易的事情。

首先要做一些初始化的工作

 HCRYPTPROV m_hProv;   //CSP句柄
 HCRYPTHASH m_hHash;  //Hash句柄
 HCRYPTKEY m_hKey;      //加密的key句柄

需要用函数来初始化这三者

CryptAcquireContext(&m_hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0);

CryptCreateHash(m_hProv, CALG_MD5, 0, 0, &m_hHash);

CryptHashData(m_hHash, (LPBYTE)szKey, dwLength, 0);   //szKey是用户给定的用于散列

CryptDeriveKey(m_hProv, CALG_DES, m_hHash, 0, &m_hKey); 

CryptSetKeyParam(m_hKey, KP_IV, (LPBYTE)szIV, 0) ;     //szIV是用户给定的用来产生密钥m_hKey

 然后可以用函数CryptEncrypt(m_hKey, NULL ,true, 0 ,(BYTE*)lpSrc, pdwDataLen, dwSrcLen);来进行加密lpSrc就是加密的结果,pdwDataLen是结果的长度。

再用Base64Encode((const BYTE *)szSrc, dwDataLen,(char*)szBase, &nBaseLen, ATL_BASE64_FLAG_NOCRLF);函数编码转换一下。

具体可以参考http://www.vckbase.com/document/viewdoc/?id=974这篇文章。

posted @ 2009-04-13 22:27  陈卫伍  阅读(1307)  评论(0编辑  收藏  举报