(全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp


前言

  1. Cryptopp是什么?
  2. 如何下载Cryptopp?
  3. 如何在VS中使用Crypto++?

一、Cryptopp是什么?

免费C++库,用于密码方案,最初由Wei Dai编写,包括密码,消息认证代码,单向哈希函数,公钥密码系统,密钥协议方案和压缩压缩。
PEM包:消息加密的部分实现,允许您读取和写入 PEM 编码的密钥和参数,包括加密的私钥。其他文件包括对 RSA、DSA、EC、ECDSA 密钥和 Diffie-Hellman 参数的支持。该包包括五个额外的源文件,一个使用OpenSSL创建测试密钥的脚本,一个用于测试读取和写入密钥的C++程序,以及一个用于验证使用OpenSSL编写的Crypto++编写的密钥的脚本。

1. Cryptopp(CRYPTO++)官方文档wiki

https://cryptopp.com/wiki/Main_Page

二、下载Cryptopp

2. Crypto++下载地址

3. 下载PEM包


三、在VS2022中使用Cryptopp库

4. 处理crypto++源文件

  1. 打开下载并解压好的crypto++文件和pem包,将pem包中包含的全部文件复制粘贴到crypto++包中:

图1是解压后的pem包
在这里插入图片描述
图2为pem包中包含的所有文件
在这里插入图片描述

  1. 将图2中所有文件粘贴到图3所示解压后的crypto++文件中,双击打开crypto++文件中的cryptest.sln:
    在这里插入图片描述
  2. 在VS2022中可以看到四个子工程(如图所示):
  • cryptdll - 生成cryptopp.dll动态库
  • dlltest - 用来测试cryptopp.dll,依赖cryptdll工程
  • cryptlib - 生成cryptlib.lib静态库
  • cryptest - 用来测试cryptopp,依赖cryptlib工程
    在这里插入图片描述
  1. 往crypto++源文件中加入pem包:

右击“Header Files”->添加->现有项:

  • pem.h
  • pem_common.h

右击“Source Files”->添加->现有项:

  • pem_common.cpp
  • pem_read.cpp
  • pem_write.cpp

在这里插入图片描述
5. build子工程cryptlib,生成lib文件
分别在Release和debug两个情况下,调整设备型号(本机是x64),右击子工程cryptlib点击“生成”。输出显示成功后即为完成。

在这里插入图片描述

此时,crypto++源文件夹下会多出一个名称为x64的文件夹,该文件夹下有三个子文件夹,其中一个名为Output,Output文件夹下有两个子文件夹,如图所示。Debug和Release文件夹下都有lib文件,这两个lib文件就是我们后面要使用的lib库。
在这里插入图片描述
在这里插入图片描述

  1. 处理crypto++文件:
    新建文件夹,命名为cryptopp(或其他名称),文件夹下创建两个文件夹,分别命名为include,lib。
    在这里插入图片描述
  • 将crypto++源文件中所有头文件(.h结尾的文件)复制到新文件夹下的include文件夹下。
    在这里插入图片描述

在这里插入图片描述

  • 将上述Output文件夹复制粘贴到新建文件夹下的lib文件中。
    在这里插入图片描述
    至此,我们需要用到crypto++库整理完成。简而言之,从官网上下载下来的整个crypto++源码,我们只需要用到include和lib两个库文件。

5. 在VS2022项目中使用crypto++库

  1. 打开VS2022,文件->新建->项目->控制台应用
    在这里插入图片描述

  2. 将新创建的项目中原本的hello world代码换成以下代码(该代码为crypto++官网给出的AES加密代码)作为测试代码:

#include "cryptlib.h"
#include "rijndael.h"
#include "modes.h"
#include "files.h"
#include "osrng.h"
#include "hex.h"

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    using namespace CryptoPP;

    AutoSeededRandomPool prng;
    HexEncoder encoder(new FileSink(std::cout));

    SecByteBlock key(AES::DEFAULT_KEYLENGTH);
    SecByteBlock iv(AES::BLOCKSIZE);

    prng.GenerateBlock(key, key.size());
    prng.GenerateBlock(iv, iv.size());

    std::string plain = "CBC Mode Test:Hello!";
    std::string cipher, recovered;

    std::cout << "plain text: " << plain << std::endl;

    /*********************************\
    \*********************************/

    try
    {
        CBC_Mode< AES >::Encryption e;
        e.SetKeyWithIV(key, key.size(), iv);

        StringSource s(plain, true,
            new StreamTransformationFilter(e,
                new StringSink(cipher)
            ) // StreamTransformationFilter
        ); // StringSource
    }
    catch (const Exception& e)
    {
        std::cerr << e.what() << std::endl;
        exit(1);
    }

    /*********************************\
    \*********************************/

    std::cout << "key: ";
    encoder.Put(key, key.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    std::cout << "iv: ";
    encoder.Put(iv, iv.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    std::cout << "cipher text: ";
    encoder.Put((const byte*)&cipher[0], cipher.size());
    encoder.MessageEnd();
    std::cout << std::endl;

    /*********************************\
    \*********************************/

    try
    {
        CBC_Mode< AES >::Decryption d;
        d.SetKeyWithIV(key, key.size(), iv);

        StringSource s(cipher, true,
            new StreamTransformationFilter(d,
                new StringSink(recovered)
            ) // StreamTransformationFilter
        ); // StringSource

        std::cout << "recovered text: " << recovered << std::endl;
    }
    catch (const Exception& e)
    {
        std::cerr << e.what() << std::endl;
        exit(1);
    }

    return 0;
}
  1. 项目->属性
    跟着图片进行修改选项:
    a. 此处修改为我们新建的文件夹下的include文件路径。
    在这里插入图片描述
    b.留心你现在的模式是Release还是Debug。Release对应的运行库是/MT,Debug对应的是/MTd
    在这里插入图片描述
    c.此处修改为我们新建的文件夹下的lib文件下路径。查看自己的配置,Debug对应的是Debug文件下的路径;Release对应的是Release文件下的路径。
    在这里插入图片描述
    d. 选择“链接器”中的“输入”,在“附加依赖项”添加“cryptlib.lib”

  2. 运行测试代码,出现结果图则为crypto++配置成功。
    在这里插入图片描述


四、运行代码后一些关于c++的错误总结

  1. 关于VS中多个源文件如何分开运行的解决方法
    参考博文:https://blog.csdn.net/m0_62638970/article/details/121794983
  2. c++中setw()与setfill()的用法详情:https://blog.csdn.net/chen_zan_yu_/article/details/86663579
  3. C++ - “std” has no member “string”:https://blog.csdn.net/cedian0443/article/details/104930355

最后,由于crypto++的官方文档wiki资料不全面,非常感谢以下博文的贡献:

  • 18
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值