分组密码与流密码
SPN 代换-置换网络
异或操作在两个相同长度的二进制位串之间逐位进行。对于单个位来说:
- 如果两个位相同,结果为
0; - 如果两个位不同,结果为
1。
| z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| πS(z) | E | 4 | D | 1 | 2 | F | B | 8 | 3 | A | 6 | C | 5 | 9 | 0 | 7 |
再令 πP定义如下:
| z | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| πP(z) | 1 | 5 | 9 | 13 | 2 | 6 | 10 | 14 | 3 | 7 | 11 | 15 | 4 | 8 | 12 | 16 |
DES
DES 参数与初始置换
原文翻译:
DES 的 f 函数
原文翻译:
对DES的理解(BV1KQ4y127AT)
DES(Data Encryption Standard)属于对称密码算法中的分组加密算法,分组加密它和流密码加密算法是相对应的。那顾名思义,流密码是指逐字节进行加密,也就是一个字节,一个字节进行加密。
而分组加密算法呢,它也叫快加密。它是将明文分成固定的一个字节块,然后对每个字节块分别进行加密,最后拼接在一起得到一个密文的过程。
DES加密算法就是将明文分为许多个64位的字节块 然后密钥是56比特的密钥,但其实它的这个种子密钥是64比特, 因为其中有八位是作为检验位不参与运算的。因此参与运算的只有56比特。
它的加密过程如图所示,主要是分为三步吧:
第一步是进行初始的ip置换,然后进行16轮的迭代的加密过程 最后进行最终的一个逆置换。初始置换和逆置换的原理是相同的,只是它使用的表不同。
比较复杂的过程就在于这个16轮的迭代,我们是将64比特的明文的数据分成了两部分l0 和r0 ,它就是单纯的左右两部分。 然后每部分都是32比特。 r0 是直接赋给了l1,而r1呢他则是需要将r0 和k1进行轮函数的运算之后 再和l0 异或 然后才能得到这个r1的值。之后每轮都是如此,以此类推 ——然后再进行一个逆置换,最后得到了这个64比特的一个密文。
这个密钥的生成呢,它其实是有k1到k16,16个子密钥参与这16轮的迭代运算。这个密钥的生成过程我们在最后一部分讲 。然后我们先看轮函数这边吧 ,因为我们刚才讲了r0 和l0 它都是32比特嘛,而我们的k1到k16都是48比特,我们刚才有说,虽然他参与有效运算的是56比特,但如何到这个48比特 我们之后在密钥生成的过程中再讲。我们现在只需要知道k1到k16,它都是16个48比特的子密钥 。
r0本身是32比特,那如何和这个48比特的这个密钥进行一个运算 那就是在这个轮函数中 我们首先还是需要将r0 经过一个E扩展,将它32比特的数据变成48比特 然后48比特的数据再和48比特的这个子密钥k1 ,进行一个异或,这个结果呢再通过s盒进行压缩,将这48比特的数据再变为32比特的数据,这32比特的数据在经过一个P置换,这时候他还是32比特,它的数据位没有变。这个输出的结果就是这个轮函数的输出结果。他在和l0异或它就变成了r1
IP置换(初始置换)
Inital Permutation 这是初始置换和最终置换的逆置换的表,它们两个的原理相通 比如说我们看初始置换 他第一个数字是58 它就是表示将原始数据中的第58位数据换到现在的第一位 就是这样一个打乱的过程 这个50就是代表将原始数据第50位的数据放在现在的第二位 如右图所示
轮函数——e扩展置换
刚才没有说,他是为了将32位的输入变成48位的输出嘛. 那这个扩展呢 我们可以直接按照这个表来进行扩展 原理和那个置换的表其实是一样的 我们可以看一下这个图啊
我们这个扩展之后 我们不是说是生成了48比特嘛 然后就和我们的那个密钥进行一个异或.异或之后的结果 我们要再经过一个s盒的一个压缩的处理
轮函数——S盒压缩处理
首先是将48比特分成了八块六比特的数据 然后我们这个是需要根据一个八个六进四出的s盒进行压缩
p盒置换
和那个初始置换是一样的
逆置换我们就不讲了 就和我们的初始置换一样