数据加密 ---- DES 加密

1. 简介

    数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及怀疑内含美国国家安全局(NSA)的后门而在开始时有争议,DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。
 

其他算法可以看:数据加密 ---- 总篇

 

2. 形成过程

  • 1973年5月15日,在咨询了美国国家安全局(NSA)之后,NBS向公众征集可以满足严格设计标准的加密算法。然而,没有一个提案可以满足这些要求。
  • 1974年8月27日,NBS开始了第二次征集。这一次,IBM提交了一种在1973-1974年间发展的算法,这份提案被有限度的接受了。这种算法是基于早先霍斯特·费斯托(Horst
  • Fiestel)提出的Lucifer算法的。
  • 1975年3月17日,被选中的DES在“联邦公报”上公布并征集公众意见。
  • 1976年8月,NBS举行了两个开放式研讨会以讨论该标准。
  • 1976年11月,DES 被确认为联邦标准。
  • 1977年1月15日,作为FIPS PUB 46发布,被授权用于所有非机密资料。
  • 1983年,DES 第一次延长标准期限。
  • 1986年,HBO开始使用一个基于DES的电视卫星加密系统。
  • 1988年1月12日,DES第二次延长标准期限,称为FIPS 46-1,取代FIPS PUB 46。
  • 1993年12月30日,DES作为FIPS 46-2第三次延长标准期限。
  • 1997年6月,DESCHAL计划第一次公开破解了DES加密的信息。
  • 1998年7月,EFF的DES破解机(Deep Crack)在56小时内破解了DES密钥。
  • 1999年1月,Deep Crack和distributed.net合作在22小时15分钟内破解了一个DES密钥。
  • 1999年10月25日,DES作为FIPS46-3第四次延长标准期限,其中规定优先使用 3DES,而普通DES只允许在遗 留的系统中应用。
  • 2001年2月28日,联邦公报发表了AES标准,以此开始了其标准化进程。
  • 2001年11月26日,AES作为FIPS 197发布。
  • 2002年5月26日,AES标准开始生效。
  • 2004年7月26日,“联邦公报”发布了FIPS 46-3以及一系列相关标准被驳回的信息。
  • 2005年5月19日,NIST拒绝了FIPS 46-3标准。

 

3. 加密过程

DES 的加密步骤大概分如下:

  • 初始轮(IP 函数):进行数据置换
  • 重复轮(16次相同的处理,又称“回次”),其中包括通过费斯托函数(F函数)进行异或处理
  • 最终轮(FP 函数):再次进行数据置换,为第一步IP 的反函数(FP 也 成为IP^{-1} )。

其中,IP和FP几乎没有密码学上的重要性,为了在1970年代中期的硬件上简化输入输出数据库的过程而被显式的包括在标准中(后面会介绍)

详细加密过程请看下面第 4 点。
 

4. 算法说明

    同 AES加密,DES 也是分组加密(也称为块加密)的一种。明文规定是64位,密钥也是64位(实际有效的是56位,其中8位位奇偶校验,并在算法中被丢弃)。
例如,有密钥64位:133457799BBCDFF1
           即K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
其中,第8、16、24、32、40、48、56、64位为奇偶校验位
与其它块密码相似,DES自身并不是加密的实用手段,而必须以某种工作模式进行实际操作。DES 中常用到的工作模式有::ECB、CBC、CFB 和 OFB。FIPS PUB 81中原文如下:

The Federal Data Encryption Standard (DES) (FIPS 46) specifies a crypto-graphic algorithm to be used for the cryptographic protection of sensitive, but unclassified, computer data. This FIPS defines four modes of operation for the DES which may be used in a wide variety of applications. The modes specify how data will be encrypted (cryptographically protected) and decrypted (returned to original form). The modes included in this standard are the Electronic Codebook (ECB) mode, the Cipher Block Chaining (CBC) mode, the Cipher Feedback (CFB) mode, and the Output Feedback (OFB) mode.

4.1 整体结构(费斯托结构)

图1  DES的费斯托结构

如图1 所示,整个DES 算法过程采用费斯托结构。

  • 明文的64 位数据,在做IP 之前会进行拆分左右两部分,分别为L 和 R。

