DES加密——C

DES

1. 简介

数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种 对称密钥加密 算法

DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。DES标准和3DES标准已逐渐被 **高级加密标准(AES)**所取代

2. 原理

DES是一种典型的块密码,一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。对DES而言,块长度为64位。同时,DES使用密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于奇偶校验(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),并在算法中被丢弃。因此,DES的有效密钥长度仅为56位。

2.1 模块图片

DES算法的主要流程如下图所示,按照流程依次介绍每个模块。

(1)整体模块

算法的整体结构如图1所示:有16个相同的处理过程,称为“回次”(round),并在首尾各有一次置换,称为IPFP(或称IP-1,FP为IP的反函数(即IP“撤销”FP的操作,反之亦然)。IP和FP几乎没有密码学上的重要性,为了在1970年代中期的硬件上简化输入输出数据库的过程而被显式的包括在标准中。

在主处理回次前,数据块被分成两个32位的半块,并被分别处理;这种交叉的方式被称为费斯妥结构。费斯妥结构保证了加密和解密过程足够相似—唯一的区别在于子密钥在解密时是以反向的顺序应用的,而剩余部分均相同。这样的设计大大简化了算法的实现,尤其是硬件实现,因为没有区分加密和解密算法的需要。

图中的 符号代表 **异或(XOR)**操作。“F函数”将数据半块与某个子密钥进行处理。然后,一个F函数的输出与另一个半块异或之后,再与原本的半块组合并交换顺序,进入下一个回次的处理。在最后一个回次完成时,两个半块需要交换顺序,这是费斯妥结构的一个特点,以保证加解密的过程相似。

在这里插入图片描述

(2)密钥调度模块

显示了加密过程中的密钥调度—产生子密钥的算法。首先,使用选择置换1(PC-1)从64位输入密钥中选出56位的密钥—剩下的8位要么直接丢弃,要么作为奇偶校验位。然后,56位分成两个28位的半密钥;每个半密钥接下来都被分别处理。在接下来的回次中,两个半密钥都被左移1或2位(由回次数决定),然后通过选择置换2(PC-2)产生48位的子密钥—每个半密钥24位。移位(图中由**<<**标示)表明每个子密钥中使用了不同的位,每个位大致在16个子密钥中的14个出现。

解密过程中,除了子密钥输出的顺序相反外,密钥调度的过程与加密完全相同。

在这里插入图片描述

(3)费斯妥函数(F函数)

其每次对半块(32位)进行操作,并包括四个步骤:

  1. 扩张—用扩张置换(图中的E)将32位的半块扩展到48位,其输出包括8个6位的块,每块包含4位对应的输入位,加上两个邻接的块中紧邻的位。
  2. 与密钥混合—用异或操作将扩张的结果和一个子密钥进行混合。16个48位的子密钥—每个用于一个回次的F变换—是利用密钥调度从主密钥生成的(见下文)。
  3. S盒—在与子密钥混合之后,块被分成8个6位的块,然后使用“S盒”,或称“置换盒”进行处理。8个S盒的每一个都使用以查找表方式提供的非线性的变换将它的6个输入位变成4个输出位。S盒提供了DES的核心安全性—如果没有S盒,密码会是线性的,很容易破解。
  4. 置换—最后,S盒的32个输出位利用固定的置换,“P置换”进行重组。这个设计是为了将每个S盒的4位输出在下一回次的扩张后,使用4个不同的S盒进行处理。

S盒,P置换和E扩张各自满足了克劳德·香农在1940年代提出的实用密码所需的必要条件,“混淆与扩散”。

在这里插入图片描述

2.2 步骤

密钥可以先生成,然后开始主模块运算。

(1)密钥置换

1、选择置换1(PC-1)

不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表生成(注意表中没有8,16,24,32,40,48,56和64这8位):

5749413325179
1585042342618
1025951433527
1911360524436
63554739312315
7625446383022
1466153453729
211352820124

在这里插入图片描述

2、密钥调度过程中的循环移位(loopShift)

1. 将56位的密钥分成两部分,每部分28位。
  2. 根据轮数,这两部分分别循环左移1位或2位。

轮数12345678910111213141516
左移位数1122222212222221

3、选择置换2(PC-2)

在DES的每一轮中,从56位密钥产生出不同的48位子密钥。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。压缩置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):

