aes128加解密算法c++实现
时间: 2023-07-26 14:07:03 浏览: 44
以下是 AES-128 加解密的 C++ 实现示例,使用了 OpenSSL 库:
```c++
#include <iostream>
#include <cstring>
#include <openssl/aes.h>
using namespace std;
void aes_encrypt(unsigned char* input, int input_len, unsigned char* key, unsigned char* output) {
AES_KEY aes_key;
AES_set_encrypt_key(key, 128, &aes_key);
unsigned char iv[AES_BLOCK_SIZE];
memset(iv, 0x00, AES_BLOCK_SIZE);
int remaining = input_len % AES_BLOCK_SIZE;
int padding = AES_BLOCK_SIZE - remaining;
int padded_len = input_len + padding;
unsigned char* padded_input = new unsigned char[padded_len];
memcpy(padded_input, input, input_len);
memset(padded_input + input_len, padding, padding);
for (int i = 0; i < padded_len; i += AES_BLOCK_SIZE) {
AES_cbc_encrypt(padded_input + i, output + i, AES_BLOCK_SIZE, &aes_key, iv, AES_ENCRYPT);
}
delete[] padded_input;
}
void aes_decrypt(unsigned char* input, int input_len, unsigned char* key, unsigned char* output) {
AES_KEY aes_key;
AES_set_decrypt_key(key, 128, &aes_key);
unsigned char iv[AES_BLOCK_SIZE];
memset(iv, 0x00, AES_BLOCK_SIZE);
for (int i = 0; i < input_len; i += AES_BLOCK_SIZE) {
AES_cbc_encrypt(input + i, output + i, AES_BLOCK_SIZE, &aes_key, iv, AES_DECRYPT);
}
int padding = output[input_len - 1];
int unpadded_len = input_len - padding;
memset(output + unpadded_len, 0x00, padding);
}
int main() {
unsigned char key[] = "0123456789abcdef";
unsigned char input[] = "Hello, world!";
int input_len = strlen((char*)input);
unsigned char encrypted[256];
unsigned char decrypted[256];
aes_encrypt(input, input_len, key, encrypted);
aes_decrypt(encrypted, input_len + AES_BLOCK_SIZE - (input_len % AES_BLOCK_SIZE), key, decrypted);
cout << "Input: " << input << endl;
cout << "Encrypted: ";
for (int i = 0; i < input_len + AES_BLOCK_SIZE - (input_len % AES_BLOCK_SIZE); i++) {
printf("%02x", encrypted[i]);
}
cout << endl;
cout << "Decrypted: " << decrypted << endl;
return 0;
}
```
需要注意的是,这里使用了 CBC 模式和 PKCS7 填充方式。在实际使用中,需要根据具体的需求和场景选择合适的模式和填充方式。