Crypto++ 是 C++ 界公認最強大的密碼學庫,但其大量模板、策略類別、管道式設計讓初學者望而卻步。本文梳理從源碼編譯、核心概念(管道/過濾器/轉換器)、常用演算法調用,到作者親測封裝 CryptoPP32.dll 供跨語言調用的完整實戰路徑,並附 JavaScript 端 JSBN 互操作驗證方案。
cryptopp5.4,Visual Studio 開啟 cryptlib.vcxproj 編譯靜態庫。StringSource, FileSource)StringSink, FileSink)StringSource(msg, true, new PK_EncryptorFilter(rng, encryptor, new StringSink(cipher)))為簡化調用,作者將高頻操作封裝為 C 風格介面(extern "C"),支援:
關鍵介面範例:
bool RSAES_PKCS_EncryptString(const char* pubFile, const char* msg, std::string& cipher, const char* seed=0);
bool RSAES_PKCS_DecryptString(const char* privFile, const char* cipher, std::string& plain);
bool Base64Encode(const char* plain, std::string& encoded);
#include "CryptoPP32.h"
using namespace CryptoPP32;
int main() {
VL_Serializer Serializer;
VL_REGISTER_SERIALIZABLE_CLASS(&Serializer, TestTree); // 註冊類別
// 1. 生成金鑰對(檔案/字串雙模式)
RSAES_PKCS_GenerateKeys("c:\\privkey.rsa", "c:\\pubkey.rsa");
std::string privStr, pubStr;
RSAES_PKCS_GenerateKeys(privStr, pubStr);
// 2. 公鑰加密、私鑰解密
std::string cipher, plain;
RSAES_PKCS_EncryptString("c:\\pubkey.rsa", "hello world", cipher, "seed123");
RSAES_PKCS_DecryptString("c:\\privkey.rsa", cipher.c_str(), plain);
// 3. JSBN 互操作參數(n, e, d, p, q, dp, dq, u)
char n[] = "C4E3F7..."; // 1024-bit modulus
char e[] = "10001h";
// ... 其餘參數
RSAES_PKCS_EncryptString(n, e, "test", cipher);
RSAES_PKCS_DecryptString(n, e, d, p, q, dp, dq, u, cipher.c_str(), plain);
}
Browser (JSBN) ←→ Server (CryptoPP32.dll)
RSA-PKCS#1 v1.5 加解密
參數格式完全一致:n, e, d, p, q, dp, dq, u
驗證結果:雙向加解密完全相容,無需額外轉換層。
| 坑點 | 解法 |
|---|---|
| 模板錯誤訊息極長 | 善用 using 別名、分步建構管道、靜態分析工具 |
| 隨機數產生器未播種 | 必須使用 AutoSeededRandomPool |
| 金鑰長度過短(<2048 bit) | 生產環境至少 2048,建議 3072/4096 |
| OAEP vs PKCS#1 v1.5 混用 | 雙端協議統一,OAEP 更安全 |
| 跨 DLL 傳遞 std::string | 封裝層統一用 const char* + 輸出參數 std::string& |
作者提供的完整工程下載(含 cryptopp5.4、CryptoPP32.dll、測試專案)可作為團隊密碼學基建的起點。建議先跑通測試,再按業務需求裁剪介面、升級演算法(如改用 RSA-OAEP-SHA256、Ed25519、X25519)。