一個有具體流程的:http://blog.chinaunix.net/uid-29106641-id-4032988.html
pdf版的:http://www.ieccr.net/xdmmx/shijianjiaoxuedoc/1-2.pdf
目前困擾我的問題有:如果密文的長度大于或者少于64比特會怎么辦王带。
解決方案:分塊處理,有ECB市殷,CBC愕撰,等具體請戳:https://www.wikiwand.com/zh/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F
https://crypto.stackexchange.com/questions/1064/how-can-i-encrypt-more-than-64-bit-with-the-data-encryption-standard
按照流程圖:
DES算法的原理:
1.
明確會有data(用于加密的數(shù)據(jù)),key(密鑰)醋寝,mode(加密或者解密)
2.
首先將data(二進(jìn)制的形式搞挣,我們可以先造一個適合的64位的二進(jìn)制數(shù)組)根據(jù)IP表的變換而變換。
//擬造的data
static bool data[64] = {
1,0,1,0,0,0,0,0,
1,1,1,0,1,1,1,1,
0,0,1,0,1,0,0,1,
0,1,0,0,1,0,1,0,
0,1,1,1,0,1,1,1,
0,0,0,1,1,1,1,0,
0,1,0,0,0,1,1,0,
0,0,1,0,1,0,1,0
};
//IP表
const static char IP_Table[64] = {
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,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
};
意義為:IP表中的58指的是data表的第58個數(shù)(從1開始算的音羞,不是數(shù)組的從0開始算)在經(jīng)過IP變換后要放置在第0位囱桨,49放在第1位。
3.
將置換過后的64位數(shù)據(jù)分為L0和R0兩部分嗅绰。L0為前32位舍肠,R0為后32位。
4.
下面的16輪相同運算是這個里面最麻煩的一個窘面,也是一個重點翠语。分幾點來講。
4.1.
密鑰的生成财边。也就是Key肌括,為了增加破解難度,每一層使用的Key都是基于上一層Key經(jīng)過轉(zhuǎn)換而得到的。具體的轉(zhuǎn)換方法是:
DES算法由64位密鑰產(chǎn)生16輪的48位子密鑰。在每一輪的迭代過程中拍鲤,使用不同的子秘鑰。
a慧库、把密鑰的奇偶校驗位忽略不參與計算,即每個字節(jié)的第8位馋嗜,將64位密鑰降至56位齐板,然后根據(jù)選擇置換PC-1將這56位分成兩塊Key_L0(28位)和Key_R0(28位);
b葛菇、將Key_L0 and Key_R0進(jìn)行循環(huán)左移變化(注:每輪循環(huán)左移的位數(shù)由輪數(shù)決定)甘磨,變換后生成Key_Moved_L0和Key_Moved_R0,然后Key_Moved_L0和Key_Moved_R0合并眯停,并通過選擇置換PC-2生成子密鑰K1(48位)济舆;
c、Key_L1和Key_R1在次經(jīng)過循環(huán)左移變換莺债,生成Key_Moved_L1和Key_Moved_R1滋觉,然后Key_Moved_L1和Key_Moved_R1合并签夭,通過選擇置換PC-2生成密鑰K2(48位);
d椎侠、以此類推第租,得到K16(48位)。但是最后一輪的左右兩部分不交換我纪,而是直接合并在一起R16L16慎宾,作為逆置換的輸入塊。其中循環(huán)左移的位數(shù)一共是循環(huán)左移16次浅悉,其中第一次趟据、第二次、第九次术健、第十六次是循環(huán)左移一位之宿,其他都是左移兩位。
//PC1選位表(密鑰生成置換表1)
const static int PC1_Table[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,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
};
//PC2選位表(密鑰生成置換表2)
const static int PC2_Table[48] = {
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,53,
46,42,50,36,29,32
};
//左移位數(shù)表
const static int LOOP_Table[16] = {
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};