C++ 好用的加密函式庫:Crypto++
2024.03.12
隨著資訊科技的快速發展,資料安全和隱私保護越來越受到重視。
在許多應用場景中,需要使用密碼學演算法來保護資料的安全性和完整性。
Crypto++ 函式庫提供了一個方便的途徑來使用這些演算法,它是一個廣泛使用的開源密碼學函式庫。
加密++
Crypto++ 是一個開源的加密函式庫,用於加密、解密、雜湊、簽章、驗證等密碼學作業。
Crypto++ 是一個C++ 函式庫,提供了豐富的密碼學演算法,例如公鑰加密(RSA, DSA),對稱加密(AES, DES, RC6),雜湊函數(SHA-1, SHA-2),訊息認證碼(HMAC)等,支援各種應用場景。
Crypto++ 提供了豐富的密碼學演算法,包含許多在密碼學中常用的加密演算法和協定。
基本特性:
- 支援多種加密演算法:Crypto++ 支援多種對稱加密演算法(如AES、DES、3DES 等)和公鑰加密演算法(如RSA、ECC 等)。
- 易於使用:Crypto++ 提供了簡單的API,使得密碼操作變得容易理解和實現。
- 平台獨立:Crypto++ 函式庫可以在各種平台上運行,包括Windows、Linux 和macOS 等。
- 安全可靠:Crypto++ 使用了經過廣泛驗證的密碼學演算法和模式,保證了資料的安全性和完整性。
Crypto++ 編譯
1.概述
Crypto++ 原始碼下載位址:https://github.com/weidai11/cryptopp
2.開啟Visual Studio 工程
Visual Studio 開啟目錄中的sln 工程檔案:
選擇cryptlib 項目,編譯其靜態函式庫即可:
修改Windows SDK 版本:
修改運行庫為MD :
先編譯Debug 版本:
繼續編譯Release 版本:
編譯結果在目前的Output 目錄中:
3.整理庫文件
為方便使用,可以把相關文件整理到一個資料夾:
其中include 中拷貝原始碼目錄中的所有頭檔:
Crypto++ 函式庫使用
1.項目設定
(1) 頭檔引用
在項目設定中新增頭檔引用:
(2) 庫文件引用
在專案設定中新增庫文件查找路徑:
新增要引用的庫檔案:
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"; // 设置密钥字符串
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;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
運行結果如下: