对称分组密码之数据加密标准(DES)

分组密码

分组密码和流密码的关系

1、流密码每次加密数据流的一位或一个字节。 分组密码加解密方案把输入的明文分组当作一个整体进行加密,并且通常得到与明文等长的密文分组。

Feistel结构

置换:明文元素被替换为该序列的其他元素(顺序改变)。
代替:明文元素(组)被唯一地替换为相应地密文元素(组)。

对付统计分析方法——扩散和混淆(对分组密码设计有重要作用)
扩散:每个密文数字被多个明文数字影响,明文的统计特征消散在密文中【重复对明文进行置换后再用某个函数作用】。
混淆:使密文和加密密钥之间的统计关系变得更加复杂【复杂的代替算法】。
Feistel加密和解密
LEi = REi-1
REi = LEi-1 ^ F(REi-1,ki)
等价于:
LEi-1 = RE ^ F(REi-1,Ki) = REi ^ F(LEi,Ki)
REi-1 = LEi

数据加密标准DES(Data Encryption Standard)——对称加密

DES体现经典的Feistel结构,Feistel结构由许多相同的轮函数组成,在每一轮中,对输入数据的一半进行代替,接着用一个置换来交换数据的两个等分部分——可以用这种方法将初始密钥扩展出不同的子密钥。

可逆变换:2n个不同的明文分组,每一个明文分组将唯一对应一个密文分组,可解密。
如果n充分大,那明文的统计特征将被覆盖,密钥规模是n×2n

Feistel密码的解密算法与加密算法是相同的,只是子密钥的使用次序相反。

DES对差分分析和线性分析都有很强的免疫力。
在这里插入图片描述
置换表的含义:把二进制序列的每一位,替换为置换表对应位的二进制码。

输入测试实例:
明文:0x31 0x31 0x31 0x31 0x31 0x31 0x31 0x31
密钥:0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30
可知明文二进制:

00110001 00110001 00110001 00110001 00110001 00110001 00110001 00110001

密钥二进制:

00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000

DES算法的实现过程之密钥的产生
1、64密钥经过压缩置换选择PC1作用后得56位(排除第8,16,24,32,40,48,56,64的校验位)。
压缩置换选择PC1
密钥进行PC1压缩置换后的结果:

0000000 0000000 0011111 1111111 0000000 0000000 0000000 0001111

2、分为左右各28位得两部分,分别进行循环移位,每轮的置换函数相同,由于循环移位使获得的子密钥有所不同。
移位数组
子密钥生成过程中,左边生成的值:

C[0]: 0000000 0000000 0011111 1111111
C[1]: 0000000 0000000 0111111 1111110
C[2]: 0000000 0000000 1111111 1111100
C[3]: 0000000 0000011 1111111 1110000
C[4]: 0000000 0001111 1111111 1000000
C[5]: 0000000 0111111 1111110 0000000
C[6]: 0000001 1111111 1111000 0000000
C[7]: 0000111 1111111 1100000 0000000
C[8]: 0011111 1111111 0000000 0000000
C[9]: 0111111 1111110 0000000 0000000
C[10]: 1111111 1111000 0000000 0000001
C[11]: 1111111 1100000 0000000 0000111
C[12]: 1111111 0000000 0000000 0011111
C[13]: 1111100 0000000 0000000 1111111
C[14]: 1110000 0000000 0000011 1111111
C[15]: 1000000 0000000 0001111 1111111
C[16]: 0000000 0000000 0011111 1111111

子密钥生成过程中,右边生成的值:

