工控编程吧
标题:
358上位机VC MFC利用外部库实现SHA-512 Hash校验
[打印本页]
作者:
qq263946146
时间:
2016-9-19 18:38
标题:
358上位机VC MFC利用外部库实现SHA-512 Hash校验
(, 下载次数: 1)
上传
点击文件名下载附件
实现SHA-512 Hash校验
功能展示
SHA安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准,SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2,我们当前例程利用开源库实现SHA-512校验功能,效果如图,输入文本后,点击计算SHA-512值,例程会计算出校验值并显示出来,要校验进,再点击(校验文本),例程会将编辑框的文本及验证值进行校验来验证文本的否有改变;
要点提示
在学习例程源码时,首先从CRYPT开源库官网下载库工程编辑等到cryptlib.lib及头文件,或直接复制例程根目录文件夹encrypt到自己工程根目录;
例程校验值的计算是通过类SHA512的成员函数实现; CalculateDigest()实现校验值的计算
virtual void CalculateDigest(byte *digest, const byte *input, size_t length) digest为计算出的结果字符串, input为用户输入的用于校验的文本,length为输入文本的长度;
实现功能
1.新建基于对话框的应用程序
2.复制工程根目录文件夹encrypt到自己工程根目录,在主对话框头文件添加第三方库的头文件及库
#include "encrypt\\sha.h"
#include "encrypt\\secblock.h"
#include "encrypt\\modes.h"
using namespace CryptoPP;
#pragma comment( lib, "encrypt\\cryptlib.lib")
3.添加编辑框IDC_EDIT1, IDC_EDIT2分别对应输入文本及计算得出的校验值显示。添加按钮<计算SHA-512 Hash值><校验文本>关联点击函数
void CGkbc8Dlg::OnCalc()
{
CString sText,sHashHex;
GetDlgItemText(IDC_EDIT1,sText);
//<>
SHA512 sha512;
bool bResult = false;
byte *byDigest;//512哈希值
byDigest = new byte[ sha512.DigestSize() ];//64
sha512.CalculateDigest(byDigest, (const unsigned char *)sText.GetBuffer(0),sText.GetLength());
uCharToHex((char *)sHashHex.GetBuffer(0),byDigest,sha512.DigestSize());
SetDlgItemText(IDC_EDIT2,sHashHex);
delete []byDigest;
}
void CGkbc8Dlg::OnCheck()
{
CString sHash,sHashBuffer,sText;
GetDlgItemText(IDC_EDIT1,sText);
GetDlgItemText(IDC_EDIT2,sHash);
//<>
SHA512 sha512;
HexTouChar((unsigned char *)sHashBuffer.GetBuffer(0), sHash.GetBuffer(0), sha512.DigestSize() *2 );
bool bResult =false;
bResult = sha512.VerifyDigest((const unsigned char *)sHashBuffer.GetBuffer(0), (const unsigned char *)sText.GetBuffer(0),sText.GetLength() );
if(bResult)
MessageBox("哈稀值校验成功");
else
MessageBox("校验值与文本不匹配");
}
上面调用有两自定义函数用于字符串,16进制字符串转换
void uCharToHex(char *Dst, const unsigned char *Src, const int SrcLen)
{
char *Temp = Dst;
int i;
if (Dst == NULL || Src == NULL || SrcLen <= 0)
{
return;
}
for (i = 0; i < SrcLen; ++i)
{
sprintf(Temp, "%02X", Src
);
Temp += 2;
}
return;
}
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/394767d2256d9a3f1a5ea27613af6594/0/0/w_19rssvx7e5.swf-albumId=6336476609-tvId=6336476609-isPurchase=0-cnId=12[/iqiyi]
[weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4