例如,有明文64位:0123456789ABCDEF
        即 P(64位) = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
         L(32位) = 0000 0001 0010 0011 0100 0101 0110 0111
         R(32位) = 1000 1001 1010 1011 1100 1101 1110 1111

  • 将得到的L 和R 进行置换处理(IP),得到 {\color{Red} L_0} 和 {\color{Red}R_0}

IP 请看下面附1.

  • 进行16 次相同回合的处理

算法可以细分为:

step 1 第一次进入设定初始值

L_x = L_0

R_x = R_0

step 2 将上一回的 R_i 作为下一回的 L ,将上一回的 L_i ⊕F(R_i)  作为下一回的 R

总结公式为:

Te = L_x

L_x = R_x

R_x = Te ⊕ F(R_x)

其中Te 为临时变量。

step 3 将最后的 L_x 和 R_x 进行调换

经过最后一回合的计算得到L_x 和 R_x 本来是为了第 17 回合准备的,但是这里只有 16 回合,下一步需要进行FP,所以,需要将最终拿到的L_x 和 R_x 进行调换,作为FP 的初始值

  • 进行反置换运算 FP

从上面得到的最终的L_x 和 R_x 作为FP 的初始值,进行置换,得到最后的L' 和 R' 就为最后的密文的L 和R。

FP 详见下面附2.

 

4.2 费斯托函数

图 2 为费斯托函数的运算图。

图2      DES 的费斯托函数(F 函数)

大概包含 4 步:

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

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

E 置换详见下面附3.

P 置换详见下面附4.

S 盒详见下面附5.

 

4.3 密钥调度

图3显示了加密过程中的密钥调度—产生子密钥的算法。

图3   DES 的密钥调度
  • 使用选择置换1(PC-1)从64位输入密钥中选出56位的密钥—剩下的8位要么直接丢弃,要么作为奇偶校验位。

得到的56位密钥,会被分成左28位和右28位,详见附6 中的PC-1

  • 将得到的两个半密钥(各28位)分别进行移位,详见附8
  • 上一步中得到的重新移位过的两个半密钥通过选择置换2(PC-2)产生48位的子密钥—每个半密钥24位。
  • 将得到的最新的48位的密钥进行费斯托函数运算。

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

PC-1 详见附6.

PC-2 详见附7.

每一回合的移位详见附8。

 

其他算法可以看:数据加密 ---- 总篇

 

5. 附录

附1 置换函数IP

585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157

    该表显示了对64位块的初始置换,其意义如下:输出的首位为输入的第58位,第二位为50位,依此类推,输出的最后位为输入的第7位。

    信息为了方便表示被写成表格形式,但它实际上是一个矢量,而非矩阵。

 

 

 

 

 

 

附2 反置换函数FP(又称 IP^{-1})

408481656246432
397471555236331
386461454226230
375451353216129
364441252206028
353431151195927
342421050185826
33141949175725

     IP-1(亦被称为FP)是IP的逆过程,上表的含义与IP的相似。

 

 

 

 

 

 

 

 

附3 扩张置换 E

3212345
456789
8910111213
121314151617
161718192021
202122232425
242526272829
28293031321

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

 

 

 

 

 

 

 

附4 P 置换

1672021
29122817
1152326
5183110
282414
322739
1913306
2211425

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

 

 

 

 

 

 

 

 

附5 S 盒

从上面图2 可以看到费斯托函数会分8个S盒,数据共48位,每一个盒子会将6位数据变为4位数据。

给定输入后,输出行由外侧两位确定,列由内侧的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

附6 选择置换 PC-1

5749413325179
1585042342618
1025951433527
1911360524436
63554739312315
7625446383022
1466153453729
211352820124

 

    上表的“左”和“右”两部分表现了输入密钥组成密钥调度状态中左右两部分的过程。主要输入的64位数据中只用到了56位,剩余的8位可以用于奇偶校验。

 

 

 

 

 

 

 

 

附7 选择置换 PC-2

1417112415
3281562110
2319124268
1672720132
415231374755
304051453348
444939563453
464250362932

    该置换从56位的密钥调度状态中取出48位的子密钥。

 

 

 

 

 

 

 

 

附8 密钥调度过程中的移位

回次左移位数
11
21
32
42
52
62
72
82
91
102
112
122
132
142
152
161

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附9. Android 实例

https://blog.csdn.net/shift_wwx/article/details/84062441

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值