京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

3DES加解密 C语言

2019-11-12 11:26| 发布者: zhaojun917| 查看: 1462| 评论: 0|原作者: 梦想之都-俊月星空

摘要: 3DES加解密 C语言3DES(或称为Triple DES),它相当于是对每个数据块应用三次DES加密算法。3*8字节密钥。设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文;  3DES加密过 ...

3DES(或称为Triple DES),它相当于是对每个数据块应用三次DES加密算法。3*8字节密钥。

设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文;

  3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

  3DES解密过程为:P=Dk1((EK2(Dk3(C)))

补齐方式PKCS7

             k=8,l=数据长度

                      01 -- if l mod k = k-1
       02 02 -- if l mod k = k-2
                                .
                                .
                                .
             k k ... k k -- if l mod k = 0

 

想在数据库中直接对数据进行加密,考虑使用udf函数对数据加密,考虑效率使用c语言更好一些,创建c语言的udf。

将openssl源码中的3DES加解密的源代码摘出来,在linux下编译测试。测试成功,然后按照udf的规则重新组织就可以使用了。

$gcc -Wall -O2 -o des3_func des3_func.c  
复制代码
  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 
  5 #define DES_LONG unsigned long
  6 #define LEN_OF_KEY 24
  7  
  8 #define ITERATIONS 16
  9 
 10 #define c2l(c,l)        (l =((DES_LONG)(*((c)++)))    , \
 11                          l|=((DES_LONG)(*((c)++)))<< 8L, \
 12                          l|=((DES_LONG)(*((c)++)))<<16L, \
 13                          l|=((DES_LONG)(*((c)++)))<<24L)
 14 
 15 
 16 #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \
 17                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
 18                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
 19                          *((c)++)=(unsigned char)(((l)>>24L)&0xff))
 20 
 21 #define ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
 22 
 23 #define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
 24 #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
 25         u=R^s[S  ]; \
 26         t=R^s[S+1]
 27         
 28 #define D_ENCRYPT(LL,R,S) {\
 29         LOAD_DATA_tmp(R,S,u,t,E0,E1); \
 30         t=ROTATE(t,4); \
 31         LL^=\
 32                 DES_SPtrans[0][(u>> 2L)&0x3f]^ \
 33                 DES_SPtrans[2][(u>>10L)&0x3f]^ \
 34                 DES_SPtrans[4][(u>>18L)&0x3f]^ \
 35                 DES_SPtrans[6][(u>>26L)&0x3f]^ \
 36                 DES_SPtrans[1][(t>> 2L)&0x3f]^ \
 37                 DES_SPtrans[3][(t>>10L)&0x3f]^ \
 38                 DES_SPtrans[5][(t>>18L)&0x3f]^ \
 39                 DES_SPtrans[7][(t>>26L)&0x3f]; }
 40 
 41 #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
 42         (b)^=(t),\
 43         (a)^=((t)<<(n)))
 44 
 45 #define IP(l,r) \
 46         { \
 47         register DES_LONG tt; \
 48         PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
 49         PERM_OP(l,r,tt,16,0x0000ffffL); \
 50         PERM_OP(r,l,tt, 2,0x33333333L); \
 51         PERM_OP(l,r,tt, 8,0x00ff00ffL); \
 52         PERM_OP(r,l,tt, 1,0x55555555L); \
 53         }
 54 
 55 #define FP(l,r) \
 56         { \
 57         register DES_LONG tt; \
 58         PERM_OP(l,r,tt, 1,0x55555555L); \
 59         PERM_OP(r,l,tt, 8,0x00ff00ffL); \
 60         PERM_OP(l,r,tt, 2,0x33333333L); \
 61         PERM_OP(r,l,tt,16,0x0000ffffL); \
 62         PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
 63         }
 64 
 65 extern const DES_LONG DES_SPtrans[8][64];         
 66 
 67 
 68 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
 69         (a)=(a)^(t)^(t>>(16-(n))))
 70 
 71 static const DES_LONG des_skb[8][64] = {
 72     {
 73      /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
 74      0x00000000L, 0x00000010L, 0x20000000L, 0x20000010L,
 75      0x00010000L, 0x00010010L, 0x20010000L, 0x20010010L,
 76      0x00000800L, 0x00000810L, 0x20000800L, 0x20000810L,
 77      0x00010800L, 0x00010810L, 0x20010800L, 0x20010810L,
 78      0x00000020L, 0x00000030L, 0x20000020L, 0x20000030L,
 79      0x00010020L, 0x00010030L, 0x20010020L, 0x20010030L,
 80      0x00000820L, 0x00000830L, 0x20000820L, 0x20000830L,
 81      0x00010820L, 0x00010830L, 0x20010820L, 0x20010830L,
 82      0x00080000L, 0x00080010L, 0x20080000L, 0x20080010L,
 83      0x00090000L, 0x00090010L, 0x20090000L, 0x20090010L,
 84      0x00080800L, 0x00080810L, 0x20080800L, 0x20080810L,
 85      0x00090800L, 0x00090810L, 0x20090800L, 0x20090810L,
 86      0x00080020L, 0x00080030L, 0x20080020L, 0x20080030L,
 87      0x00090020L, 0x00090030L, 0x20090020L, 0x20090030L,
 88      0x00080820L, 0x00080830L, 0x20080820L, 0x20080830L,
 89      0x00090820L, 0x00090830L, 0x20090820L, 0x20090830L,
 90      },
 91     {
 92      /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
 93      0x00000000L, 0x02000000L, 0x00002000L, 0x02002000L,
 94      0x00200000L, 0x02200000L, 0x00202000L, 0x02202000L,
 95      0x00000004L, 0x02000004L, 0x00002004L, 0x02002004L,
 96      0x00200004L, 0x02200004L, 0x00202004L, 0x02202004L,
 97      0x00000400L, 0x02000400L, 0x00002400L, 0x02002400L,
 98      0x00200400L, 0x02200400L, 0x00202400L, 0x02202400L,
 99      0x00000404L, 0x02000404L, 0x00002404L, 0x02002404L,
100      0x00200404L, 0x02200404L, 0x00202404L, 0x02202404L,
101      0x10000000L, 0x12000000L, 0x10002000L, 0x12002000L,
102      0x10200000L, 0x12200000L, 0x10202000L, 0x12202000L,
103      0x10000004L, 0x12000004L, 0x10002004L, 0x12002004L,
104      0x10200004L, 0x12200004L, 0x10202004L, 0x12202004L,
105      0x10000400L, 0x12000400L, 0x10002400L, 0x12002400L,
106      0x10200400L, 0x12200400L, 0x10202400L, 0x12202400L,
107      0x10000404L, 0x12000404L, 0x10002404L, 0x12002404L,
108      0x10200404L, 0x12200404L, 0x10202404L, 0x12202404L,
109      },
110     {
111      /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
112      0x00000000L, 0x00000001L, 0x00040000L, 0x00040001L,
113      0x01000000L, 0x01000001L, 0x01040000L, 0x01040001L,
114      0x00000002L, 0x00000003L, 0x00040002L, 0x00040003L,
115      0x01000002L, 0x01000003L, 0x01040002L, 0x01040003L,
116      0x00000200L, 0x00000201L, 0x00040200L, 0x00040201L,
117      0x01000200L, 0x01000201L, 0x01040200L, 0x01040201L,
118      0x00000202L, 0x00000203L, 0x00040202L, 0x00040203L,
119      0x01000202L, 0x01000203L, 0x01040202L, 0x01040203L,
120      0x08000000L, 0x08000001L, 0x08040000L, 0x08040001L,
121      0x09000000L, 0x09000001L, 0x09040000L, 0x09040001L,
122      0x08000002L, 0x08000003L, 0x08040002L, 0x08040003L,
123      0x09000002L, 0x09000003L, 0x09040002L, 0x09040003L,
124      0x08000200L, 0x08000201L, 0x08040200L, 0x08040201L,
125      0x09000200L, 0x09000201L, 0x09040200L, 0x09040201L,
126      0x08000202L, 0x08000203L, 0x08040202L, 0x08040203L,
127      0x09000202L, 0x09000203L, 0x09040202L, 0x09040203L,
128      },
129     {
130      /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
131      0x00000000L, 0x00100000L, 0x00000100L, 0x00100100L,
132      0x00000008L, 0x00100008L, 0x00000108L, 0x00100108L,
133      0x00001000L, 0x00101000L, 0x00001100L, 0x00101100L,
134      0x00001008L, 0x00101008L, 0x00001108L, 0x00101108L,
135      0x04000000L, 0x04100000L, 0x04000100L, 0x04100100L,
136      0x04000008L, 0x04100008L, 0x04000108L, 0x04100108L,
137      0x04001000L, 0x04101000L, 0x04001100L, 0x04101100L,
138      0x04001008L, 0x04101008L, 0x04001108L, 0x04101108L,
139      0x00020000L, 0x00120000L, 0x00020100L, 0x00120100L,
140      0x00020008L, 0x00120008L, 0x00020108L, 0x00120108L,
141      0x00021000L, 0x00121000L, 0x00021100L, 0x00121100L,
142      0x00021008L, 0x00121008L, 0x00021108L, 0x00121108L,
143      0x04020000L, 0x04120000L, 0x04020100L, 0x04120100L,
144      0x04020008L, 0x04120008L, 0x04020108L, 0x04120108L,
145      0x04021000L, 0x04121000L, 0x04021100L, 0x04121100L,
146      0x04021008L, 0x04121008L, 0x04021108L, 0x04121108L,
147      },
148     {
149      /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
150      0x00000000L, 0x10000000L, 0x00010000L, 0x10010000L,
151      0x00000004L, 0x10000004L, 0x00010004L, 0x10010004L,
152      0x20000000L, 0x30000000L, 0x20010000L, 0x30010000L,
153      0x20000004L, 0x30000004L, 0x20010004L, 0x30010004L,
154      0x00100000L, 0x10100000L, 0x00110000L, 0x10110000L,
155      0x00100004L, 0x10100004L, 0x00110004L, 0x10110004L,
156      0x20100000L, 0x30100000L, 0x20110000L, 0x30110000L,
157      0x20100004L, 0x30100004L, 0x20110004L, 0x30110004L,
158      0x00001000L, 0x10001000L, 0x00011000L, 0x10011000L,
159      0x00001004L, 0x10001004L, 0x00011004L, 0x10011004L,
160      0x20001000L, 0x30001000L, 0x20011000L, 0x30011000L,
161      0x20001004L, 0x30001004L, 0x20011004L, 0x30011004L,
162      0x00101000L, 0x10101000L, 0x00111000L, 0x10111000L,
163      0x00101004L, 0x10101004L, 0x00111004L, 0x10111004L,
164      0x20101000L, 0x30101000L, 0x20111000L, 0x30111000L,
165      0x20101004L, 0x30101004L, 0x20111004L, 0x30111004L,
166      },
167     {
168      /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
169      0x00000000L, 0x08000000L, 0x00000008L, 0x08000008L,
170      0x00000400L, 0x08000400L, 0x00000408L, 0x08000408L,
171      0x00020000L, 0x08020000L, 0x00020008L, 0x08020008L,
172      0x00020400L, 0x08020400L, 0x00020408L, 0x08020408L,
173      0x00000001L, 0x08000001L, 0x00000009L, 0x08000009L,
174      0x00000401L, 0x08000401L, 0x00000409L, 0x08000409L,
175      0x00020001L, 0x08020001L, 
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 19:07 , Processed in 0.084093 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.