工控编程吧
标题:
357上位机VC MFC利用外部库实现AES加密解密
[打印本页]
作者:
qq263946146
时间:
2016-9-19 18:42
标题:
357上位机VC MFC利用外部库实现AES加密解密
(, 下载次数: 1)
上传
点击文件名下载附件
实现AES加密解密
功能展示
AES全称Advanced Encryption Standard,是美国联邦政府采用的一种区块高级加密标准这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,我们当前例程利用开源的库实现AES加密功能,效果如图,输入要加密的文本,密码,点击加密可进行AES加密并显示加密密文到编辑框,点击解密,例程读取输入的密码对密文进行解密,解密获得的文本与事件加密的文本进行对比来判断输入的密码是否正确;
要点提示
例程也是使用第三方开源库初始AES的加密,解密功能,库源码可从官网下载,下载后编辑可获得静态库文件cryptlib.lib及头文件,使用时注意自已工程运行库及预编译库的匹配
AES加密的实现是通过类AESEncryption成员函数完成;SetKey()设置加密密码,ProcessAndXorBlock()进行加密处理获得加密密文
virtual void SetKey(const byte *key, size_t length, const NameValuePairs ¶ms = g_nullNameValuePairs);
Key为要设置的密码字符器,length为密码字符串长度;
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
inBlock为要加密的文本, xorBlock为加密计算用须清空传入,outBlock为加密后输出的密文;
解密通过类AESDecryption成员函数ProcessAndXorBlock()实现;
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
inBlock为被加密密文的输入, xorBlock须清空传入,outBlock为解密后的文本输入;
实现功能
1.新建基于对话框的应用程序
2.复制第三方库静态库及头文件,也就是例程根目录文件夹encrypt到自己工程根目录,并在主对话框头文件包含库头文件及添加两成员变量
#include "encrypt\\aes.h"
#pragma comment( lib, "encrypt\\cryptlib.lib" )
using namespace CryptoPP;
CString m_sText; //要加密文本
unsigned char m_cEncrypted[AES::BLOCKSIZE]; //已加密密文
3.依照例程界面添加编辑框IDC_EDIT1, IDC_EDIT2, IDC_EDIT3分别对应文本,密码,密文,两款添加按钮<加密><解密>关联点击函数
void CGkbc8Dlg::OnDecrypt()
{
CString sKey,sTemp;
GetDlgItemText(IDC_EDIT2,sKey);//密码
if(sKey.GetLength()>AES:
EFAULT_KEYLENGTH)//文本长度可自作判断
{
sTemp.Format("输入密码字节数超过:%d",AES:
EFAULT_KEYLENGTH);
MessageBox(sTemp);
return;
}
//<
unsigned char aesKey[AES:
EFAULT_KEYLENGTH] =""; //密钥
unsigned char cDescrypted[AES::BLOCKSIZE];
unsigned char xorBlock[AES::BLOCKSIZE]=""; //必须设定为全零
memset( xorBlock, 0, AES::BLOCKSIZE ); //置零
for(int i=0;i<sKey.GetLength();i++)
{
aesKey
= sKey.GetAt(i);
}
//<>
AESDecryption aesDecryptor;
aesDecryptor.SetKey( aesKey, AES:
EFAULT_KEYLENGTH );
aesDecryptor.ProcessAndXorBlock( m_cEncrypted, xorBlock, cDescrypted );
//
if(memcmp(cDescrypted,m_sText.GetBuffer(0),m_sText.GetLength()) != 0)
{
MessageBox("密码错误");
return;
}
MessageBox("密码正确");
}
void CGkbc8Dlg::OnEncrypt()
{
CString sText,sKey,sTemp;
GetDlgItemText(IDC_EDIT1,sText);
GetDlgItemText(IDC_EDIT2,sKey);
if(sText.GetLength()>AES::BLOCKSIZE)
{
sTemp.Format("输入文本字节数超过:%d",AES::BLOCKSIZE);
MessageBox(sTemp);
return;
}
if(sKey.GetLength()>AES:
EFAULT_KEYLENGTH)
{
sTemp.Format("输入密码字节数超过:%d",AES:
EFAULT_KEYLENGTH);
MessageBox(sTemp);
return;
}
m_sText = sText;
//<>
unsigned char aesKey[AES:
EFAULT_KEYLENGTH] =""; //密钥
unsigned char cText[AES::BLOCKSIZE] =""; //要加密的数据块
unsigned char xorBlock[AES::BLOCKSIZE]=""; //必须设定为全零
memset( xorBlock, 0, AES::BLOCKSIZE ); //置零
for(int i=0;i<sKey.GetLength();i++)
{
aesKey
= sKey.GetAt(i);
}
for(i=0;i<sText.GetLength();i++)
{
cText
= sText.GetAt(i);
}
AESEncryption aesEncryptor; //加密器
aesEncryptor.SetKey( aesKey, AES:
EFAULT_KEYLENGTH ); //设定加密密钥
aesEncryptor.ProcessAndXorBlock( cText, xorBlock, m_cEncrypted ); //加密
//<>
SetDlgItemText(IDC_EDIT3,(const char *)m_cEncrypted);
}
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/13c8720810c876c1aa72dc2c96a47c1e/0/0/w_19rssvwtfd.swf-albumId=6336425109-tvId=6336425109-isPurchase=0-cnId=12[/iqiyi]
[weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4