介紹如何在 Ubuntu Linux 系統中安裝 Crypto++ 加密函式庫,並編譯使用 Crypto++ 的 C++ 程式碼。
Crypto++(亦稱 CryptoPP、libcrypto++ 或 libcryptopp)是一套開放原始碼的 C++ 密碼學函式庫,除了完整支援常見的演算法之外,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++ 函式庫來計算 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