OpenSSL中 AES 加解密的API:
生成加密/解密的Key
#include <openssl/aes.h>
# define AES_BLOCK_SIZE 16 // 明文分组的大小
// 加密的时候调用
// aes中的秘钥格式 AES_KEY
// 封装加密时候使用的秘钥
AES_KEY key;
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
// 封装解密时候使用的秘钥
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
参数名称 | 描述 |
---|---|
userkey | 对称加密的秘钥-> 字符串, 长度: 16, 24, 32byte |
bites | 指定秘钥的长度: 单位->bit |
key | 传出参数 |
CBC方式加密 - 密码分组链接模式
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
size_t length, const AES_KEY *key,
unsigned char *ivec, const int enc);
参数:
- in: 要加密/解密的数据
- out: 传出参数
- 加密: 存储密文
- 解密: 存储明文
- length: 修改第一个参数in的长度
- (len = (字符串长度 + \0) % 16) == 0
- 如果不是在函数内部会自动填充
- 实际长度: ((len / 16) + 1 ) * 16
- key: 初始化之后的秘钥
- ivec: 初始化向量, 字符串 ==> 长度和分组长度相同
- enc: 指定数据要解密还是解密
- # define AES_ENCRYPT 1 -> 加密
- # define AES_DECRYPT 0 -> 解密
#include <iostream>
#include <openssl/aes.h>
#include <openssl/pem.h>
#include <string.h>
using namespace std;
void aesCBCCrypto()
{
// 准备数据
string data = "我是峰子";
// 准备密钥
// 密钥长度 16/24/32
const char* key = "1234567887654321";
// 初始化密钥
// 每组8个字节所以是128
AES_KEY encKey;
AES_set_encrypt_key((const unsigned char*)key,128,&encKey);
// 加密
// 计算长度
int len = data.size();
int length = 0;
if(len % 16 != 0)
{
length = ((len/16)+1)*16;
}else{
length = len;
}
unsigned char* out = new unsigned char[length];
unsigned char ivec[AES_BLOCK_SIZE];
memset(ivec,9,sizeof(ivec));
// 密文存储在out中
AES_cbc_encrypt((const unsigned char*)data.data(),out,length,&encKey,ivec,AES_ENCRYPT
// 解密
AES_KEY decKey;
AES_set_decrypt_key((const unsigned char*)key,128,&decKey);
unsigned char* res = new unsigned char[length];
memset(ivec,9,sizeof(ivec));
AES_cbc_encrypt(out,res,length,&decKey,ivec,AES_DECRYPT);
// 打印
cout<<res<<endl;
delete [] out;
delete [] res;
}
int main()
{
aesCBCCrypto();
return 0;
}
原文:https://www.cnblogs.com/lodger47/p/14878644.html