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.
 
運行結果如下:
