使用openssl库实现des,3des加密

释放双眼,带上耳机,听听看~!

说明:最近工作中用到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

给TA打赏
共{{data.count}}人
人已打赏
安全技术安全运维

Windows服务器如何发现被黑

2018-5-20 12:24:31

安全技术

用node.js做cluster,监听异常的邮件提醒服务

2021-12-21 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索