D[0]: 0000000 0000000 0000000 0001111
D[1]: 0000000 0000000 0000000 0011110
D[2]: 0000000 0000000 0000000 0111100
D[3]: 0000000 0000000 0000001 1110000
D[4]: 0000000 0000000 0000111 1000000
D[5]: 0000000 0000000 0011110 0000000
D[6]: 0000000 0000000 1111000 0000000
D[7]: 0000000 0000011 1100000 0000000
D[8]: 0000000 0001111 0000000 0000000
D[9]: 0000000 0011110 0000000 0000000
D[10]: 0000000 1111000 0000000 0000000
D[11]: 0000011 1100000 0000000 0000000
D[12]: 0001111 0000000 0000000 0000000
D[13]: 0111100 0000000 0000000 0000000
D[14]: 1110000 0000000 0000000 0000001
D[15]: 1000000 0000000 0000000 0000111
D[16]: 0000000 0000000 0000000 0001111

3、56位的密钥进行压缩置换选择PC2得48位,至此得Ki,以此循环16次可以得到16组不同的子密钥。
DES明文分组长度为64位,密钥长度为56位,得到64位的输出。

16轮子密钥如下【48】:

子密钥K[0] 01010000 00101100 10101100 01000100 00000000 01000000 01010000
子密钥K[1] 01010000 10101100 10100100 01000000 10000000 01000000 11010000
子密钥K[2] 11010000 10101100 00100110 01000000 10000100 00001000 11100000
子密钥K[3] 11100000 10100110 00100110 00001000 00010100 00001000 11100000
子密钥K[4] 11100000 10010110 00100110 00001000 01010000 00100000 11100000
子密钥K[5] 11100000 10010010 01110010 00000000 01001000 00100000 10100100
子密钥K[6] 10100100 11010010 01110010 10000000 00001000 00010000 10100110
子密钥K[7] 10100110 01010011 01010010 10000001 00000010 00010000 00100110
子密钥K[8] 00100110 01010011 01010011 10000001 00000010 00000000 00101111
子密钥K[9] 00101111 01010001 01010001 00010000 00000010 00000100 00001111
子密钥K[10] 00001111 01000001 11011001 00010000 00000000 10000100 00011111
子密钥K[11] 00011111 01000001 10011001 00000000 00100000 10000001 00011111
子密钥K[12] 00011111 00001001 10001001 00100010 00100000 00000001 00011011
子密钥K[13] 00011011 00101000 10001101 00100010 00000001 00000010 00011001
子密钥K[14] 00011001 00101100 10001100 00000100 00000001 00000010 01010001
子密钥K[15] 01010001 00101100 10001100 00000100 00000001 01000000 00000000

DES算法的实现过程之F轮函数——(混淆、非线性、希望有较号的雪崩效应)
1、明文的32位的右半部分用扩展置换(E盒)扩展为48位【有16位的重复】。
扩展置换(E盒)

第[0]轮E盒扩展: 00000000 00010111 11111110 10000000 00000000 00000000
第[1]轮E盒扩展: 00001111 01010101 00000111 11100101 01101010 00001100
第[2]轮E盒扩展: 01011111 11000000 10101010 10111111 01101010 00000101
第[3]轮E盒扩展: 01111111 11000000 00000010 10100000 01111101 11111101
第[4]轮E盒扩展: 10100000 01101001 10100010 10101010 00000000 11111110
第[5]轮E盒扩展: 01011111 01101011 01010100 00101111 00101010 01010001
第[6]轮E盒扩展: 10111111 01101000 01011101 01001111 01010101 11111010
第[7]轮E盒扩展: 11001010 00000011 11111100 00011111 10010101 11110111
第[8]轮E盒扩展: 11100101 01101000 11110000 00010000 11000010 01011111
第[9]轮E盒扩展: 00111010 01010101 01011001 01000101 11010111 00000000
第[10]轮E盒扩展: 01110000 10000001 10101001 01100000 10010110 01011001
第[11]轮E盒扩展: 11011111 10101010 11110011 11011010 01101001 01010011
第[12]轮E盒扩展: 10101111 10010110 10100000 00110101 11111100 10101110
第[13]轮E盒扩展: 01110000 11101000 00000001 01111111 10010110 11111001
第[14]轮E盒扩展: 11001111 10101010 00000000 00110000 01101011 10101011
第[15]轮E盒扩展: 00001010 10000001 01011011 11101111 01010101 10101100

