利用crypto++库实现AES加密算法

jopen 6年前

利用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