1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
#include <iomanip>
#include <openssl/des.h>
using namespace std;
string plain = "cbc 加密";
unsigned char encrypted[1024] = {0};
DES_key_schedule schedule;
const_DES_cblock key = {'1', '2', '3', '4', '5', '6', '7', '8'};
DES_set_key_unchecked(&key, &schedule);
DES_cblock ivec = {'1', '2', '3', '4', '5', '6', '7', '8'};
int len = plain.length();
size_t padding = 8 - (len % 8); // 计算 paading 长度
plain.append(padding, padding); // PKCS#7 填充
DES_ncbc_encrypt(reinterpret_cast<const unsigned char *>(plain.data()), encrypted, plain.length(), &schedule, &ivec, DES_ENCRYPT);
cout << "加密:" << endl;
for (int i = 0; i < plain.length(); ++i) {
cout << hex << setw(2) << setfill('0') << (int)encrypted[i];
}
cout << endl;
cout << "解密:" << endl;
unsigned char output[1024];
DES_cblock ivec_dec = {'1', '2', '3', '4', '5', '6', '7', '8'};
DES_ncbc_encrypt(encrypted, output, plain.length(), &schedule, &ivec_dec, DES_DECRYPT);
int padding_len = output[plain.length() - 1];
for (int i = 0; i < plain.length() - padding_len; ++i) {
cout << output[i];
}
|