C++ 好用的加密庫:Crypto++
隨著信息技術(shù)的快速發(fā)展,數(shù)據(jù)安全和隱私保護越來越受到重視。
在許多應(yīng)用場景中,需要使用密碼學(xué)算法來保護數(shù)據(jù)的安全性和完整性。
Crypto++ 庫提供了一個方便的途徑來使用這些算法,它是一個廣泛使用的開源密碼學(xué)庫。
Crypto++
Crypto++ 是一個開源的加密庫,用于加密、解密、散列、簽名、驗證等密碼學(xué)操作。
Crypto++ 是一個 C++ 庫,提供了豐富的密碼學(xué)算法,例如公鑰加密(RSA, DSA),對稱加密(AES, DES, RC6),哈希函數(shù)(SHA-1, SHA-2),消息認證碼(HMAC)等,支持各種應(yīng)用場景。
Crypto++ 提供了豐富的密碼學(xué)算法,包含許多在密碼學(xué)中常用的加密算法和協(xié)議。
基本特性:
- 支持多種加密算法:Crypto++ 支持多種對稱加密算法(如 AES、DES、3DES 等)和公鑰加密算法(如 RSA、ECC 等)。
- 易于使用:Crypto++ 提供了簡單的 API,使得密碼學(xué)操作變得容易理解和實現(xiàn)。
- 平臺獨立:Crypto++ 庫可以在各種平臺上運行,包括 Windows、Linux 和 macOS 等。
- 安全可靠:Crypto++ 使用了經(jīng)過廣泛驗證的密碼學(xué)算法和模式,保證了數(shù)據(jù)的安全性和完整性。
Crypto++ 編譯
1.概述
Crypto++ 源碼下載地址:https://github.com/weidai11/cryptopp
2.打開 Visual Studio 工程
Visual Studio 打開 目錄中的 sln 工程文件:
選擇 cryptlib 項目,編譯其靜態(tài)庫即可:
修改 Windows SDK 版本:
修改運行庫為 MD :
先編譯 Debug 版本:
繼續(xù)編譯 Release 版本:
編譯結(jié)果在當(dāng)前的 Output 目錄中:
3.整理庫文件
為方便使用,可以把相關(guān)文件整理到一個文件夾:
其中 include 中拷貝源碼目錄中的所有頭文件:
Crypto++ 庫使用
1.項目設(shè)置
(1) 頭文件引用
在項目設(shè)置中添加頭文件引用:
(2) 庫文件引用
在項目設(shè)置中添加庫文件查找路徑:
添加要引用的庫文件:
2.代碼示例
下面是一個使用 Crypto++ 庫進行了 AES 加密和解密的簡單示例:
#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);
// 加密過程
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;
// 解密過程
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;
}
運行結(jié)果如下: