# 基于Crypto++计算数据或文件的SHA1值
# 背景
写了一个基于Crypto++加密库中实现计算文件和数据的SHA1值的一个小程序,Crypto++加密库就不详细介绍了,这个库提供了很多知名的加解密算法,直接调用就好了,使用起来还是比较方便的。
写这篇文章,就是分享自己的学习心得。自己的密码学部分的知识学得不怎么好,还好有Crypto++开源库可以使用,弥补了对加解密部分的不足。现在,向大家分享使用Crypto++中的SHA1模块实现文件和数据的SHA1值计算方法。
# 程序编译设置注意事项
首先,先要下载Crypto++库的开源代码,然后,自己编译得到Crypto++的库文件。下载链接还有具体的编译步骤,可以参考分享文章 "[使用VS2013编译Crypto++加密库](https://www.write-bug.com/article/1559.html "使用VS2013编译Crypto++加密库")",里面有详细介绍。
在导入Crypto++的库文件到自己的工程项目的时候,要对自己的工程项目进行编译设置。主要一点就是:项目工程的属性中的“运行库”设置,要与编译Crypto++的库文件时设置的“运行库”选项要对应一致,否则程序会编译不过的。也就是要检查LIB库工程和本测试工程的:属性 --> C/C++ --> 代码生成 --> 运行库 是否统一。
如果编译出错,报告XX重复定义等错误,同样,要检查LIB库工程和本测试工程的:属性 --> C/C++ --> 代码生成 --> 运行库 是否统一。
# 实现原理
计算文件和数据的SHA1值,它们的实现核心代码为:
```c++
FileSource(pszFileName, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));
```
```c++
StringSource(pData, dwDataSize, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));
```
这两行代码总共用了4个类 StringSink、HexEncoder、HashFilter、FileSource 和 StringSource。而且,这两行代码的主要区别就是 FileSource 和 StringSource 的区别。FileSource 的第一个参数只需要传入文件路径名称即可,而 StringSource 第一第二个参数分别表示数据首地址指针和数据大小。
其它参数表示的意义都是相同的,首先用类 StringSink 添加到一个 string 对象缓冲区,接着用类 HexEncoder 把这个缓冲区转换为 16 进制。其中,计算 Hash 值主要用到类 HashFilter。FileSource 类是把要计算 Hash 值的文件 filename 进行一定的转换放入临时缓冲区,然后调用实例化的 HashFilter 对其进行计算相应 Hash 函数的Hash值,并把 Hash 值返回到缓冲区中。而 StringSource 类是把要计算 Hash 值的数据直接传递给 HashFilter,然后调用实例化的 HashFilter 对其进行计算相应 Hash 函数的Hash值,并把 Hash 值返回到缓冲区中。
# 编码实现
## 计算文件的SHA1
```c++
// 计算文件的 SHA1 值
string CalSHA1_ByFile(char *pszFileName)
{
string value;
SHA1 sha1;
FileSource(pszFileName, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));
return value;
}
```
## 计算数据的SHA1
```c++
// 计算数据的 SHA1 值
string CalSHA1_ByMem(PBYTE pData, DWORD dwDataSize)
{
string value;
SHA1 sha1;
StringSource(pData, dwDataSize, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));
return value;
}
```
# 程序测试
我们运行程序,分别使用文件和数据两种方式来计算 520.exe 的 SHA1 值,结果两个值都相同:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/7a261d7b9a92f12872a441b4673bea2b.writebug)
# 总结
这个程序不是很复杂,使用起来比较简单。大家在使用的过程中,注意区分下文件的计算和数据的计算之间的差别即可。
# 参考
参考自《[Windows黑客编程技术详解](https://www.write-bug.com/article/1811.html "Windows黑客编程技术详解")》一书
没有合适的资源?快使用搜索试试~ 我知道了~
精选_基于Crypto++计算数据或文件的SHA1值_源码打包
共151个文件
h:137个
cpp:3个
exe:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 195 浏览量
2022-03-10
12:54:33
上传
评论
收藏 483KB ZIP 举报
温馨提示
基于Crypto++计算数据或文件的SHA1值
资源推荐
资源详情
资源评论
收起资源包目录
精选_基于Crypto++计算数据或文件的SHA1值_源码打包 (151个子文件)
SHA1Test.cpp 2KB
SHA1_Test.cpp 658B
stdafx.cpp 207B
SHA1_Test.exe 477KB
SHA1_Test.exe 280KB
SHA1_Test.vcxproj.filters 1KB
cryptlib.h 73KB
pubkey.h 63KB
filters.h 33KB
misc.h 29KB
gfpcrypt.h 19KB
modes.h 17KB
polynomi.h 16KB
config.h 15KB
integer.h 13KB
secblock.h 13KB
algparam.h 12KB
strciphr.h 12KB
asn.h 12KB
gf2n.h 12KB
eccrypto.h 10KB
algebra.h 9KB
serpentp.h 8KB
luc.h 8KB
network.h 8KB
seckey.h 7KB
simple.h 7KB
wait.h 7KB
cpu.h 6KB
pwdbased.h 6KB
nbtheory.h 6KB
socketft.h 6KB
rsa.h 6KB
oids.h 5KB
modarith.h 5KB
xtr.h 5KB
mqv.h 5KB
ida.h 5KB
smartptr.h 5KB
ecp.h 5KB
zinflate.h 4KB
elgamal.h 4KB
des.h 4KB
osrng.h 4KB
argnames.h 4KB
factory.h 4KB
channels.h 4KB
zdeflate.h 4KB
panama.h 4KB
queue.h 4KB
ec2n.h 4KB
esign.h 4KB
iterhash.h 4KB
tea.h 3KB
winpipes.h 3KB
files.h 3KB
dh.h 3KB
mqueue.h 3KB
gcm.h 3KB
lubyrack.h 3KB
ccm.h 3KB
rabin.h 3KB
default.h 3KB
eprecomp.h 3KB
pkcspad.h 3KB
vmac.h 3KB
eax.h 3KB
rw.h 3KB
basecode.h 3KB
pssr.h 2KB
wake.h 2KB
dmac.h 2KB
sha.h 2KB
arc4.h 2KB
fips140.h 2KB
safer.h 2KB
cast.h 2KB
mdc.h 2KB
salsa.h 2KB
zlib.h 2KB
gzip.h 2KB
rng.h 2KB
dh2.h 2KB
emsa2.h 2KB
authenc.h 2KB
rc2.h 2KB
fltrimpl.h 2KB
words.h 2KB
rijndael.h 2KB
hmac.h 2KB
xtrcrypt.h 2KB
validate.h 2KB
ripemd.h 2KB
hrtimer.h 2KB
dll.h 2KB
cmac.h 2KB
skipjack.h 2KB
twofish.h 1KB
shark.h 1KB
oaep.h 1KB
共 151 条
- 1
- 2
资源评论
工具盒子
- 粉丝: 60
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功