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.

運行結果如下: