文章目录
前言
- cryptopp是什么?
- 如何下载cryptopp?
- 如何在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++下载地址
- 官网地址:https://www.cryptopp.com/#download
- github地址(8.7.0版本):https://github.com/weidai11/cryptopp/releases/tag/cryptopp_8_7_0
有四个选项,请下载源码(如图所示)
3. 下载pem包
- pem包官方地址:https://cryptopp.com/wiki/pem_pack
滑动页面至底部,下载(如图所示)
三、在vs2022中使用cryptopp库
4. 处理crypto++源文件
- 打开下载并解压好的crypto++文件和pem包,将pem包中包含的全部文件复制粘贴到crypto++包中:
图1是解压后的pem包
图2为pem包中包含的所有文件
- 将图2中所有文件粘贴到图3所示解压后的crypto++文件中,双击打开crypto++文件中的cryptest.sln:
- 在vs2022中可以看到四个子工程(如图所示):
- cryptdll - 生成cryptopp.dll动态库
- dlltest - 用来测试cryptopp.dll,依赖cryptdll工程
- cryptlib - 生成cryptlib.lib静态库
- cryptest - 用来测试cryptopp,依赖cryptlib工程
- 往crypto++源文件中加入pem包:
右击“header files”->添加->现有项:
右击“source files”->添加->现有项:
5. build子工程cryptlib,生成lib文件
分别在release和debug两个情况下,调整设备型号(本机是x64),右击子工程cryptlib点击“生成”。输出显示成功后即为完成。
此时,crypto++源文件夹下会多出一个名称为x64的文件夹,该文件夹下有三个子文件夹,其中一个名为output,output文件夹下有两个子文件夹,如图所示。debug和release文件夹下都有lib文件,这两个lib文件就是我们后面要使用的lib库。
- 处理crypto++文件:
新建文件夹,命名为cryptopp(或其他名称),文件夹下创建两个文件夹,分别命名为include,lib。
- 将crypto++源文件中所有头文件(.h结尾的文件)复制到新文件夹下的include文件夹下。
- 将上述output文件夹复制粘贴到新建文件夹下的lib文件中。
至此,我们需要用到crypto++库整理完成。简而言之,从官网上下载下来的整个crypto++源码,我们只需要用到include和lib两个库文件。
5. 在vs2022项目中使用crypto++库
-
打开vs2022,文件->新建->项目->控制台应用
-
将新创建的项目中原本的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;
}
-
项目->属性
跟着图片进行修改选项:
a. 此处修改为我们新建的文件夹下的include文件路径。
b.留心你现在的模式是release还是debug。release对应的运行库是/mt
,debug对应的是/mtd
。
c.此处修改为我们新建的文件夹下的lib文件下路径。查看自己的配置,debug对应的是debug文件下的路径;release对应的是release文件下的路径。
d. 选择“链接器”中的“输入”,在“附加依赖项”添加“cryptlib.lib” -
运行测试代码,出现结果图则为crypto++配置成功。
四、运行代码后一些关于c++的错误总结
- 关于vs中多个源文件如何分开运行的解决方法
参考博文: - c++中setw()与setfill()的用法详情:
- c++ - “std” has no member “string”:
最后,由于crypto++的官方文档wiki资料不全面,非常感谢以下博文的贡献:
发表评论