轻松看懂的加解密系列(6) —— Crypto++库的神秘作者及编译应用实践

介绍Crypto++库,八卦其神秘作者

        Crypto++ Library 是一个非常著名的开源密码学库。它是用C++编写的,提供了广泛的密码学功能,可以用于安全通信、数据加密、数字签名、密码学研究等领域。以下是Crypto++库的一些主要特点和功能:

  1. 丰富的密码学算法支持:Crypto++支持多种密码学算法,包括对称加密算法(如AES、DES、Blowfish)、非对称加密算法(如RSA、DSA、ECC)、哈希函数(如SHA-1、SHA-256、MD5)、数字签名、伪随机数生成器等。

  2. 跨平台支持:Crypto++可在多种操作系统上运行,包括Windows、Linux、macOS等。它使用了标准的C++语言特性,因此可以轻松地在不同平台上编译和使用。

  3. 高性能:该库被设计为高性能的密码学库,经过了优化以提供快速的加密和解密速度。

  4. 开源:Crypto++是开源项目,遵循自由软件许可协议,允许用户查看、修改和分发源代码。

  5. 广泛的应用:Crypto++在许多领域都有广泛的应用,包括网络安全、加密通信、数字证书、虚拟私人网络(VPN)、数据库加密、密码学研究等。

  6. C++标准库兼容性:Crypto++与C++标准库兼容,易于集成到C++应用程序中。

  7. 强大的社区支持:Crypto++拥有活跃的开发者社区,提供文档、教程和论坛支持,以帮助开发人员使用和理解库的功能。

        不过相对于Crypto++的知名度,该库的创建者 Wei Dai 却行事极为低调,以至于在互联网上几乎找不到一张能够证明他本人的照片。如【图-1】他本人的个人主页里就有这样一句话——“请注意,截至撰写本文时,互联网上任何声称的我的照片实际上都是其他名为 Wei Dai 的人的照片。

        在Crypto++ Library 网站【https://www.cryptopp.com/】的最下方可以找到他本人充满“古早味”的主页【http://www.weidai.com/】。最后的编辑时间可以证明至少他最近几年还更新过此页面,页面的内容主要包括计算机、社会经济、科学和哲学等方面。

图-1 Wei Dai 的个人主页,其中包含 b-money 一文

        如今,当你翻看比特币白皮书时【https://bitcoin.org/bitcoin.pdf】,你会发现参考文献的第一条正是来自于Wei Dai于1998年发布的“B-Money”。这样的牛人真可谓是远离江湖,但江湖始终有他的传说。

图-2 比特币白皮书原文的引用部分

       

        正当你心里暗自担心他本人是否安好时,在他经常光顾的社区博客“Less Wrong”个人页面上【图-3】,还可以看见他发表的最新一个话题的创建时间就在上个月。另一篇,大约在去年发表的关于讨论中国控制新冠政策的话题,似乎可以说明他大概率是一个华人。

图-3

        LessWrong是一个追求理性和知识分享的在线社区,旨在推动深入的哲学和科学思考,社区的内容和讨论可能涉及复杂的哲学和科学问题,因此需要一定的背景知识和思维深度来参与。 所以世外高人的思考深度和卓越品味确实是我们难以企及的,八卦到此结束。总的来说,Wei Dai 最近状态良好!他们这类人常常保持低调,我们不必担心他。接下来让我们继续努力学习,离开一直依靠的 Windows 系统加解密接口,尝试着编译 Crypto++库,并运用库接口进行一次编程实践。

学以致用——运用文件签名和哈希验证文件的真实性和完整性

        Crypto++库的最新版本就在前天刚发布【图-4】,并附加了发布的压缩包的主要哈希值类型【图-5】、公钥和数字签名文件【图-7】。

图-4 最新版本为 8.9.0

验证哈希值:

图-5 最新版本的哈希值

图-6 cryptopp890.zip压缩包本地计算的哈希值都匹配发布值

        运用 Windows 自带的 certutil 工具可以很方便的得到压缩包的各种哈希值,并与发布值进行比对,以验证发布的软件包的完整性,如【图-6】。

验证数字签名:

图-7 最新版本的数字签名验证方法以及公钥

图-8 导入公钥并验证压缩包的数字签名

        数字签名的验证也不复杂,只要确保已经安装了GnuPG并且在命令行中可用,就可以如【图-8】所示,先导入另存为【sac】文件格式的公钥,再将下载了的压缩包及其签名文件【sig文件】进行验证即可。结果表明,成功验证了cryptopp890.zip 的数字签名,并且签名是有效的。下面是对各个部分的解释:

  1. Signature made 10/2/2023 12:53:50 AM China Standard Time:这是签名的时间戳,表示签名是在指定时间创建的。

  2. using RSA key B8CC19802062211A508B2F5CCE0586AF1F8E37BD:这部分表示用于签名的RSA密钥的指纹。这个密钥与签名一起使用来验证签名的有效性。

  3. Good signature from "Jeffrey Walton (Crypto++ Release) noloader@gmail.com" [unknown]:这表示签名是由"Jeffrey Walton (Crypto++ Release)"这个用户使用RSA密钥创建的,签名有效。

  4. WARNING: This key is not certified with a trusted signature!:这是一个警告,表示使用于签名的密钥尚未通过受信任的签名验证。这意味着您尚未建立对该密钥的绝对信任,但签名本身是有效的。

  5. There is no indication that the signature belongs to the owner.:这个消息进一步指出,没有迹象表明该签名属于密钥的所有者。这可能是因为您尚未建立对该密钥所有者的信任级别。

  6. Primary key fingerprint: B8CC 1980 2062 211A 508B 2F5C CE05 86AF 1F8E 37BD:这是签名密钥的指纹,可用于验证密钥的身份。

        验证成功意味着签名有效,但本地尚未建立对密钥所有者的绝对信任。这是一个常见的情况,特别是对于开源项目的签名。至此,已经可以安全地使用这个文件了。

编译Crypto++库,并运用库编程实战

第一步:编译 cryptlib

图-9 打开cryptest.sln,用 VS2022(v143) 编译 x64 Debug 版本的 cryptlib

图-10 x64 Debug 版本的 cryptlib.lib

第二步:编写测试程序

图-11 测试程序的编译选项需要兼容引用的 lib 程序

图-12 测试程序需要链接正确的 lib 路径和文件

#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哈希

图-13 测试程序计算出的压缩包 SHA256 哈希值

         可以发现无论是官方发布的压缩包的 SHA256 哈希值,还是用 certutil 工具计算出的哈希值,以及引用了 Crypto++库的测试程序计算出的哈希值,都是一样的。

系列总结:

        到目前为止,我们已经结束了一系列关于加密和解密的文章。然而,安全这一领域是一个永无止境的研究方向。我希望每一个对这个领域充满兴趣的人都能通过不断的学习和努力,取得自己满意的成就。让我们继续前进,探索安全世界的更多奥秘!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值