QQ登录

只需一步,快速开始

356上位机VC MFC利用外部库实现DES加密解密

[ 复制链接 ]

DES加密解密
功能展示
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,我们当前例程利用外部开源库实现数据加密解密功能,效果如图,输入文本,及密码,点击加密,会得到加密密文并显示出来,点击解密,程序会用输入的密码解密经过加密的密文

要点提示
例程使用的是开源库CRYPT++,库可从官网下载编辑得到cryptlib.lib及全部头文件,使用时注意VC运行库的匹配,及预编译器的设置;
实现DES加密主要用到类DESEncryption,通过类成员函数SetKey()设置加密密钥,通过ProcessBlock()进行加密处理;
void SetKey(const byte *key, size_t length, const NameValuePairs &params = g_nullNameValuePairs);
Key为密钥字符, length为字符长度;
void ProcessBlock(const byte *inBlock, byte *outBlock)
inBlock为要加密的文本字符, outBlock为经过加密的密文;
实现解密主要用到类DESDecryption,通过类成员函数SetKey()设置加密密钥,通过ProcessBlock()进行加密处理;
void ProcessBlock(const byte *inBlock, byte *outBlock)
inBlock为经过加密的密文, outBlock为解密后的文本;

实现功能
1.新建基于对话框的应用程序
2.例程根目录将用到的开源库文件夹encrypt复制到自己工程根目录,并在主对话框类包含头文件及成员变量
#include"encrypt\\des.h"
#pragma comment(lib, "encrypt\\cryptlib.lib")
using namespace CryptoPP;

CString m_sText;//要加密文本
unsigned char m_cEndrypted[ DES::BLOCKSIZE ];//保存加密密文
3.依照例程界面添加编辑框IDC_EDIT1, IDC_EDIT2, IDC_EDIT3分别对应文本,密码及加密密文的显示;
添加按钮<加密><解密>关联按钮的点击函数
void CGkbc8Dlg::OnButton1() //加密
{
CString sKey,sText;
GetDlgItemText(IDC_EDIT2,sKey);//密钥
GetDlgItemText(IDC_EDIT1,sText);//要加密文本
if(sKey.IsEmpty()||sKey.GetLength()>8)
{
MessageBox("密码长度保证在0-8之间");
return;
}
if(sText.IsEmpty()||sText.GetLength()>8)
{
MessageBox("文本长度保证在0-8之间");
return;
}
m_sText = sText;
//<>
unsigned char cKey[DES::KEYLENGTH];
unsigned char cText[ DES::BLOCKSIZE ];
unsigned char cEndrypted[ DES::BLOCKSIZE ];
memset(cKey,0,sizeof(cKey));
memset(cText,0,sizeof(cText));
memset(cEndrypted,0,sizeof(cEndrypted));

for(int i=0;i<sKey.GetLength();i++)
{
cKey = sKey.GetAt(i);
}
for(i=0;i<sText.GetLength();i++)
{
cText = sText.GetAt(i);
}
//<>加密处理
DESEncryption encryption_DES;//构造一个加密器
encryption_DES.SetKey(cKey, DES::KEYLENGTH);//设置密匙
encryption_DES.ProcessBlock( cText, m_cEndrypted );//进行加密
//<>显示密文
SetDlgItemText(IDC_EDIT3,(char*)m_cEndrypted);
}
void CGkbc8Dlg::OnButton2() //解密
{
CString sKey,sEncrypted;
GetDlgItemText(IDC_EDIT2,sKey);//密钥

if(sKey.IsEmpty()||sKey.GetLength()>8)
{
MessageBox("密码长度保证在0-8之间");
return;
}
unsigned char cKey[DES::KEYLENGTH];
unsigned char cDecrypted[ DES::BLOCKSIZE ];
strcpy( (char*)cKey,sKey.GetBuffer(0));


DESDecryption decryption_DES;//构造一个解密器
decryption_DES.SetKey( cKey, DES::KEYLENGTH );
decryption_DES.ProcessBlock(m_cEndrypted, cDecrypted);
if( memcmp(cDecrypted,(char*)m_sText.GetBuffer(0),m_sText.GetLength())!=0 )
{
MessageBox("密码错误");
return;
}
MessageBox("密码正确");
}
我们来演示下功能实现的整个过程

  

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

  

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

  

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



回复

使用道具 举报

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