359上位机VC MFC利用外部库实现文件MD5校验
实现文件MD5校验
功能展示
MD5校验最基本的用法就是计算Hash值,一个Hash函数是一个多对一的映射,可以输入任意长度的消息或文件,输出却是一个固定长度的消息,而且,只要有一点很微小的差异的两个消息/文件之间的Hash值也会有很大的差异,根据两个不同的Hash值就可以判断对应的两个消息是不同的。所以Hash函数通常用于数字签名和消息的完整性检测等等一些安全性方面的应用,当前例程利用开源库实现指定文件MD5值的计算,效果如图,选择要校验的文件后点击按钮,就会将MD5校验值计算并显示出来,修改文件内容,再计算的结果也不同;
要点提示
例程使用外部开源库实现文件MD5校验码计算,库工程文件可以官网下载,编辑后可获得静态文件及头文件,例程已打包在根目录文件夹encrypt内,开发工程时复制到自己工程根目录就可使用;
计算文件的Hash值在这个密码库的支持下比较简单,用下面的一行代码就行。
FileSource f(sFile, true, new HashFilter(md5, new HexEncoder(new ArraySink((unsigned char *)buffer,2 * MD5:IGESTSIZE))));
这一行代码总共用了4个类ArraySink、HexEncoder、HashFilter和FileSource。首先用类ArraySink复制一个2 * MD5:IGESTSIZE 字节的buffer存储缓冲区,接着用类HexEncoder把这个缓冲区转换为16进制。计算Hash值主要用到类HashFilter。类FileSource是把要计算Hash值的文件sFile进行一定的转换放入临时缓冲区,然后调用实例化的HashFilter对其进行计算相应Hash函数的Hash值。
编译时注意运行库的匹配及预编译器的设置,工程-设置-C\C++ - category(General) 去除了_AFXDLL预编译器,
工程-设置-C\C++ - category(Code Generation) Use Run-time library 设置为Multithreaded
实现功能
1.新建基于对话框的应用程序
2.复制工程根目录开源库的文件夹encrypt复制到自己工程根目录,并在主对话框头文件包含库头文件
#include "encrypt\\files.h"
#include "encrypt\\hex.h"
#include "encrypt\\md5.h"
#pragma comment(lib,"encrypt\\cryptlib.lib")
using namespace CryptoPP; //使用名字空间CryptoPP
3.依照例程界面添加编辑框IDC_EDIT1, IDC_EDIT2作为文件是输入及MD5码的显示,添加按钮<选择文件><计算文件MD5校验码>关联按钮的点击函数
void CGkbc8Dlg::OnChoose()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"");
if(dlg.DoModal() == IDOK)
SetDlgItemText(IDC_EDIT1,dlg.GetPathName());
}
void CGkbc8Dlg::OnCheck()
{
CString sFile;
GetDlgItemText(IDC_EDIT1,sFile);
MD5 md5;
char buffer[MD5:IGESTSIZE];
FileSource f(sFile, true, new HashFilter(md5, new HexEncoder(new ArraySink((unsigned char *)buffer,2 * MD5:IGESTSIZE))));
//<>
sFile = buffer;
sFile = sFile.Left(sFile.Find('\r'));
SetDlgItemText(IDC_EDIT2,sFile);
}
我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|