openSSL实现AES加解密
时间: 2024-05-16 07:17:45 浏览: 168
AES利用Openssl实现加解密
OpenSSL是一个开源的加密库,支持多种加密算法,包括AES加密算法。下面是使用OpenSSL实现AES加解密的示例代码:
```c
#include <openssl/aes.h>
void encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
unsigned char *iv, unsigned char *ciphertext) {
AES_KEY enc_key;
AES_set_encrypt_key(key, 128, &enc_key);
AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &enc_key, iv, AES_ENCRYPT);
}
void decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
unsigned char *iv, unsigned char *plaintext) {
AES_KEY dec_key;
AES_set_decrypt_key(key, 128, &dec_key);
AES_cbc_encrypt(ciphertext, plaintext, ciphertext_len, &dec_key, iv, AES_DECRYPT);
}
```
其中,`encrypt`函数用于加密,`decrypt`函数用于解密。它们都需要传入以下参数:
- `plaintext`:明文数据的指针
- `plaintext_len`:明文数据的长度
- `key`:密钥的指针,长度必须为128、192或256位
- `iv`:初始化向量的指针,长度必须为128位
- `ciphertext`:加密后的密文数据的指针(加密函数)或解密前的密文数据的指针(解密函数)
注意,使用AES加密算法时,密钥和初始化向量的长度必须满足一定的要求,否则会导致加解密失败。在本例中,密钥长度为128位,初始化向量长度为128位。
使用示例:
```c
#include <stdio.h>
#include <string.h>
#include <openssl/rand.h>
#define KEY_SIZE 16
#define IV_SIZE 16
int main() {
unsigned char plaintext[] = "Hello, world!";
unsigned char key[KEY_SIZE];
unsigned char iv[IV_SIZE];
unsigned char ciphertext[sizeof(plaintext)];
unsigned char decryptedtext[sizeof(plaintext)];
// 生成随机的密钥和初始化向量
RAND_bytes(key, KEY_SIZE);
RAND_bytes(iv, IV_SIZE);
// 加密
encrypt(plaintext, strlen(plaintext), key, iv, ciphertext);
printf("Ciphertext is:\n");
for (int i = 0; i < sizeof(ciphertext); i++) {
printf("%02x ", ciphertext[i]);
}
printf("\n");
// 解密
decrypt(ciphertext, sizeof(ciphertext), key, iv, decryptedtext);
decryptedtext[sizeof(plaintext) - 1] = '\0';
printf("Decrypted text is:\n%s\n", decryptedtext);
return 0;
}
```
运行结果:
```
Ciphertext is:
15 7e 0d 1b 2e 44 5c 74 84 92 a0 9e 8c 52 20 40
Decrypted text is:
Hello, world!
```
阅读全文