前言
个人学习整理笔记,希望能对后来者有所帮助。
提示:以下是本篇文章正文内容,下面案例可供参考
一、一次一密(One-time password)
一个序列密码称为一次一密必须满足以下条件:
- 通过真随机数生成器得到密钥序列s0,s1,s2,…
- 只有合法的通信方才知道密钥序列;
- 每个密钥序列位si仅适用一次。这意味着每个明文位都需要一个密钥位,因此,一次一密的密钥长度必须和明文长度一样。
一次一密是无条件安全的。
实例:假设发送方要发送“short"这个单词给接收方。
发送方:
-
使用ASCII编码来转换 “short”这个词,转换后会得到下面这一串二进制信息:
0111001101101000011011110111001001110100 -
接下来你需要一个和上面二进制串长度完全一致的密钥,如:
0110010101101010001110010010011101100100 -
我们将这两组字符串进行XOR 运算,得到:
0001011000000010010101100101010100010000
发送方将这串数据发送给接收方
接收方:
接收方得到数据后将其与密钥进行XOR运算,得到发送方的数据,再利用ascii编码即可得到正确的信息。
二、DES算法
DES(Data Encryption Standard,数据加密标准)是一种使用56位密钥对64位长分组进行加密的密码。它是一种对称密码,即加密过程和解密过程使用相同的密钥。DES对明文中的每个分组的加密过程都包含16轮,且每轮操作完全相同,每轮采用的子密钥不同,并且所有子密钥ki都是从主密钥k中推到出来的。
DES加密
-
初始置换( I P IP IP)
对给定的64位明文,通过置换 IP 表重新排列,然后分成左右两个部分 L 0 L_0 L0 和 R 0 R_0 R0 ,每部分32位:
-
16轮Feistel结构迭代
L i = R i − 1 L_i=R_{i-1} Li=Ri−1 R i = L i − 1 ⊕ F ( R i − 1 , K i ) , i = 1 , . . . , 16 R_i=L_{i-1}\oplus F(R_{i-1},K_i),i=1,...,16 Ri=Li−1⊕F(Ri−1,Ki),i=1,...,16
每一轮迭代过程:
-
扩充置换表(E):将32位的输入扩展为48位
-
将得到的48位与轮密钥 K i K_i Ki 进行 ⊕ \oplus ⊕ 操作,然后将8个6位长的分组送入到8个S盒中进行非线性变换,得到8个4位的输出
(S-盒可以将6位的输入映射为4位的输出,按照6位中首尾两位组成的二进制位行,中间四位组成的二进制位列,从S盒中进行查询,得到4位输出)例:100101,首尾两位为11,则表示数字3,则第4行,中间四位0010,则表示数字2,则为第3列(行列均从0开始计数)
-
将32位的输出进行P置换
得到的32位输出为下一轮的 R i + 1 R_{i+1} Ri+1
-
-
末尾置换( I P − 1 IP^{-1} IP−1)
对 L 16 L_{16} L16 和 R 16 R_{16} R16 利用 I P − 1 IP^{-1} IP−1 做逆置换,得到密文 y y y.
DES子密钥产生流程
-
置换选择1
64位的密钥为8个字节,每个字节的前7位是真正的密钥位,第8位为奇偶校验位,因此DES真正密钥位56位。
置换选择1的作用:从64位中去除8个奇偶校验位;剩余56位打乱重排,且将前28位作为 C 0 C_0 C0,后28位作为 D 0 D_0 D0。下图显示了 C 0 , D 0 C_0,D_0 C0,D0 分别为原来密钥的第几位。 -
循环左移
-
置换选择2
将 C i C_i Ci 和 D i D_i Di 合并为一个56位的中间数据,置换选择2从中选择一个48位的子密钥 K i K_i Ki
DES解密
由于DES的运算时对合运算,所以加密和解密可用同一个运算,只是子密钥使用顺序不同。
把64位密文当做明文输入,而且第一次解密迭代使用子密钥
K
16
K_{16}
K16,第二次解密迭代使用子密钥
K
15
K_{15}
K15,…,第十六次解密迭代使用子密钥
K
1
K_1
K1,最后输出的就是64位明文。
解密过程可用如下数学公式表示:
总结
本文主要介绍了一次一密的概念和DES算法。