版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DES加密算法详解- - 对加密解密一直挺喜欢的,可还是没有怎么好好学习过,希望这是一个好的开始。在网上搜了一下关于DES的说明,发现有些杂乱,所以还是有必要整合一下。写了一点代码,还没有完成,不过,还不能编译通过,_刚看了一下,发现还是说得够模糊的,有机会再整理一下。昏倒,一直运行不对,今天才仔细查出来,原来问题是出在Des_Data_P(const _b32& input, _b32 output), 我的output用了传值调用,失败呀。应该是Des_Data_P(const _b32& input, _b32& output)DES算法的入口参数有三个:Key, Data, ModeK
2、ey 为64bit密钥, Data为64bit数据,Mode为加密还是解密。DES算法的过程:1. 对输入的密钥进行变换。 用户的64bit密钥,其中第8, 16, 24, 32, 40, 48, 56, 64位是校验位, 使得每个密钥都有奇数个1。所以密钥事实上是56位。对这56位密钥进行如下表的换位。57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54,
3、46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4,表的意思是第57位移到第1位,第49位移到第2位,. 以此类推。变换后得到56bit数据,将它分成两部分,C028, D028。2. 计算16个子密钥,计算方法Ci28 Di28为对前一个Ci-128, Di-128做循环左移操作。16次的左移位数如下表:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 (第i次)1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2,
4、1 (左移位数)3. 串联计算出来的Ci28 Di28 得到56位,然后对它进行如下变换得到48位子密钥Ki4814, 17,11, 24, 1, 5,3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32, 表的意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25, 35,38,43,54位
5、丢弃。4. 对64bit的明文输入进行换位变换。换位表如下:58, 50, 12, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7表的意思就是第一次变换时,第58位移到第1位,第50位移
6、到第2位,. 依此类推。得到64位数据,将这数据前后分成两块L032, R032。5. 加密过程,对Ri32进行扩展变换成48位数,方法如下, 记为E(Ri32)32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13,14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1,6. 将E(Ri32)与Ki48作异或运算,得到48位数,将48位数顺序分成8份,6位一份,
7、B86。7. 使用Si替换Bi6。过程如下: 取出Bi6的第1位和第6位连成一个2位数m, m就是Si中对应的行数(0-3),取出Bi6的第2到第5位连成一个4位数n(0-15),n就是Si中对应的列数,用Simn代替Bi6。S是4行16列的对应表,里面是4位的数,一共有8个S,定义如下:S1: 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6
8、,13,S2: 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,S3: 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,
9、7,4,15,14,3,11,5,2,12,S4: 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, S5: 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,1
10、4, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6: 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, S7: 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7
11、,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, S8: 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,8. 将从Bi6经过S得到的8个4位数连起来得到32位数。对这个数进行如下变换: 16,7,20,21,29,12,28,17, 1,15,23,26, 5,
12、18,31,10, 2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25, 得到的结果与Li32作异或运算,把结果赋给Ri32。9. 把Ri-132的值赋给Li,从5开始循环。直到K1648结束。10. 将最后的L,R合并成64位,然后进行如下转化得到最后的结果。这是对第4步的一个逆变化。40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 1
13、2, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25以上是Des的加密过程,解密过程同样,只需要把16个子密钥Ki48的顺序颠倒过来就行了。对应于第1-3的key生成过程:/wikipedia/en/thumb/3/3f/220px-DES-key-schedule.png对应于第4步开始:/wikipedia/en/thumb/
14、f/fd/250px-DES-main-network.png对应于第5步开始的循环操作:/wikipedia/en/thumb/1/1b/270px-DES-f-function.png代码:/* filename: gy_des.cpp */* *Some of codes are copyed from des.lib which is written by Eric Young (eaymincom.oz.au) * You can get the lib from ftp:/ftp.psy.uq.oz.au/pub/Crypto/D
15、ES/, */#include stdafx.h#include #include #include #include using namespace std;/using namespace gy;typedef bitset _b4;typedef bitset _b6;typedef bitset _b8;typedef bitset _b28;typedef bitset _b32;typedef bitset _b48;typedef bitset _b56;typedef bitset _b64;typedef vector _vb8;typedef vector _vb48;ty
16、pedef vector _vb64;namespace const unsigned char odd_parity256=1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62
17、, 62,64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,128,128,131,131,133,133,134,134,137,137,13
18、8,138,140,140,143,143,145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,208,208,211,211,213,21
19、3,214,214,217,217,218,218,220,220,223,223,224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254;const int keyperm_table5656 = 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52,
20、44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4;const int keycompperm_table48 = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34,
21、53, 46, 42, 50, 36, 29, 32;const int keyshift_table16 = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1;const int datainitperm_table64 = 58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35,
22、 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7;const int dataexpperm_table48 = 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1;const int datasbox_ta
23、ble8416 = 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3, 13, 4, 7, 15, 2, 8, 14
24、, 12, 0, 1, 10, 6, 9, 11, 5,0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,1, 10,
25、13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13
26、, 0, 14, 9,14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,9, 14, 15, 5, 2, 8, 12,
27、3, 7, 0, 4, 10, 1, 13, 11, 6,4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,13, 2,
28、 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,;const int datapperm_table32 = 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,2,
29、8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25;const int datafp_table64 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26, 33, 1
30、, 41, 9, 49, 17, 57, 25;template void rotateleft_bitset(bitset& input, size_t step)bitset tmp = input;input = _NB - step;input |= tmp;template void rotateright_bitset(bitset& input, size_t step)bitset tmp = input;input = step;tmp = _NB - step;input |= tmp;template void Des_Permutation( const Input&
31、input, Output& output, const Table& table, size_t TableSize)for (size_t i = 0; i TableSize; +i) outputi = input tablei-1 ;void Des_Key_Permutation1(const _b64& input, _b56& output)Des_Permutation(input, output, keyperm_table56, sizeof(keyperm_table56)/sizeof(int);void Des_Key_CompPerm(const _b56& in
32、put, _b48& output)Des_Permutation(input, output, keycompperm_table, sizeof(keycompperm_table)/sizeof(int);void Des_Key_Shift(_b56& key56, size_t step)_b28 l28, r28;int i;for (i = 0; i 28; +i) r28i = key56i;l28i = key5628+i;rotateleft_bitset(l28, step);rotateleft_bitset(r28, step);for (i = 0; i 28; +
33、i) key56i = r28i;key5628+i = l28i;void Des_Key_Generate(const _b64& key, _vb48& subkey)_b56 tmp56;Des_Key_Permutation1(key, tmp56);for (int i = 0; i 16; +i) _b48 tmp48;Des_Key_Shift(tmp56, keyshift_tablei);Des_Key_CompPerm(tmp56, tmp48);cout Key: tmp48 endl;subkey.push_back(tmp48);void Des_Char_To_B
34、inary(char c, string& binary)unsigned char tmp = odd_parityc;binary.append( (tmp & 0x80) ? 1 : 0 );binary.append( (tmp & 0x40) ? 1 : 0 );binary.append( (tmp & 0x20) ? 1 : 0 );binary.append( (tmp & 0x10) ? 1 : 0 );binary.append( (tmp & 0x08) ? 1 : 0 );binary.append( (tmp & 0x04) ? 1 : 0 );binary.appe
35、nd( (tmp & 0x02) ? 1 : 0 );binary.append( (tmp & 0x01) ? 1 : 0 );void Des_String_To_Binary(const string& input, _b64& output)string binary;for (int i = 0; i input.length(); +i ) Des_Char_To_Binary(inputi, binary);_b64 tmp64(binary);output = tmp64;void Des_String_To_Key(const string& key, _vb48& subk
36、ey)_b64 tmp64;Des_String_To_Binary(key, tmp64);Des_Key_Generate(tmp64, subkey);void Des_Data_ExpPerm(const _b32& input, _b48& output)Des_Permutation(input, output, dataexpperm_table, sizeof(dataexpperm_table)/sizeof(int);void Des_Data_IP(const _b64& input, _b64& output)Des_Permutation(input, output,
37、 datainitperm_table, sizeof(datainitperm_table)/sizeof(int);void Des_Data_S(const _b6& input, _b4& output, int step)bitset tmp2;_b4 tmp4;tmp20 = input5;tmp21 = input0;tmp40 = input1;tmp41 = input2;tmp42 = input3;tmp43 = input4;_b8 t8(datasbox_tablesteptmp2.to_ulong()tmp4.to_ulong();for (int i = 0; i
38、 4; +i) outputi = t8i;void Des_Data_S(const _b48& input, _b32& output)_b6 tmp6;_b4 tmp4;int i, j;for (i = 0; i 8; +i) for (j = 6; j 0; -j) tmp6j = input 47 - i*6 - j;Des_Data_S(tmp6, tmp4, i);for (j = 0; j 4; +j) output 31 - (i 2) - j = tmp4j;void Des_Data_P(const _b32& input, _b32& output)Des_Permu
39、tation(input, output, datapperm_table, sizeof(datapperm_table)/sizeof(int);void Des_Data_F(_b64& input, const _b48& key)_b32 l32, r32, tmp32, t32;_b48 exp48;int i;for (i = 0; i 32; +i ) r32i = inputi;l32i = input32+i;/cout r32* r32 endl;Des_Data_ExpPerm(r32, exp48);/cout exp* exp48 endl;/cout key* key endl;exp48 = key;/cout exp* exp48 endl;Des_Data_S(exp48, tmp32);/cout tmp* tmp32 endl;Des_Data_P(tmp32, t32);/cout t32* t32 endl;t32 = l32;l32 = r32;r32 = t32;for (i = 0; i 32; +i ) inputi = r32i;input32+i = l32i;void Des_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度冶金工业技能鉴定模拟试题汇编附答案详解
- 2024-2025学年主管护师(中级)综合提升测试卷附答案详解(综合题)
- 项目合作谈判邀请函(6篇范文)
- 2024-2025学年度化验员经典例题(夺冠系列)附答案详解
- 2024-2025学年医院三基考试每日一练试卷附参考答案详解【综合题】
- 2024-2025学年度电工高分题库1套附答案详解
- 2024-2025学年冶金工业技能鉴定模拟题库及答案详解【夺冠系列】
- 2024-2025学年度监理工程师每日一练试卷带答案详解(预热题)
- 2024-2025学年度公务员(国考)全真模拟模拟题及完整答案详解(易错题)
- 2024-2025学年冶金工业技能鉴定考试彩蛋押题含完整答案详解【必刷】
- 水果干制品(无核蜜枣、杏脯、干枣)HACCP计划
- 学前教育学第2版全套PPT完整教学课件
- 护理伦理学(第二版)高职PPT完整全套教学课件
- 货架技术要求
- 本科专业评估指标体系
- 钻孔灌注桩专项施工方案
- 2023版中国近现代史纲要课件第一专题历史是最好的教科书PPT
- 耳尖放血课件完整版
- 绳正法曲线拨道量计算器
- GB/T 3292.1-2008纺织品纱线条干不匀试验方法第1部分:电容法
- GB/T 31430-2015中国传统色色名及色度特性
评论
0/150
提交评论