crpto++
- 下载
- 按个人喜好下载,我使用了图中框选的8.8.0 Release.
- 解压
- 安装
- 打开
- 修改以适应本机配置
- 整理至标准库
- 调用
- 加解密使用
Crypto++(也称为Crypto++ Library或Crypto++ STL)是一个C++密码学库,它提供了各种密码学算法和安全编程工具,使开发人员能够实现数据的加密、解密、签名、验证和其他密码学操作。Crypto++是一个开源项目,具有广泛的应用领域,包括网络通信、数据存储、安全协议、数字签名、加密文件系统等。
以下是Crypto++库的一些重要特点和功能:
-
丰富的密码学算法支持:Crypto++支持多种常见的密码学算法,包括对称加密(如AES、DES、3DES)、非对称加密(如RSA、DSA、ECC)、哈希函数(如SHA-1、SHA-256)、消息认证码(MAC)、数字签名、随机数生成器等。它还包括一些高级密码学功能,如密码模式、密码学模板库等。
-
跨平台:Crypto++是跨平台的,可以在多个操作系统(如Windows、Linux、macOS等)上运行,并且具有良好的可移植性。
-
高性能:Crypto++库经过优化,具有较高的性能,适用于要求快速加密和解密的应用程序。
-
开源和自由:Crypto++是一个开源项目,采用公共领域(Public Domain)许可证,因此可以自由使用、修改和分发,无需担心知识产权问题。
-
标准C++编写:Crypto++是用标准C++编写的,因此它与C++标准库和其他C++代码兼容。
-
灵活的API:Crypto++提供了一个灵活的API,使开发人员能够轻松地集成密码学功能到他们的应用程序中。
-
详细的文档和示例:Crypto++附带了丰富的文档和示例,帮助开发人员学习如何使用库中的功能。
Crypto++库是一个受欢迎的密码学库,许多安全敏感的应用程序和系统都在使用它来保护数据的安全性。它提供了强大的密码学工具,使开发人员能够构建安全可靠的应用程序。无论是加密通信、数字签名、文件加密还是其他密码学任务,Crypto++都是一个强大的工具。如果需要在C++应用程序中实现密码学功能,Crypto++是一个值得考虑的选择。
下载
按个人喜好下载,我使用了图中框选的8.8.0 Release.
官网下载
解压
安装
打开
修改以适应本机配置
-
选用Release\Debug、Win32\x64,以Release-x64为例;
-
选中cryptlib -> 属性 -> Windows SDK版本,适配当前VS版本
-
C++ -> 代码生成 -> 运行库 (debug后面加d)
-
右键cryptlib、生成;
-
修改其他三个SDK, 可以直接选中、右键、重定向项目更改
-
重新生成cryptdll
-
结果x64中DLL_Output和Output的生成的结果
整理至标准库
- 创建文件夹cryptopp,并创建子文件夹bin、include、lib
- 将解压包中所有的.h文件拷贝至include文件夹中,图中只显示部分.h文件
- 将Output是生成的结果cryptopp.dll拷贝至bin中
- 将.lib拷贝至lib文件夹中
调用
vs标准添加库方法,复述一遍。知道的可跳过。
- 右键、属性\也可以在属性管理中对应的环境添加属性表,项目中只要添加对应属性表就可以调用对应库。
- VC++ 目录中:
- 包含目录添加上述include文件夹
- 库目录添加上述lib文件夹
- 链接器 -> 输入 -> 附加依赖项添加:cryptlib.lib 、cryptopp.lib
加解密使用
#include <aes.h>
#include <modes.h>
#include <filters.h>
#include <osrng.h>
#include <hex.h>
int main()
{
using namespace CryptoPP;
AutoSeededRandomPool rng;
// 创建一个随机密钥
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
rng.GenerateBlock(key, key.size());
// 创建一个随机IV(初始化向量)
SecByteBlock iv(AES::BLOCKSIZE);
rng.GenerateBlock(iv, iv.size());
// 要加密的字符串
std::string plaintext = "Hello, World!";
std::string ciphertext;
// 加密
CBC_Mode<AES>::Encryption encryption;
encryption.SetKeyWithIV(key, key.size(), iv);
StringSource(plaintext, true, new StreamTransformationFilter(encryption,
new HexEncoder(
new StringSink(ciphertext))));
std::cout << "加密后的字符串: " << ciphertext << std::endl;
// 解密
std::string decryptedtext;
CBC_Mode<AES>::Decryption decryption;
decryption.SetKeyWithIV(key, key.size(), iv);
StringSource(ciphertext, true, new HexDecoder(
new StreamTransformationFilter(decryption, new
StringSink(decryptedtext))));
std::cout << "解密后的字符串: " << decryptedtext << std::endl;
return 0;
}