利用crypto++库实现AES加密算法
jopen
11年前
利用crypto++库实现AES加/解密字符串,文件
MyAES.h:
/* * MyAES.h * * Created on: 2013-3-6 * Author: hust */ #ifndef MYAES_H_ #define MYAES_H_ #include <cryptopp/aes.h> #include <cryptopp/default.h> #include <cryptopp/filters.h> #include <cryptopp/files.h> #include <cryptopp/osrng.h> #include <stdlib.h> #include <string> #include <iostream> using namespace CryptoPP; using namespace std; class MyAES { public: byte * key; byte * iv; int key_length; MyAES(); MyAES(byte * key, byte *iv, int length); ~MyAES(); //use the key to encrypt the plainText and return the cipher string Encrypt(const string &plainText); //use the same key to decrypt the cipher and return the recover string Decrypt(const string &cipher); //use the key to encrypt the file bool EncryptFile(const string & inFilename, const string & outFilename); //use the key to decyrpt the file bool DecryptFile(const string & DecFilename, const string & recoverFilename); void GenerateKey(); void SetKey(byte * key, byte * iv, int length); }; #endif /* MYAES_H_ */
MyAES.cpp:
//============================================================================ // Name : MyAES.cpp // Author : hust // Version : // Copyright : 1.0 // Description : 本类将AES的加密,解密函数封装,直接调用即可对string进行加密or解密 // 另外,构造MyAES类的时候,传入参数key, iv, key_length // 待解决:编写一个生成密钥的函数,即需要 KeyGenerate(Random random); // reference : http://www.codeproject.com/Articles/21877/Applied-Crypto-Block-Ciphers //============================================================================ #include "MyAES.h" #include <time.h> MyAES::MyAES() { } MyAES::MyAES(byte * key1, byte * iv1, int key_length1) { SetKey(key1, iv1, key_length1); } MyAES::~MyAES() { } void MyAES::GenerateKey() { AutoSeededRandomPool rnd; byte key1[AES::DEFAULT_KEYLENGTH]; rnd.GenerateBlock(key1, AES::DEFAULT_KEYLENGTH); // Generate a random IV byte iv1[AES::BLOCKSIZE]; rnd.GenerateBlock(iv1, AES::BLOCKSIZE); SetKey(key1, iv1, 16); } void MyAES::SetKey(byte * key1, byte * iv1, int length1) { this->key = key1; this->iv = iv1; this->key_length = length1; } /* * Description: use key to encrypt 'plainText', return the cipher * Input: * plainText: the string need to be encrypted * OutPUt: * return the cipher */ string MyAES::Encrypt(const string &plainText) { string cipher; CBC_Mode<AES>::Encryption aesEncryptor(key, key_length, iv); // AESEncryption aesEncryptor; //加密器 // aesEncryptor.SetKey( key, key_length ); //设定加密密钥 StringSource(plainText, true, new StreamTransformationFilter(aesEncryptor, new StringSink(cipher))); return cipher; } /* * Description: use the same key to decrypt "cipher" and return the plainText * Input: * cipher: the string to be decrypted * Output: * return the recover */ string MyAES::Decrypt(const string & cipher) { string recover; CBC_Mode<AES>::Decryption aesDecryptor(key, key_length, iv); //AESDecryption aesDecryptor; //解密器 //aesDecryptor.SetKey( key, key_length ); //设定加密密钥 StringSource(cipher, true, new StreamTransformationFilter(aesDecryptor, new StringSink(recover))); return recover; } /* * Description: use the key to encrypt the 'inFilename' and store the cipher in 'outFilname' * Input: * inFilename: the file need to be encrypted! * outFilename: the encrypted file * OutPut: * if encrypt success, return true, or return false * Others: the function should delete the file : 'inFilename', however I note it */ bool MyAES::EncryptFile(const string & inFilename, const string & outFilename) { // check if the file 'inFilename' exists. if (access(inFilename.c_str(), 0) == -1) { cout << "The file " << inFilename << " is not exist! " << endl; return false; } // file exists, the encrypt the file CBC_Mode<AES>::Encryption aesEncryptor(key, key_length, iv); FileSource(inFilename.c_str(), true, new StreamTransformationFilter(aesEncryptor, new FileSink(outFilename.c_str()))); // remove the file 'inFilename' // if(remove(inFilename) == 0) cout << "remove file succeed! " << endl; // else cout << "fail to remove the file " << inFilname << endl; // use function remove(), you have to add #include <cstdio> in the .h file return true; } /* * Description: use the same key to decrypt the 'decFilename' and create recoverFile * Input: * decFilename: the encrypted file name * recoverFilename: the decrypted file name * OutPut: * if decrypted the file successful, return true, else return false * Others: we should also delete the file 'decFilename' */ bool MyAES::DecryptFile(const string & decFilename, const string & recoverFilename) { // check if the file 'decFilename' exists! if (access(decFilename.c_str(), 0) == -1) { cout << "The file " << decFilename << " is not exist! " << endl; return false; } // exist , then decrypt the file CBC_Mode<AES>::Decryption aesDecryptor(key, key_length, iv); FileSource(decFilename.c_str(), true, new StreamTransformationFilter(aesDecryptor, new FileSink(recoverFilename.c_str()))); return true; } int main() { // byte key[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x01,0x02, 0x03,0x04,0x05,0x06,0x07,0x08}; // //AES::DEFAULT_KEYLENGTH // byte iv[] = {0x01,0x02,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03, 0x01,0x02,0x03,0x03,0x03,0x03}; // int keysize = 16; // generate the key AutoSeededRandomPool rnd; byte key[AES::DEFAULT_KEYLENGTH]; rnd.GenerateBlock( key, AES::DEFAULT_KEYLENGTH); // Generate a random IV byte iv[AES::BLOCKSIZE]; rnd.GenerateBlock(iv, AES::BLOCKSIZE); int keysize = 16; string plainText = "Hello World!"; clock_t start , finish; double duration; start = clock(); MyAES aes(key, iv, keysize); cout << "AES parameters: " << endl; cout << "The algorithm name is : " << AES::StaticAlgorithmName() << endl; cout << "The iv is : " << aes.iv << endl; cout << "The key is : " << aes.key << endl; cout << "The key length is : " << aes.key_length << endl; string cipher = aes.Encrypt(plainText); cout << "The cipher is : " << cipher << endl; string recover = aes.Decrypt(cipher); cout << "The recover is : " << recover << endl; cout << "=====================" << endl; // encrypt the file and decrypt it string inFilename = "aesTest"; string outFilename = "aesEncrypt"; string recoverFilename = "aesRecover"; if(aes.EncryptFile(inFilename, outFilename)){ cout << "*__*" << endl << "Encrypt succeed!" << endl; if(aes.DecryptFile(outFilename, recoverFilename)){ cout << "*__*" << endl << "Recover succeed!" << endl; } else cout << ")__(" << endl << "Recover failed!" << endl; } else cout << ")__(" << endl << "Encrypt failed!" << endl; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout << "the cost is : " << duration << endl; return 0; }
在linux系统中编译命令为:
g++ MyAES.cpp -o test -lpthread -lcryptopp