介紹如何在 Ubuntu Linux 系統中安裝 Crypto++ 加密函式庫,並編譯使用 Crypto++ 的 C++ 程式碼。
Crypto++(亦稱 CryptoPP、libcrypto++ 或 libcryptopp)是一套開放原始碼的 C++ 密碼學函式庫,除了完整支援常見的演算法之外,Crypto++ 也包含了較冷門、較少被使用的演算法,目前已廣泛被學術界與業界使用。
安裝 Crypto++ 函式庫
套件安裝
若要在 Ubuntu Linux 中安裝 Crypto++ 函式庫,最方便的方式就是使用 apt 安裝 Ubuntu 官方收錄的 Crypto++ 函式庫開發套件:
# 安裝 Crypto++ 函式庫開發套件
sudo apt install libcrypto++-dev
自行編譯安裝
若需要使用最新版的 Crypto++ 函式庫,可以下載最新的 Crypto++ 原始碼,自行編譯後安裝使用。
Crypto++ 最新的原始碼可以從官方網站下載:
# 下載 Crypto++ 原始碼並解壓縮至 cryptopp870 目錄
https://cryptopp.com/cryptopp870.zip
unzip -a cryptopp870.zip -d cryptopp870
或是從 Crypto++ 的 GitHub 套件庫下載:
# 從 GitHub 下載 Crypto++ 原始碼
git clone git://github.com/weidai11/cryptopp.git
進入原始碼目錄,執行 make 編譯:
# 編譯 Crypto++
cd cryptopp870
make -j2
這裡 make 的參數 -j2 是指定同時執行 2 個編譯工作平行處理,通常工作數量可以指定為 CPU 的核心數以加速編譯。
編譯完成後,執行基本的 Crypto++ 函式庫 Validation Suite 測試程式:
# 測試 Crypto++ 函式庫
./cryptest.exe v
[略] Testing NaCl library functions... passed crypto_box, crypto_box_beforenm, crypto_box_afternm passed crypto_box_open, crypto_box_open_afternm passed crypto_box_keypair pairwise consistency passed crypto_sign, crypto_sign_open, crypto_sign_keypair passed crypto_sign_keypair pairwise consistency All tests passed! Seed used was 1670829385 Test started at Mon Dec 12 15:16:25 2022 Test ended at Mon Dec 12 15:16:30 2022
測試程式的輸出很長,基本上只要看最後是否有出現 All tests passed 的訊息即可。
再執行 Test Vectors 測試:
# 測試 Crypto++ 函式庫
./cryptest.exe tv all
[略] Testing MessageDigest algorithm Whirlpool. ......... Testing SymmetricCipher algorithm AES/XTS. ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ Tests complete. Total tests = 17549. Failed tests = 0.
確認輸出中沒有任何錯誤之後,就可以進行安裝了,若要將 Crypto++ 安裝至系統預設的路徑(/usr/local)下,可以執行:
# 將 Crypto++ 安裝至系統預設目錄 /usr/local
sudo make install
如果沒有管理者權限,亦可透過 PREFIX 變數指定安裝路徑,將 Crypto++ 安裝至自行指定的路徑之下:
# 將 Crypto++ 安裝至 ~/cryptopp 目錄
make install PREFIX=~/cryptopp
若要移除自行編譯安裝的 Crypto++ 函式庫,可以使用對應的 make uninstall 指令:
# 將安裝至系統預設目錄 /usr/local 的 Crypto++ 移除
sudo make uinstall
# 將安裝至 ~/cryptopp 目錄的 Crypto++ 移除
make uninstall PREFIX=~/cryptopp
編譯 Crypto++ 程式
以下是一個使用 Crypto++ 函式庫來計算 SHA1 雜湊碼的範例,這裡我們將示範如何使用 g++ 編譯器編譯這個程式:
#include <iostream>
#include <cstdlib>
#include "cryptlib.h"
#include "filters.h"
#include "files.h"
#include "sha.h"
#include "hex.h"
int main () {
using namespace CryptoPP;
SHA1 hash;
std::string msg = "Crypto++ is a free C++ library for cryptography.";
std::string digest;
HexEncoder encoder(new FileSink(std::cout));
hash.Update((const byte*)msg.data(), msg.size());
digest.resize(hash.DigestSize());
hash.Final((byte*) digest.c_str());
std::cout << "Message: " << msg << std::endl;
std::cout << "SHA1 Digest: ";
StringSource(digest, true, new Redirector(encoder));
std::cout << std::endl;
return EXIT_SUCCESS;
}
將這份程式碼儲存至 sha1.cpp 之後,若採用 Ubuntu Linux 官方套件庫的 Crypto++ 函式庫,可以使用以下 g++ 指令進行編譯:
# 編譯 Crypto++ 程式(Ubuntu Linux 官方套件庫 Crypto++ 函式庫)
g++ -I/usr/include/crypto++ -o sha1 sha1.cc -lcryptopp
如果是自行安裝的 Crypto++ 函式庫,可依照自己的安裝路徑,調整引入標頭檔的目錄以及函式庫連結檔的位置,以預設的 /usr/local 安裝路徑來說,編譯指令可以改成這樣:
# 編譯 Crypto++ 程式(自行編譯安裝 Crypto++ 函式庫)
g++ -I/usr/local/include/cryptopp -o sha1 sha1.cc \
-L/usr/local/lib/libcryptopp.a -lcryptopp
編譯完成後,即可執行這個測試程式:
# 執行測試程式
./sha1
Message: Crypto++ is a free C++ library for cryptography. SHA1 Digest: 1A7588E2529D53DD5200371F6CF5084754A9B76C
