赞
踩
Crypto++ Library 是一个非常著名的开源密码学库。它是用C++编写的,提供了广泛的密码学功能,可以用于安全通信、数据加密、数字签名、密码学研究等领域。以下是Crypto++库的一些主要特点和功能:
丰富的密码学算法支持:Crypto++支持多种密码学算法,包括对称加密算法(如AES、DES、Blowfish)、非对称加密算法(如RSA、DSA、ECC)、哈希函数(如SHA-1、SHA-256、MD5)、数字签名、伪随机数生成器等。
跨平台支持:Crypto++可在多种操作系统上运行,包括Windows、Linux、macOS等。它使用了标准的C++语言特性,因此可以轻松地在不同平台上编译和使用。
高性能:该库被设计为高性能的密码学库,经过了优化以提供快速的加密和解密速度。
开源:Crypto++是开源项目,遵循自由软件许可协议,允许用户查看、修改和分发源代码。
广泛的应用:Crypto++在许多领域都有广泛的应用,包括网络安全、加密通信、数字证书、虚拟私人网络(VPN)、数据库加密、密码学研究等。
C++标准库兼容性:Crypto++与C++标准库兼容,易于集成到C++应用程序中。
强大的社区支持:Crypto++拥有活跃的开发者社区,提供文档、教程和论坛支持,以帮助开发人员使用和理解库的功能。
不过相对于Crypto++的知名度,该库的创建者 Wei Dai 却行事极为低调,以至于在互联网上几乎找不到一张能够证明他本人的照片。如【图-1】他本人的个人主页里就有这样一句话——“请注意,截至撰写本文时,互联网上任何声称的我的照片实际上都是其他名为 Wei Dai 的人的照片。”
在Crypto++ Library 网站【https://www.cryptopp.com/】的最下方可以找到他本人充满“古早味”的主页【http://www.weidai.com/】。最后的编辑时间可以证明至少他最近几年还更新过此页面,页面的内容主要包括计算机、社会经济、科学和哲学等方面。
如今,当你翻看比特币白皮书时【https://bitcoin.org/bitcoin.pdf】,你会发现参考文献的第一条正是来自于Wei Dai于1998年发布的“B-Money”。这样的牛人真可谓是远离江湖,但江湖始终有他的传说。
正当你心里暗自担心他本人是否安好时,在他经常光顾的社区博客“Less Wrong”个人页面上【图-3】,还可以看见他发表的最新一个话题的创建时间就在上个月。另一篇,大约在去年发表的关于讨论中国控制新冠政策的话题,似乎可以说明他大概率是一个华人。
LessWrong是一个追求理性和知识分享的在线社区,旨在推动深入的哲学和科学思考,社区的内容和讨论可能涉及复杂的哲学和科学问题,因此需要一定的背景知识和思维深度来参与。 所以世外高人的思考深度和卓越品味确实是我们难以企及的,八卦到此结束。总的来说,Wei Dai 最近状态良好!他们这类人常常保持低调,我们不必担心他。接下来让我们继续努力学习,离开一直依靠的 Windows 系统加解密接口,尝试着编译 Crypto++库,并运用库接口进行一次编程实践。
Crypto++库的最新版本就在前天刚发布【图-4】,并附加了发布的压缩包的主要哈希值类型【图-5】、公钥和数字签名文件【图-7】。
运用 Windows 自带的 certutil 工具可以很方便的得到压缩包的各种哈希值,并与发布值进行比对,以验证发布的软件包的完整性,如【图-6】。
数字签名的验证也不复杂,只要确保已经安装了GnuPG并且在命令行中可用,就可以如【图-8】所示,先导入另存为【sac】文件格式的公钥,再将下载了的压缩包及其签名文件【sig文件】进行验证即可。结果表明,成功验证了cryptopp890.zip
的数字签名,并且签名是有效的。下面是对各个部分的解释:
Signature made 10/2/2023 12:53:50 AM China Standard Time:这是签名的时间戳,表示签名是在指定时间创建的。
using RSA key B8CC19802062211A508B2F5CCE0586AF1F8E37BD:这部分表示用于签名的RSA密钥的指纹。这个密钥与签名一起使用来验证签名的有效性。
Good signature from "Jeffrey Walton (Crypto++ Release) noloader@gmail.com" [unknown]:这表示签名是由"Jeffrey Walton (Crypto++ Release)"这个用户使用RSA密钥创建的,签名有效。
WARNING: This key is not certified with a trusted signature!:这是一个警告,表示使用于签名的密钥尚未通过受信任的签名验证。这意味着您尚未建立对该密钥的绝对信任,但签名本身是有效的。
There is no indication that the signature belongs to the owner.:这个消息进一步指出,没有迹象表明该签名属于密钥的所有者。这可能是因为您尚未建立对该密钥所有者的信任级别。
Primary key fingerprint: B8CC 1980 2062 211A 508B 2F5C CE05 86AF 1F8E 37BD:这是签名密钥的指纹,可用于验证密钥的身份。
验证成功意味着签名有效,但本地尚未建立对密钥所有者的绝对信任。这是一个常见的情况,特别是对于开源项目的签名。至此,已经可以安全地使用这个文件了。
- #include <iostream>
- #include <fstream>
- #include <Windows.h>
- #include "../../../cryptopp890/sha.h"
- #include "../../../cryptopp890/files.h"
- #include "../../../cryptopp890/hex.h"
- using namespace std;
- using namespace CryptoPP;
-
- int main()
- {
- ifstream input("..//..//..//cryptopp890.zip", ios::binary);
- if (!input)
- {
- std::cerr << "cannot open input file." << std::endl;
- return 1;
- }
-
- CryptoPP::SHA256 hash;
- byte digest[CryptoPP::SHA256::DIGESTSIZE];
-
- while (!input.eof())
- {
- char buffer[1024];
- input.read(buffer, sizeof(buffer));
- hash.Update((const byte*)buffer, input.gcount());
- }
-
- hash.Final(digest);
-
- HexEncoder encoder(new CryptoPP::FileSink(std::cout));
- encoder.Put(digest, sizeof(digest));
- encoder.MessageEnd();
-
- return 0;
- }
上述代码中,我们首先打开输入文件(在此示例中为最新版本的压缩包),然后创建了一个SHA-256哈希计算器。接下来,我们循环读取文件内容,并使用hash.Update
方法将数据更新到哈希计算器中。最后,我们使用hash.Final
方法获取哈希值,并将其以十六进制字符串的形式输出到控制台。
可以发现无论是官方发布的压缩包的 SHA256 哈希值,还是用 certutil 工具计算出的哈希值,以及引用了 Crypto++库的测试程序计算出的哈希值,都是一样的。
到目前为止,我们已经结束了一系列关于加密和解密的文章。然而,安全这一领域是一个永无止境的研究方向。我希望每一个对这个领域充满兴趣的人都能通过不断的学习和努力,取得自己满意的成就。让我们继续前进,探索安全世界的更多奥秘!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。