用C++写出AES算法加密
时间: 2023-11-10 09:12:50 浏览: 180
以下是用C++实现AES算法加密的示例代码:
```c++
#include <iostream>
#include <cstring>
#include <openssl/aes.h>
using namespace std;
// 将16进制字符串转换成字节数组
void hexStrToByteArray(const char* str, unsigned char* out) {
int len = strlen(str);
for (int i = 0; i < len; i += 2) {
char c1 = str[i];
char c2 = str[i + 1];
int b1 = isdigit(c1) ? c1 - '0' : c1 - 'a' + 10;
int b2 = isdigit(c2) ? c2 - '0' : c2 - 'a' + 10;
out[i / 2] = (b1 << 4) | b2;
}
}
// 将字节数组转换成16进制字符串
void byteArrayToHexStr(const unsigned char* bytes, int len, char* out) {
for (int i = 0; i < len; i++) {
sprintf(out + i * 2, "%02x", bytes[i]);
}
out[len * 2] = '\0';
}
// AES加密函数
void aesEncrypt(const unsigned char* input, int input_len, const unsigned char* key, int key_len, unsigned char* output) {
AES_KEY aes_key;
AES_set_encrypt_key(key, key_len * 8, &aes_key);
int padding_len = AES_BLOCK_SIZE - input_len % AES_BLOCK_SIZE;
int output_len = input_len + padding_len;
unsigned char* input_padded = new unsigned char[output_len];
memcpy(input_padded, input, input_len);
memset(input_padded + input_len, padding_len, padding_len);
for (int i = 0; i < output_len; i += AES_BLOCK_SIZE) {
AES_encrypt(input_padded + i, output + i, &aes_key);
}
delete[] input_padded;
}
int main() {
const char* input_hex_str = "00112233445566778899aabbccddeeff";
const char* key_hex_str = "000102030405060708090a0b0c0d0e0f";
const int input_len = strlen(input_hex_str) / 2;
const int key_len = strlen(key_hex_str) / 2;
unsigned char input[input_len];
unsigned char key[key_len];
hexStrToByteArray(input_hex_str, input);
hexStrToByteArray(key_hex_str, key);
unsigned char* output = new unsigned char[input_len];
aesEncrypt(input, input_len, key, key_len, output);
char output_hex_str[input_len * 2 + 1];
byteArrayToHexStr(output, input_len, output_hex_str);
cout << output_hex_str << endl;
delete[] output;
return 0;
}
```
在以上代码中,我们使用了openssl库中的AES加密算法实现了AES加密功能。具体实现方式如下:
1. 首先定义了两个辅助函数,`hexStrToByteArray`和`byteArrayToHexStr`,用于将16进制字符串和字节数组之间进行转换。
2. 然后定义了`aesEncrypt`函数,其中首先调用`AES_set_encrypt_key`函数设置加密密钥,并计算出需要添加的填充字节数。
3. 接着我们将输入数据进行填充,然后按照AES_BLOCK_SIZE(16字节)的大小进行分块加密,最终输出加密结果。
4. 在`main`函数中,我们定义了输入数据和密钥的16进制字符串,并调用了`aesEncrypt`函数进行加密,最后将加密结果输出。
需要注意的是,由于openssl库是第三方库,使用前需要先安装openssl库。在Linux系统下,可以通过以下命令进行安装:
```
sudo apt-get install libssl-dev
```
在Windows系统下,可以从openssl官网下载Windows版本的openssl库进行安装。
以上代码只是AES加密算法的一个简单示例,实际应用中需要考虑更多的安全因素,例如密钥管理、数据完整性校验等。
阅读全文