静态库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);函数编码转换一下。