2、48位的输出与Ki异或,所得结果再与代替函数(S盒)作用产生32位的输出。
代替函数由8个S盒组成,每个S盒都有6位输入,4位输出。
在这里插入图片描述
在这里插入图片描述

第[0]次s盒的输入S盒: 010100 000011 101101 010010 110001 000000 000001 000000
第[1]次s盒的输入S盒: 010111 111111 100110 100011 101001 011110 101001 001100
第[2]次s盒的输入S盒: 100011 110110 110010 001100 111111 111110 111000 001101
第[3]次s盒的输入S盒: 100111 110110 011000 100100 101010 000110 100111 110101
第[4]次s盒的输入S盒: 010000 001111 111110 000100 101000 100101 000011 011110
第[5]次s盒的输入S盒: 101111 111111 100100 100110 001011 110110 001001 110001
第[6]次s盒的输入S盒: 000110 111011 101000 101111 110011 110101 110111 101010
第[7]次s盒的输入S盒: 011011 000101 000010 101110 100111 101001 011111 100111
第[8]次s盒的输入S盒: 110000 110011 101110 100011 100100 011100 000001 011111
第[9]次s盒的输入S盒: 000101 010000 010000 001000 010101 011101 010100 000100
第[10]次s盒的输入S盒: 011111 111100 000001 110000 011100 001001 011011 011101
第[11]次s盒的输入S盒: 110000 001110 101101 101010 110110 100100 100111 010010
第[12]次s盒的输入S盒: 101100 001001 111100 101001 000101 111101 110010 101111
第[13]次s盒的输入S盒: 011010 111100 000010 001100 010111 011001 011111 111011
第[14]次s盒的输入S盒: 110101 101000 011010 001100 001101 000110 101010 101001
第[15]次s盒的输入S盒: 010110 111010 110111 010111 111010 110101 010011 101100
第[0]次s盒的输出: 1100 0011 0011 1100 0011 0001 0011 1110
第[1]次s盒的输出: 0011 1010 0100 1001 1101 1111 0011 0100
第[2]次s盒的输出: 1001 0010 0000 1001 1010 0000 0110 0101
第[3]次s盒的输出: 0010 1111 1110 1010 0010 1000 1111 1101
第[4]次s盒的输出: 1111 0100 1000 1011 0101 1111 1000 1001
第[5]次s盒的输出: 1000 0010 1101 1111 1110 0111 1111 1001
第[6]次s盒的输出: 0111 1001 0001 0000 1111 0011 1001 1000
第[7]次s盒的输出: 1111 0110 0000 1111 0001 0101 1101 0010
第[8]次s盒的输出: 0101 0100 0000 1101 0111 1001 0110 0111
第[9]次s盒的输出: 0001 0101 1000 1000 1111 0001 1111 1100
第[10]次s盒的输出: 0111 1001 0100 0000 0111 1010 0100 1111
第[11]次s盒的输出: 0011 1110 0111 1110 1010 0010 0000 0111
第[12]次s盒的输出: 0010 0110 1011 1001 1101 1111 1000 1001
第[13]次s盒的输出: 1100 0110 0001 1001 0011 0110 0000 0111
第[14]次s盒的输出: 1011 1001 1001 1111 0001 1011 0001 1011
第[15]次s盒的输出: 0110 1101 1000 0010 0110 1100 1101 1101解

3、用置换函数P进行置换。
置换函数(P)

