QQ登录

只需一步,快速开始

361上位机VC MFC利用外部库实现文件AES加密

[ 复制链接 ]

361上位机VC MFC利用外部库实现文件AES加密

361上位机VC MFC利用外部库实现文件AES加密

实现文件AES加密
功能展示
由于加密解密算法,密钥长度和数据块长度都是固定的,但是在实际应用中明文的长度是不确定的,而且会远大于加密解密算法中数据块的固定长度,所以这个时候就需要使用一定的模式来处理这些情况。就出现了现在的几种加密解密模式,比如:ECB,CBC,CFB等。这些模式提供分块,缓存,补充字节,加密解密等功能,提高开发效率。我们当前例程利用AES-CBC模式对文件进行加密解密功能,效果如图,点击<加密指定文件>程序会用输入密码加密指定文件并在编辑框显示密文,点击<解密>会用输入密码解密已加密的指定文件并显示解密后文本到上编辑框中;

要点提示
例程使用外部开源库实现指定文件AES-CBC模式加密与解密功能,库的整个工程源代码文件可以官网下载,编辑后可获得静态文件及头文件,例程已打包在根目录文件夹encrypt内,开发工程时复制到自己工程根目录就可使用;

CBC(Cipher Block Chaining:密码分组链接)引入一个Initialization Vector(初始化向量),向量可以是随机的,但加密与解密所使用的向量必须一致,在例程中都设置为常量"gkbc8.com"

编译时注意运行库的匹配及预编译器的设置,工程-设置-C\C++ - category(General) 去除了_AFXDLL预编译器,
工程-设置-C\C++ - category(Code Generation) Use Run-time library 设置为Multithreaded

实现功能
1.新建基于对话框的应用程序
2.复制例程根目录文件夹encrypt到自己工程根目录,并在主对话框头文件包含库的头文件及静态库
#include "encrypt\\aes.h"
#include "encrypt\\md5.h"
#include "encrypt\\modes.h"
#include "encrypt\\filters.h"
using namespace CryptoPP;
#pragma comment( lib, "encrypt\\cryptlib.lib")
3.依照例程界面添加编辑框IDC_EDIT1,IDC_EDIT2,IDC_EDIT3对应:解密后文本,加密后密文和供用户输入的密码,添加按钮<加密指定文件↓><解密↑>关联按钮的点击函数

void CGkbc8Dlg::OnEncrypt()
{
CString sFilePath;
byte iv[AES::BLOCKSIZE] = "gkbc8.com";//设置向量组, 可随机,加密 解密须使用相同
CString sPassword,sText;//字符串及加密密码
GetDlgItemText(IDC_EDIT3,sPassword);//设置的aes 密钥(最长16)
if(sPassword.GetLength()>AES:EFAULT_KEYLENGTH)
{
sPassword.Format("密码长度范围:0-%d",AES:EFAULT_KEYLENGTH);
MessageBox(sPassword);
return;
}
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"txt文件(*.TXT)|*.TXT|all(*.*)|*.*||");
if(dlg.DoModal() == IDOK)
{
sFilePath = dlg.GetPathName();
CFile file;
file.Open(sFilePath,CFile::modeRead|CFile::typeBinary);
char *pBuffer = new char[file.GetLength()];
file.Read(pBuffer,file.GetLength());
sText = pBuffer;
delete []pBuffer;
}
if(sText.IsEmpty())
return;

//<> 加密处理
AES::Encryption aesEncryption;
aesEncryption.SetKey( (unsigned char *)sPassword.GetBuffer(0), AES:EFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
//等同于下面两句构建基于AES 算法的CBC模式
//CBC_Mode<AES>::Encryption cbcEncryption;
//cbcEncryption.SetKeyWithIV(key, AES:EFAULT_KEYLENGTH, iv);
std::string strCiphertext = "";//保存输出密文
StreamTransformationFilter stfEncryptor(cbcEncryption, new StringSink(strCiphertext));
stfEncryptor.Put( (byte*)sText.GetBuffer(0),sText.GetLength());
stfEncryptor.MessageEnd();

//<>保存密文到文件中
sFilePath.Insert( sFilePath.ReverseFind('.'),"_Encrypted");
CFile FileSave;
FileSave.Open(sFilePath,CFile::modeCreate|CFile::modeWrite);
FileSave.Write((byte*)strCiphertext.c_str(),strCiphertext.size());
FileSave.Close();
//<>显示
CString sShow,sTemp;
int iCipherTextSize = strCiphertext.size();
for( int i = 0; i<iCipherTextSize; i++)
{
sTemp.Format("%02x",0xFF & static_cast<byte>(strCiphertext ) );
sShow+=sTemp;
}
SetDlgItemText(IDC_EDIT2, sShow);
}
我们来演示下功能实现的整个过程
  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索