1417112415
3281562110
2319124268
1672720132
415231374755
304051453348
444939563453
464250362932

在这里插入图片描述

(2)初始置换

(IP, Initial permutation),表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。

585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157

在这里插入图片描述

(3)F 模块函数

1、扩张函数 (E函数)

扩张函数被作为最初和最终的置换。注意输入中的某些位在输出中被用到了不止一次,例如输入的第5位出现在输出的第6和8位。因此,32位的半块输入被扩张到了48位。

3212345
456789
8910111213
121314151617
161718192021
202122232425
242526272829
28293031321

在这里插入图片描述

2、置换盒 (S盒)

扩展置换之后,右半部分数据R0变为48位,与密钥置换得到的轮密钥进行异或。得到48位的数据,将这个数据送人S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。

列出了DES中使用的8个S盒。每个S盒将6位输入变为4位输出。给定输入后,输出行由外侧 2 位确定,列由内侧的 4 位确定,例如“011011”的输入的外侧位为“01”,内侧位为“1101”,而每张表的第一行为“00”,第一列为“0000”因此在S5中的对应输出为“1001”(十进制的9),即第2行,第14列

S1
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy01441312151183106125907
0yyyy10157414213110612119538
1yyyy04114813621115129731050
1yyyy11512824917511314100613
S2
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy01518146113497213120510
0yyyy13134715281412011069115
1yyyy00147111041315812693215
1yyyy11381013154211671205149
S3
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy01009146315511312711428
0yyyy11370934610285141211151
1yyyy01364981530111212510147
1yyyy11101306987415143115212
S4
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy07131430691012851112415
0yyyy11381156150347212110149
1yyyy01069012117131513145284
1yyyy13150610113894511127214
S5
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy02124171011685315130149
0yyyy11411212471315015103986
1yyyy04211110137815912563014
1yyyy11181271142136150910453
S6
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy01211015926801334147511
0yyyy11015427129561131401138
1yyyy09141552812370410113116
1yyyy14321295151011141760813
S7
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy04112141508133129751061
0yyyy11301174911014351221586
1yyyy01411131237141015680592
1yyyy16111381410795015142312
S8
x0000xx0001xx0010xx0011xx0100xx0101xx0110xx0111xx1000xx1001xx1010xx1011xx1100xx1101xx1110xx1111x
0yyyy01328461511110931450127
0yyyy11151381037412561101492
1yyyy07114191214206101315358
1yyyy12114741081315129035611

3、P置换

P置换将32位的半块数据重新排列。

1672021
29122817
1152326
5183110
282414
322739
1913306
2211425

在这里插入图片描述

(5)最终置换 (IP-1)

IP-1(亦被称为FP)是IP的逆过程。

408481656246432
397471555236331
386461454226230
375451353216129
364441252206028
353431151195927
342421050185826
33141949175725

在这里插入图片描述

3. 代码

3.1 全部代码

DES: https://github.com/2950833136/EnDeCode/tree/master/DES

3.2 使用

 -d, --decrypt     decrypt DES from input file
 -e, --encrypt     encrypt DES from input file
 -o, --output=FILE write result to FILE
 -h, --help        display this help

例如

生成密钥程序 
make genkey

生成密钥
genkey
(.\genkey.exe)

生成主程序
make

加密
des -k "0101110011111111000101110101100111000101111001110100110100001001" -e a.txt -o b.txt
(.\des.exe)
解密
des -k "0101110011111111000101110101100111000101111001110100110100001001" -d b.txt -o c.txt
(.\des.exe)

3.3 展示

加密为二进制所以读取乱码。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值