這陣子寫了一些數據加密的小程序,對照了好幾種算法後,選擇了AES,高級加密標準(英語:Advanced Encryption Standard,縮寫:AES)。聽這名字就很是厲害的樣子html
預計會搜索到這文章的。對AES算法已經有了些基本瞭解了吧。如下先簡介一下AES加密算法吧ios
(1)AES在password學中又稱Rijndael加密法。是美國聯邦政府採用的一種區塊加密標準。2006年。高級加密標準已然成爲對稱密鑰加密中最流行的算法之中的一個。算法
(2)AES加密數據塊分組長度必須爲128比特。密鑰長度可以是128比特、192比特、256比特中的隨意一個。(8比特 == 1字節)小程序
(3)在CBC、CFB、OFB、CTR模式下除了密鑰外,還需要一個初始化向IV。學習
(ECB模式不用IV)加密
關於AES不少其它的介紹,http://zh.wikipedia.org/wiki/AES。或者是百度百科吧spa
AES可以使用的加密模式的介紹,http://blog.csdn.net/aaaaatiger/article/details/2525561.net
我使用的是Crypto++庫,開發人員是Wei Dai,使用C++寫的加密庫。實現了很是多的加密算法,基本能知足咱們的加密需求。使用起來也很是easy方便。這是官方站點http://www.cryptopp.com/code
寫這文章目的不是介紹AES算法,僅僅是想給一個小樣例讓你們參考一下而已,避免你們在查了大半天加密算法,看了老久AES原理,可就是就不知道怎麼使用orm
(基本加解密過程是stackoverflow的一個小demo,我將它改動一下,實現了一個在兩個程序之間,以文件作爲介質的加解密的過程)
這裏選的是CBC模式(其餘模式調用也同樣)
一、程序一:加密
#include <stdio.h> #include <iostream> #include <fstream> #include <sstream> #include <cryptopp/aes.h> #include <cryptopp/filters.h> #include <cryptopp/modes.h> using namespace std; byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE]; void initKV() { memset( key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH ); memset( iv, 0x00, CryptoPP::AES::BLOCKSIZE ); // 或者也可以 /* char tmpK[] = "1234567890123456"; char tmpIV[] = "1234567890123456"; for (int j = 0; j < CryptoPP::AES::DEFAULT_KEYLENGTH; ++j) { key[j] = tmpK[j]; } for (int i = 0; i < CryptoPP::AES::BLOCKSIZE; ++i) { iv[i] = tmpIV[i]; } */ } string encrypt(string plainText) { string cipherText; // CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, iv ); CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( cipherText )); stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plainText.c_str() ), plainText.length() + 1 ); stfEncryptor.MessageEnd(); string cipherTextHex; for( int i = 0; i < cipherText.size(); i++ ) { char ch[3] = {0}; sprintf(ch, "%02x", static_cast<byte>(cipherText[i])); cipherTextHex += ch; } return cipherTextHex; } void writeCipher(string output) { ofstream out("/tmp/cipher.data"); out.write(output.c_str(), output.length()); out.close(); cout<<"writeCipher finish "<<endl<<endl; } int main() { string text = "hello zhuzhu dashen !"; cout<<"text : "<<text<<endl; initKV(); string cipherHex = encrypt(text); cout<<"cipher : "<<cipherHex<<endl; writeCipher(cipherHex); return 0; }
#include <stdio.h> #include <iostream> #include <fstream> #include <sstream> #include <cryptopp/aes.h> #include <cryptopp/filters.h> #include <cryptopp/modes.h> using namespace std; byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE]; void initKV() { memset( key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH ); memset( iv, 0x00, CryptoPP::AES::BLOCKSIZE ); // 或者也可以 /* char tmpK[] = "1234567890123456"; char tmpIV[] = "1234567890123456"; for (int j = 0; j < CryptoPP::AES::DEFAULT_KEYLENGTH; ++j) { key[j] = tmpK[j]; } for (int i = 0; i < CryptoPP::AES::BLOCKSIZE; ++i) { iv[i] = tmpIV[i]; } */ } string decrypt(string cipherTextHex) { string cipherText; string decryptedText; int i = 0; while(true) { char c; int x; stringstream ss; ss<<hex<<cipherTextHex.substr(i, 2).c_str(); ss>>x; c = (char)x; cipherText += c; if(i >= cipherTextHex.length() - 2)break; i += 2; } // CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv ); CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedText )); stfDecryptor.Put( reinterpret_cast<const unsigned char*>( cipherText.c_str() ), cipherText.size()); stfDecryptor.MessageEnd(); return decryptedText; } string readCipher() { ifstream in("/tmp/cipher.data"); string line; string decryptedText; while(getline(in, line)) { if(line.length() > 1) { decryptedText += decrypt(line) + "\n"; } line.clear(); } cout<<"readCipher finish "<<endl; in.close(); return decryptedText; } int main() { initKV(); string text = readCipher(); cout<<"text : "<<text<<endl; return 0; }
(以上內容僅供學習參考。若發現有誤。請留言告知,謝謝。)