第0次P置换输出: 01101110 10000010 11110100 11100100
第1次P置换输出: 11110011 00101101 00100110 01101010
第2次P置换输出: 11000001 10010000 00001100 11100010
第3次P置换输出: 01011010 01011001 01001111 11110101
第4次P置换输出: 10111000 11100100 10101011 01011011
第5次P置换输出: 11001111 11110101 00111101 11001001
第6次P置换输出: 00101111 00101100 11100010 10000011
第7次P置换输出: 11100010 11010010 10110010 01011011
第8次P置换输出: 10110000 00010110 10111100 11110010
第9次P置换输出: 00101011 00010100 01100101 11110011
第10次P置换输出: 00111000 00111111 11001010 10100010
第11次P置换输出: 01000101 01101011 00011010 11110110
第12次P置换输出: 11111101 00100100 00101011 01011101
第13次P置换输出: 11100100 10100010 10001000 11111000
第14次P置换输出: 10111110 11101010 01111011 01000010
第15次P置换输出: 00011010 01011100 11001011 10111001
F[0]的输出结果: 01101110 10000010 11110100 11100100
F[1]的输出结果: 11110011 00101101 00100110 01101010
F[2]的输出结果: 11000001 10010000 00001100 11100010
F[3]的输出结果: 01011010 01011001 01001111 11110101
F[4]的输出结果: 10111000 11100100 10101011 01011011
F[5]的输出结果: 11001111 11110101 00111101 11001001
F[6]的输出结果: 00101111 00101100 11100010 10000011
F[7]的输出结果: 11100010 11010010 10110010 01011011
F[8]的输出结果: 10110000 00010110 10111100 11110010
F[9]的输出结果: 00101011 00010100 01100101 11110011
F[10]的输出结果: 00111000 00111111 11001010 10100010
F[11]的输出结果: 01000101 01101011 00011010 11110110
F[12]的输出结果: 11111101 00100100 00101011 01011101
F[13]的输出结果: 11100100 10100010 10001000 11111000
F[14]的输出结果: 10111110 11101010 01111011 01000010
F[15]的输出结果: 00011010 01011100 11001011 10111001

DES算法的实现过程之明文转密文
1、明文经过初始置换(IP)而被重新排列;
初始置换(IP)
初始置换后的明文序列:

 00000000 11111111 00000000 11111111 00000000 11111111 00000000 00000000

2、16轮的置换和替代,左半部分和右半部分互换产生预输出。

左[32]: 00000000 11111111 00000000 00000000
右[32]: 00011010 10100011 11001011 01000110
左[32]: 00011010 10100011 11001011 01000110
右[32]: 10111110 00010101 01111011 01000010
左[32]: 10111110 00010101 01111011 01000010
右[32]: 11111110 00000001 01000011 10111110
左[32]: 11111110 00000001 01000011 10111110
右[32]: 01000011 00110001 01010000 00011111
左[32]: 01000011 00110001 01010000 00011111
右[32]: 10111011 01101010 01011001 01001000
左[32]: 10111011 01101010 01011001 01001000
右[32]: 01111011 00001110 10011010 10111101
左[32]: 01111011 00001110 10011010 10111101
右[32]: 10010000 01111110 00111100 10111011
左[32]: 10010000 01111110 00111100 10111011
右[32]: 11001011 00011000 00100110 01001111
左[32]: 11001011 00011000 00100110 01001111
右[32]: 01110010 10101100 10001110 11100000
左[32]: 01110010 10101100 10001110 11100000
右[32]: 11100100 00110100 11000100 11001100
左[32]: 11100100 00110100 11000100 11001100
右[32]: 10111101 01011001 10110011 00101001
左[32]: 10111101 01011001 10110011 00101001
右[32]: 01011100 11010000 01101111 10010111
左[32]: 01011100 11010000 01101111 10010111
右[32]: 11100111 00000000 11111100 11011100
左[32]: 11100111 00000000 11111100 11011100
右[32]: 10011101 01000000 01100011 01110101
左[32]: 10011101 01000000 01100011 01110101
右[32]: 00010100 00101101 11011010 10110110
左[32]: 00010100 00101101 11011010 10110110
右[32]: 11110011 11000010 10010111 10010001

3、16轮迭代后的预输出与互逆置换IP-1产生64位的密文。
逆初始置换后的明文序列:

01100101 01011110 10100110 00101000 11001111 01100010 01011000 01011111
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值