C++ 好用的加密庫(kù):Crypto++
隨著信息技術(shù)的快速發(fā)展,數(shù)據(jù)安全和隱私保護(hù)越來(lái)越受到重視。
在許多應(yīng)用場(chǎng)景中,需要使用密碼學(xué)算法來(lái)保護(hù)數(shù)據(jù)的安全性和完整性。
Crypto++ 庫(kù)提供了一個(gè)方便的途徑來(lái)使用這些算法,它是一個(gè)廣泛使用的開(kāi)源密碼學(xué)庫(kù)。
Crypto++
Crypto++ 是一個(gè)開(kāi)源的加密庫(kù),用于加密、解密、散列、簽名、驗(yàn)證等密碼學(xué)操作。
Crypto++ 是一個(gè) C++ 庫(kù),提供了豐富的密碼學(xué)算法,例如公鑰加密(RSA, DSA),對(duì)稱加密(AES, DES, RC6),哈希函數(shù)(SHA-1, SHA-2),消息認(rèn)證碼(HMAC)等,支持各種應(yīng)用場(chǎng)景。
Crypto++ 提供了豐富的密碼學(xué)算法,包含許多在密碼學(xué)中常用的加密算法和協(xié)議。
基本特性:
- 支持多種加密算法:Crypto++ 支持多種對(duì)稱加密算法(如 AES、DES、3DES 等)和公鑰加密算法(如 RSA、ECC 等)。
- 易于使用:Crypto++ 提供了簡(jiǎn)單的 API,使得密碼學(xué)操作變得容易理解和實(shí)現(xiàn)。
- 平臺(tái)獨(dú)立:Crypto++ 庫(kù)可以在各種平臺(tái)上運(yùn)行,包括 Windows、Linux 和 macOS 等。
- 安全可靠:Crypto++ 使用了經(jīng)過(guò)廣泛驗(yàn)證的密碼學(xué)算法和模式,保證了數(shù)據(jù)的安全性和完整性。
Crypto++ 編譯
1.概述
Crypto++ 源碼下載地址:https://github.com/weidai11/cryptopp
2.打開(kāi) Visual Studio 工程
Visual Studio 打開(kāi) 目錄中的 sln 工程文件:
選擇 cryptlib 項(xiàng)目,編譯其靜態(tài)庫(kù)即可:
修改 Windows SDK 版本:
修改運(yùn)行庫(kù)為 MD :
先編譯 Debug 版本:
繼續(xù)編譯 Release 版本:
編譯結(jié)果在當(dāng)前的 Output 目錄中:
3.整理庫(kù)文件
為方便使用,可以把相關(guān)文件整理到一個(gè)文件夾:
其中 include 中拷貝源碼目錄中的所有頭文件:
Crypto++ 庫(kù)使用
1.項(xiàng)目設(shè)置
(1) 頭文件引用
在項(xiàng)目設(shè)置中添加頭文件引用:
(2) 庫(kù)文件引用
在項(xiàng)目設(shè)置中添加庫(kù)文件查找路徑:
添加要引用的庫(kù)文件:
2.代碼示例
下面是一個(gè)使用 Crypto++ 庫(kù)進(jìn)行了 AES 加密和解密的簡(jiǎn)單示例:
#include <iostream>
#include <string>
#include <aes.h>
#include <modes.h>
#include <filters.h>
int main()
{
using namespace CryptoPP;
// 明文和密鑰
std::string plainText = "Hello, Crypto++!";
std::string keyStr = "0123456789abcdef"; // 設(shè)置密鑰字符串
byte key[AES::MAX_KEYLENGTH];
memset(key, 0x00, AES::MAX_KEYLENGTH);
size_t keyLen = keyStr.length() < AES::MAX_KEYLENGTH ? keyStr.length() : AES::MAX_KEYLENGTH;
memcpy(key, keyStr.c_str(), keyLen);
// 加密過(guò)程
byte iv[AES::BLOCKSIZE];
memset(iv, 0x00, AES::BLOCKSIZE);
std::string cipherText;
{
CFB_Mode<AES>::Encryption encr;
encr.SetKeyWithIV(key, AES::MAX_KEYLENGTH, iv);
StringSource(plainText, true, new StreamTransformationFilter(encr, new StringSink(cipherText)));
}
// 打印密文
std::cout << "密文: " << std::string(cipherText.begin(), cipherText.end()) << std::endl;
// 解密過(guò)程
std::string recoveredText;
{
CFB_Mode<AES>::Decryption decr;
decr.SetKeyWithIV(key, AES::MAX_KEYLENGTH, iv);
StringSource(cipherText, true, new StreamTransformationFilter(decr, new StringSink(recoveredText)));
}
// 打印解密后的明文
std::cout << "明文: " << recoveredText << std::endl;
return 0;
}
運(yùn)行結(jié)果如下: