3des加密解密c++
时间: 2023-09-10 15:14:25 浏览: 96
以下是使用C语言进行3DES加密和解密的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/des.h>
#define KEY "123456789012345678901234" // 24字节密钥
#define IV "12345678" // 8字节初始向量
// 3DES加密
int des3_encrypt(unsigned char *input, int input_len, unsigned char *output, int *output_len)
{
DES_cblock key1, key2, key3, iv;
DES_key_schedule ks1, ks2, ks3;
int len = 0, padding = 0;
memset(key1, 0, sizeof(key1));
memset(key2, 0, sizeof(key2));
memset(key3, 0, sizeof(key3));
memset(iv, 0, sizeof(iv));
memcpy(key1, KEY, 8);
memcpy(key2, KEY+8, 8);
memcpy(key3, KEY+16, 8);
memcpy(iv, IV, 8);
DES_set_key(&key1, &ks1);
DES_set_key(&key2, &ks2);
DES_set_key(&key3, &ks3);
// 计算填充字节
padding = 8 - input_len % 8;
len = input_len + padding;
// 填充
unsigned char *padding_input = (unsigned char *)malloc(len);
memcpy(padding_input, input, input_len);
memset(padding_input+input_len, padding, padding);
// 加密
unsigned char *tmp_output = (unsigned char *)malloc(len);
DES_ede3_cbc_encrypt(padding_input, tmp_output, len, &ks1, &ks2, &ks3, &iv, DES_ENCRYPT);
memcpy(output, tmp_output, len);
*output_len = len;
free(padding_input);
free(tmp_output);
return 0;
}
// 3DES解密
int des3_decrypt(unsigned char *input, int input_len, unsigned char *output, int *output_len)
{
DES_cblock key1, key2, key3, iv;
DES_key_schedule ks1, ks2, ks3;
int len = 0, padding = 0;
memset(key1, 0, sizeof(key1));
memset(key2, 0, sizeof(key2));
memset(key3, 0, sizeof(key3));
memset(iv, 0, sizeof(iv));
memcpy(key1, KEY, 8);
memcpy(key2, KEY+8, 8);
memcpy(key3, KEY+16, 8);
memcpy(iv, IV, 8);
DES_set_key(&key1, &ks1);
DES_set_key(&key2, &ks2);
DES_set_key(&key3, &ks3);
// 解密
unsigned char *tmp_output = (unsigned char *)malloc(input_len);
DES_ede3_cbc_encrypt(input, tmp_output, input_len, &ks1, &ks2, &ks3, &iv, DES_DECRYPT);
// 去掉填充字节
padding = tmp_output[input_len-1];
len = input_len - padding;
memcpy(output, tmp_output, len);
*output_len = len;
free(tmp_output);
return 0;
}
int main()
{
unsigned char input[] = "Hello world!";
unsigned char encrypt_output[128] = {0};
unsigned char decrypt_output[128] = {0};
int encrypt_output_len = 0;
int decrypt_output_len = 0;
// 加密
des3_encrypt(input, strlen(input), encrypt_output, &encrypt_output_len);
printf("encrypt_output: %s\n", encrypt_output);
// 解密
des3_decrypt(encrypt_output, encrypt_output_len, decrypt_output, &decrypt_output_len);
printf("decrypt_output: %s\n", decrypt_output);
return 0;
}
```
该示例代码使用了OpenSSL库中的DES函数。首先定义了24字节的密钥和8字节的初始向量,然后使用DES_set_key函数设置3个密钥和初始向量。接下来计算填充字节,使用DES_ede3_cbc_encrypt函数进行加密,加密后再去掉填充字节。解密过程与加密相似,使用DES_ede3_cbc_encrypt函数进行解密,解密后再去掉填充字节。最后使用main函数测试了加密和解密的效果。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)