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,