说明:最近工作中用到3des(Triple DES)加密,网上的资料大部分都是介绍算法原理,没什么兴趣,man了一下查到openssl提供DES_ecb3_encrypt方法,正合我意!提示:openssl库支持很多加密算法哦,如:AES/DES/MD5/RSA…,而且很轻松的支持其他平台,我就在winXP下安装了openssl并在VC中设置头文件目录及库文件目录,用来是用openssl库。 代码下载:linux平台代码:http://pickup.mofile.com/2320229012095812windows平台代码:http://pickup.mofile.com/7098802825381299具体使用时需要注意des算法的加密模式、密钥长度、补齐方式,我这里采用3des的ECB方式、24位密钥(不足右补0)、内容长度以8字节切分,不能被8整除的末尾部分,根据长度不足8字节的部分,填充0x01-0x08
今天修正了一下代码里面一个常识性错误:des加密密钥也是8位来处理的,所以在密钥置换时只取8位。希望没有误导大家,我同时更新了源代码下载地址好代码,标准的位数不足应该都补0x00把另外,如何得到全部的加密后密文的16进制字符?
代码如下:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <openssl/des.h>
5
6/************************************************************************
7 ** 本例采用:
8 ** 3des-ecb加密方式;
9 ** 24位密钥,不足24位的右补0x00;
10 ** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...
11 ** 本身已8位对齐的,后面补八个0x08。
12 ************************************************************************/
13int main(void)
14{
15 int docontinue = 1;
16 unsigned char *data = "hello world!"; /* 明文 */
17 int data_len;
18 int data_rest;
19 unsigned char ch;
20 unsigned char *src = NULL; /* 补齐后的明文 */
21 unsigned char *dst = NULL; /* 解密后的明文 */
22 int len;
23 unsigned char tmp8;
24 unsigned char in8;
25 unsigned char out8;
26 char *k = "01234567899876543210"; /* 原始密钥 */
27 int key_len;
28#define LEN_OF_KEY 24 unsigned char keyLEN_OF_KEY; /* 补齐后的密钥 */
29 unsigned char block_key9;
30 DES_key_schedule ks, ks2, ks3; /* 构造补齐后的密钥 */
31 key_len = strlen(k);
32 memcpy(key, k, key_len);
33 memset(key + key_len, 0x00, LEN_OF_KEY - key_len); /* 分析补齐明文所需空间及补齐填充数据 */
34 data_len = strlen(data);
35 data_rest = data_len % 8;
36 len = data_len + (8 - data_rest);
37 ch = 8 - data_rest;
38 src = malloc(len);
39 dst = malloc(len);
40 if (NULL == src || NULL == dst)
41 {
42 docontinue = 0;
43 }
44 if (docontinue)
45 {
46 int count;
47 int i; /* 构造补齐后的加密内容 */
48 memset(src, 0, len);
49 memcpy(src, data, data_len);
50 memset(src + data_len, ch, 8 - data_rest); /* 密钥置换 */
51 memset(block_key, 0, sizeof(block_key));
52 memcpy(block_key, key + 0, 8);
53 DES_set_key_unchecked((const_DES_cblock *)block_key, &ks);
54 memcpy(block_key, key + 8, 8);
55 DES_set_key_unchecked((const_DES_cblock *)block_key, &ks2);
56 memcpy(block_key, key + 16, 8);
57 DES_set_key_unchecked((const_DES_cblock *)block_key, &ks3);
58 printf("before encrypt:");
59 for (i = 0; i < len; i++)
60 {
61 printf("0x%.2X ", *(src + i));
62 }
63 printf("/n"); /* 循环加密/解密,每8字节一次 */
64 count = len / 8;
65 for (i = 0; i < count; i++)
66 {
67 memset(tmp, 0, 8);
68 memset(in, 0, 8);
69 memset(out, 0, 8);
70 memcpy(tmp, src + 8 * i, 8); /* 加密 */
71 DES_ecb3_encrypt((const_DES_cblock *)tmp, (DES_cblock *)in, &ks, &ks2, &ks3, DES_ENCRYPT); /* 解密 */
72 DES_ecb3_encrypt((const_DES_cblock *)in, (DES_cblock *)out, &ks, &ks2, &ks3, DES_DECRYPT); /* 将解密的内容拷贝到解密后的明文 */
73 memcpy(dst + 8 * i, out, 8);
74 }
75 printf("after decrypt :");
76 for (i = 0; i < len; i++)
77 {
78 printf("0x%.2X ", *(dst + i));
79 }
80 printf("/n");
81 }
82 if (NULL != src)
83 {
84 free(src);
85 src = NULL;
86 }
87 if (NULL != dst)
88 {
89 free(dst);
90 dst = NULL;
91 }
92 return 0;
93}
94