Crypto++編譯使用


簡述

Crypto++庫是一個用c++ 編寫的密碼類庫,是一個自由軟件。有關它的信息可以訪問以下兩個網站:

 

 

下載

進入Crypto++主頁,下載對應的版本(我下載的是最新的:Crypto++ 5.6.3

解壓縮之后,我們會看到里面包含大量的頭文件、源文件、以及工程文件,用VS2013打開cryptest.sln,然后進行編譯(清理->重新生成)即可。

編譯完成,會生成cryptest.exe、cryptlib.lib(E:\Crypto++5.6.3\Win32\Output\Debug)。

使用

新建一個Win32控制台應用程序TestCrypto++。

  1. 右鍵“屬性”,選擇“配置屬性”-> C/C++ ->常規,附加包含目錄E:\Crypto++5.6.3
  2. 右鍵“屬性”,選擇“配置屬性”-> 鏈接器 ->常規,附加庫目錄E:\Crypto++5.6.3\Win32\Output\Debug
  3. 右鍵“屬性”,選擇“配置屬性”-> C/C++ -> 代碼生成,運行庫選擇“多線程調試(/MTd)”(Release模式下對應“多線程(/MT)”)。

此時,使用Crypto++的開發環境就搭建好了,在Crypto++ User Guide中的例子。

AES加解密

Ok,編寫測試程序。。。

效果

這里寫圖片描述

源碼

// TestCrypto++.cpp : 定義控制台應用程序的入口點。 #include "stdafx.h" #include <aes.h> #include <Hex.h> // StreamTransformationFilter #include <modes.h> // CFB_Mode #include <iostream> // std:cerr #include <sstream> // std::stringstream #include <string> using namespace std; using namespace CryptoPP; #pragma comment(lib, "cryptlib.lib" ) std::string ECB_AESEncryptStr(std::string sKey, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); ECB_Mode_ExternalCipher::Encryption ecbEncryption(aesEncryption); StreamTransformationFilter ecbEncryptor(ecbEncryption, new HexEncoder(new StringSink(outstr))); ecbEncryptor.Put((byte *)plainText, strlen(plainText)); ecbEncryptor.MessageEnd(); return outstr; } std::string ECB_AESDecryptStr(std::string sKey, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); ECB_Mode<AES >::Decryption ecbDecryption((byte *)key, AES::MAX_KEYLENGTH); HexDecoder decryptor(new StreamTransformationFilter(ecbDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } std::string CBC_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv); StreamTransformationFilter cbcEncryptor(cbcEncryption, new HexEncoder(new StringSink(outstr))); cbcEncryptor.Put((byte *)plainText, strlen(plainText)); cbcEncryptor.MessageEnd(); return outstr; } std::string CBC_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); CBC_Mode<AES >::Decryption cbcDecryption((byte *)key, AES::MAX_KEYLENGTH, iv); HexDecoder decryptor(new StreamTransformationFilter(cbcDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } std::string CBC_CTS_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); CBC_CTS_Mode_ExternalCipher::Encryption cbcctsEncryption(aesEncryption, iv); StreamTransformationFilter cbcctsEncryptor(cbcctsEncryption, new HexEncoder(new StringSink(outstr))); cbcctsEncryptor.Put((byte *)plainText, strlen(plainText)); cbcctsEncryptor.MessageEnd(); return outstr; } std::string CBC_CTS_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); CBC_CTS_Mode<AES >::Decryption cbcctsDecryption((byte *)key, AES::MAX_KEYLENGTH, iv); HexDecoder decryptor(new StreamTransformationFilter(cbcctsDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } std::string CFB_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); CFB_Mode_ExternalCipher::Encryption cfbEncryption(aesEncryption, iv); StreamTransformationFilter cfbEncryptor(cfbEncryption, new HexEncoder(new StringSink(outstr))); cfbEncryptor.Put((byte *)plainText, strlen(plainText)); cfbEncryptor.MessageEnd(); return outstr; } std::string CFB_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); CFB_Mode<AES >::Decryption cfbDecryption((byte *)key, AES::MAX_KEYLENGTH, iv); HexDecoder decryptor(new StreamTransformationFilter(cfbDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } std::string OFB_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); OFB_Mode_ExternalCipher::Encryption ofbEncryption(aesEncryption, iv); StreamTransformationFilter ofbEncryptor(ofbEncryption, new HexEncoder(new StringSink(outstr))); ofbEncryptor.Put((byte *)plainText, strlen(plainText)); ofbEncryptor.MessageEnd(); return outstr; } std::string OFB_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); OFB_Mode<AES >::Decryption ofbDecryption((byte *)key, AES::MAX_KEYLENGTH, iv); HexDecoder decryptor(new StreamTransformationFilter(ofbDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } std::string CTR_AESEncryptStr(std::string sKey, std::string sIV, const char *plainText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); AES::Encryption aesEncryption((byte *)key, AES::MAX_KEYLENGTH); CTR_Mode_ExternalCipher::Encryption ctrEncryption(aesEncryption, iv); StreamTransformationFilter ctrEncryptor(ctrEncryption, new HexEncoder(new StringSink(outstr))); ctrEncryptor.Put((byte *)plainText, strlen(plainText)); ctrEncryptor.MessageEnd(); return outstr; } std::string CTR_AESDecryptStr(std::string sKey, std::string sIV, const char *cipherText) { std::string outstr; //填key SecByteBlock key(AES::MAX_KEYLENGTH); memset(key, 0x30, key.size()); sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH); //填iv byte iv[AES::BLOCKSIZE]; memset(iv, 0x30, AES::BLOCKSIZE); sIV.size() <= AES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) : memcpy(iv, sIV.c_str(), AES::BLOCKSIZE); CTR_Mode<AES >::Decryption ctrDecryption((byte *)key, AES::MAX_KEYLENGTH, iv); HexDecoder decryptor(new StreamTransformationFilter(ctrDecryption, new StringSink(outstr))); decryptor.Put((byte *)cipherText, strlen(cipherText)); decryptor.MessageEnd(); return outstr; } int _tmain(int argc, _TCHAR* argv[]) { string plainText = "This Program shows how to use ECB, CBC, CBC_CTS, CFB, OFB and CTR mode of AES in Crypto++."; string aesKey = "0123456789ABCDEF0123456789ABCDEF";//256bits, also can be 128 bits or 192bits string aesIV = "ABCDEF0123456789";//128 bits string ECB_EncryptedText, ECB_DecryptedText, CBC_EncryptedText, CBC_DecryptedText, CBC_CTS_EncryptedText, CBC_CTS_DecryptedText, CFB_EncryptedText, CFB_DecryptedText, OFB_EncryptedText, OFB_DecryptedText, CTR_EncryptedText, CTR_DecryptedText; //ECB ECB_EncryptedText = ECB_AESEncryptStr(aesKey, plainText.c_str());//ECB加密 ECB_DecryptedText = ECB_AESDecryptStr(aesKey, ECB_EncryptedText.c_str());//ECB解密 //CBC CBC_EncryptedText = CBC_AESEncryptStr(aesKey, aesIV, plainText.c_str());//CBC加密 CBC_DecryptedText = CBC_AESDecryptStr(aesKey, aesIV, CBC_EncryptedText.c_str());//CBC解密 //CBC_CTS CBC_CTS_EncryptedText = CBC_CTS_AESEncryptStr(aesKey, aesIV, plainText.c_str());//CBC_CTS加密 CBC_CTS_DecryptedText = CBC_CTS_AESDecryptStr(aesKey, aesIV, CBC_CTS_EncryptedText.c_str());//CBC_CTS解密 //CFB CFB_EncryptedText = CFB_AESEncryptStr(aesKey, aesIV, plainText.c_str());//CFB加密 CFB_DecryptedText = CFB_AESDecryptStr(aesKey, aesIV, CFB_EncryptedText.c_str());//CFB解密 //OFB OFB_EncryptedText = OFB_AESEncryptStr(aesKey, aesIV, plainText.c_str());//OFB加密 OFB_DecryptedText = OFB_AESDecryptStr(aesKey, aesIV, OFB_EncryptedText.c_str());//OFB解密 //CTR CTR_EncryptedText = CTR_AESEncryptStr(aesKey, aesIV, plainText.c_str());//CTR加密 CTR_DecryptedText = CTR_AESDecryptStr(aesKey, aesIV, CTR_EncryptedText.c_str());//CTR解密 cout << "Crypto++ AES-256 加密測試" << endl; cout << "分別使用ECB,CBC, CBC_CTR,CFB,OFB和CTR模式" << endl; cout << "加密用密鑰:" << aesKey << endl; cout << "密鑰長度:" << AES::MAX_KEYLENGTH * 8 << "bits" << endl; cout << "IV:" << aesIV << endl; cout << endl; cout << "ECB測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << ECB_EncryptedText << endl; cout << "恢復明文:" << ECB_DecryptedText << endl << endl; cout << "CBC測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << CBC_EncryptedText << endl; cout << "恢復明文:" << CBC_DecryptedText << endl << endl; cout << "CBC_CTS測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << CBC_CTS_EncryptedText << endl; cout << "恢復明文:" << CBC_CTS_DecryptedText << endl << endl; cout << "CFB測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << CFB_EncryptedText << endl; cout << "恢復明文:" << CFB_DecryptedText << endl << endl; cout << "OFB測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << OFB_EncryptedText << endl; cout << "恢復明文:" << OFB_DecryptedText << endl << endl; cout << "CTR測試" << endl; cout << "原文:" << plainText << endl; cout << "密文:" << CTR_EncryptedText << endl; cout << "恢復明文:" << CTR_DecryptedText << endl << endl; getchar(); return 0; }

 

更多參考

 

http://blog.csdn.net/u011012932/article/details/51659452

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM