天天看点

c++实现AES加密解密算法

本文讲解c++实现AES加密解密功能,主要包含两部分:

  • 实现AES加密解密功能的静态库
  • 实现调用静态库的测试文件

本文代码是在win10系统,VS2013下调试。

一、AES加解密静态库

  1. 创建静态库工程CAesLib
    c++实现AES加密解密算法
  2. 创建外部调用类CAes256
#ifndef ENCRYPT_DECRYPT_H
#define ENCRYPT_DECRYPT_H
#include <string>

using namespace std;

class CAes256
{
public:
	CAes256();
	static void initAes(const string& key = "");
	static string encryptData(const string& dataIn);
	static string decryptData(const string& dataIn);
	static string encryptDataWithHead(const string& dataIn);
	static string decryptDataWithHead(const string& dataIn);
};

#endif // ENCRYPT_DECRYPT_H

#include "stdafx.h"
#include "encrypt_decrypt.h"
#include "AES.h"
#include <string.h>
#include <stdio.h>

typedef unsigned char UINT8;

UINT8 gAesKey[32] = { -84, 115, -48, 61, 3, 127, 34, 37, -73, -21, 85, 100, -4, 117, 63, 19 }; 

bool gInitFlag = false;

CAes256::CAes256()
{
	
}

/*
 *AES初始化
*/
void CAes256::initAes(const string& key)  // key的长度为16位
{
	if (key != "")
	{
		memset(gAesKey, 0x00, 32);
		memcpy_s(gAesKey, 16, key.c_str(), 16);
	}

	aesInit(gAesKey);
}

/*
 *加密字符串
*/
string CAes256::encryptData(const string& dataIn)
{
	if (!gInitFlag)
	{
		gInitFlag = true;
		initAes("1234567890123456");
	}
	return aesBlockEncrypt(dataIn);
}

/*
 *解密字符串
*/
string CAes256::decryptData(const string& dataIn)
{
	if (!gInitFlag)
	{
		gInitFlag = true;
		initAes("1234567890123456");
	}
	return aesBlockDecrypt(dataIn);
}

string CAes256::encryptDataWithHead(const string& dataIn)
{
	if (!gInitFlag)
	{
		gInitFlag = true;
		initAes("");
	}
	return aesBlockEncryptWithHead(dataIn);
}

string CAes256::decryptDataWithHead(const string& dataIn)
{
	if (!gInitFlag)
	{
		gInitFlag = true;
		initAes("");
	}
	return aesBlockDecryptWithHead(dataIn);
}

           
  1. 编译生成静态库
    c++实现AES加密解密算法

二、调用静态库测试代码

测试代码如下:

// TestAesLib.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "encrypt_decrypt.h"

using namespace std;

#pragma comment(lib, "..\\..\\CAesLib\\Release\\CAesLib.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	//设置key,长度为16位
	CAes256::initAes("t7CLWhtUTAgAFbw0");

	string str = "“TestAesLib.exe”(Win32):  已加载“\\TestAesLib\\Release\\TestAesLib.exe”。已加载符号。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\ntdll.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\kernel32.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\KernelBase.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\msvcr120.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\msvcp120.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\sechost.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\rpcrt4.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\sspicli.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\cryptbase.dll”。无法查找或打开 PDB 文件。\
		“TestAesLib.exe”(Win32) : 已加载“C : \\Windows\\SysWOW64\\bcryptprimitives.dll”。无法查找或打开 PDB 文件。";
	cout << "str = " << str << endl;
	string enstr = CAes256::encryptData(str);
	cout << "1------------------enstr = " << enstr << endl;
	str = CAes256::decryptData(enstr);
	cout << "2------------------str = " << str << endl;

	enstr = CAes256::encryptDataWithHead(str);
	cout << "1------------------enstr = " << enstr << endl;
	str = CAes256::decryptDataWithHead(enstr);
	cout << "2------------------str = " << str << endl;

	system("pause");

	return 0;
}
           

运行结果:

c++实现AES加密解密算法

重要说明:

  • CAes256类里面的函数都是静态函数,不用定义对象,可以通过CAes256::方式访问
  • 可以通过CAes256::initAes设置key,如果不设置就会使用默认的key
  • 默认的key通过UINT8 gAesKey[32]来设置
  • encryptData和decryptData是常规的数据加解密处理,可以和其它语言(如java)相互加解密
  • encryptDataWithHead和decryptDataWithHead处理时,在加密时,会把源数据的长度转换成8位长度的16进制字符串,再把字符串加附加到源数据前面;解密时要出去8位长度的数据头再做解密处理

三、源码路径

本文源码