这是我们信安协会很早布置的作业,前几天终于写完了,嘿嘿O(∩_∩)O~
其实DES加密很简单,流程如下
1.对64位明文进行初置换,结果为A
2.将A分为两部分,左32位记为L,右32位记为R
3.对R进行拓展置换,得到X(48位)
4.将第I轮的密钥与X异或,得到Y(48位)
5.将Y穿入S盒,得到Z(32位)
6.将Z与L异或,结果传入L中
7.交换R和L
8.再次重复2~7,共计16次
9.将L和R整合,并将结果做末置换,加密完成
解密的流程其实是一样的额,只不过密钥不一样
假设加密时第i轮用的密钥Ki,那么解密时第i轮用的密钥是K(17-i)
下面说一下密钥生成的过程:
首先,我们一开始输入的密钥为X(64位)
1.将密钥X做密钥置换,取出其中58位记为T(58位)
2.取T左边28位为L,T右边28位为R
3.分别对R,L作循环左移
4.再对其做扩展运算,得到K[i]
6.重复3~4,共16次
这样大概也就说清楚了
#include<stdio.h>
#include<iostream>
#include<string.h>
#define BIT bool
using namespace std;
BIT K[16][48];
int
//初置换
IP[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},
//末置换
FP[64] = {
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 , 41 , 9 , 49 , 17 , 57 , 25},
//密钥置换
KP[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