項目中需要使用到C++加密解密庫,選擇了Crypto++這個開源庫,於是先安裝並寫一個小例子試試
一、下載
網址:http://www.cryptopp.com/#download
二、打開項目
下載后加壓縮,並進入目錄,打開cryptest.sln文件,打開解決方案,此解決方案是用vs2005建立的
打開解決方案后,會看到有4個項目存在:cryptest、cryptlib、cryptopp、dlltest
我們得到的是Crypto++這個算法庫的源碼,如果想要在我們的項目中使用它,必須先把它編譯成為庫
生成項目cryptlib即可得到我們想要的庫。
在適當地地方建立一個目錄crypto++在內部新建lib和include目錄分別存放頭文件和生成的庫。
三、編寫我們的示例程序
首先需要把上一步得到的庫和頭文件路徑添加到我們的示例程序項目中。
示例代碼如下:
1 #include <iostream> 2 #include "aes.h" 3 4 #pragma comment(lib, "cryptlib.lib") 5 6 using namespace std; 7 using namespace CryptoPP; 8 9 int main(int argc, char **argv) 10 { 11 // AES使用的固定參數是以類AES中定義的ENUM數據類型出現的,而不是成員函數或者變量 12 // 因此需要用::符號來索引 13 cout << "AES Parameters: " << endl; 14 cout << "Algorigthm name: " << AES::StaticAlgorithmName() << endl; 15 16 // Crypto++庫中一般用字節數表示長度,而不是常用的字節數 17 cout << "Block size: " << AES::BLOCKSIZE * 8 << endl; 18 cout << "Min Key length: " << AES::MIN_KEYLENGTH * 8 << endl; 19 cout << "Max key Lenght: " << AES::MAX_KEYLENGTH * 8 << endl; 20 21 // AES中只包含一些固定的數據,而加密解密的功能有AESEncryption和AESDecryption完成 22 AESEncryption aesEncryptor; // 加密器 23 24 unsigned char aesKey[AES::DEFAULT_KEYLENGTH]; // 密鑰 25 unsigned char inBlock[AES::BLOCKSIZE] = "123456789"; // 要解密的數據塊 26 unsigned char outBlock[AES::BLOCKSIZE]; // 加密后的密文 27 unsigned char xorBlock[AES::BLOCKSIZE]; // 必須為全零 28 29 memset(xorBlock, 0, AES::BLOCKSIZE); 30 31 aesEncryptor.SetKey(aesKey, AES::DEFAULT_KEYLENGTH); // 設置加密密鑰 32 aesEncryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock); 33 34 // 以十六進制顯示加密后的數據 35 for (int i = 0; i < 16; i++) 36 { 37 cout << hex << (int)outBlock[i] << " "; 38 } 39 cout << endl; 40 41 // 解密 42 AESDecryption aesDecryptor; 43 unsigned char plainText[AES::BLOCKSIZE]; 44 45 aesDecryptor.SetKey(aesKey, AES::DEFAULT_KEYLENGTH); 46 aesDecryptor.ProcessAndXorBlock(outBlock, xorBlock, plainText); 47 48 for (int i = 0; i < 16; i++) 49 { 50 cout << plainText[i]; 51 } 52 cout << endl; 53 54 return 0; 55 }
因為項目中選擇使用對稱加密算法aes來實現,所以只寫了這一個示例,Crypto++庫支持許多種加密解密算法,其他的待以后再來學習。
參考:
http://blog.163.com/kevinlee_2010/blog/static/169820820201162252718894/
http://www.cnblogs.com/linyawen/archive/2013/08/23/3277438.html
http://www.open-open.com/lib/view/open1381633246848.html
http://www.2cto.com/kf/201108/99205.html