前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用crypto++库实现AES加密算法

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

作者头像
一灰灰blog
发布2018-02-06 12:02:42
3.2K0
发布2018-02-06 12:02:42
举报
文章被收录于专栏:小灰灰小灰灰小灰灰

利用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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档