本文讲解c++实现AES加密解密功能,主要包含两部分:
- 实现AES加密解密功能的静态库
- 实现调用静态库的测试文件
本文代码是在win10系统,VS2013下调试。
一、AES加解密静态库
- 创建静态库工程CAesLib
- 创建外部调用类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);
}
- 编译生成静态库
二、调用静态库测试代码
测试代码如下:
// 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;
}
运行结果:
重要说明:
- CAes256类里面的函数都是静态函数,不用定义对象,可以通过CAes256::方式访问
- 可以通过CAes256::initAes设置key,如果不设置就会使用默认的key
- 默认的key通过UINT8 gAesKey[32]来设置
- encryptData和decryptData是常规的数据加解密处理,可以和其它语言(如java)相互加解密
- encryptDataWithHead和decryptDataWithHead处理时,在加密时,会把源数据的长度转换成8位长度的16进制字符串,再把字符串加附加到源数据前面;解密时要出去8位长度的数据头再做解密处理
三、源码路径
本文源码