需要注意的地方是, 如果初始秘钥转换成 byte之后, 如果其前7位是相同的, 那么这两个秘钥所计算出来的数据就是相同的。 因为 8 16 等等 是不参与DES运算的。
参考链接:JAVA DES 秘钥问题
将初始秘钥 通过16轮的计算,转换, 生成16个子秘钥(子秘钥长度为48位)。
而后将明文数据:
首先按照固定的置换规则, 将原数据中的64bit 进行置换。 得到新的数据。
其中置换后的数据被分为两部分, L0、R0, L0是输出的左32位,R0是右32位
按照一定的规则 迭代置换 运用之前计算得到的 秘钥 加密, 16轮之后, 即得到所需的L16, R16。将两部分合并成一个分组,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
其初始置换数据:
58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6, 64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7,逆置换:
在初始置换规则表中, 观察会发现, 原本第一位的被挪到了第40位, 而在逆置换中, 需要将第四十位置换到第一位即可。
40,8,48,16,56,24,64,32, 39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58 26, 33,1,41, 9,49,17,57,25,正如上面所提到的:核心就是 置换,混合。 解密则是其逆过程。
3DES3DES(即Triple DES)是DES向AES过渡的加密算法,它使用2条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
即用 k1对数据加密 k2对加密过的数据解密 k3 对解密之后的数据再度加密.
K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。
不难发现 如果 k1=k2 的话, 与 DES算法是等价的, 这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。
AES运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。
对内存的需求非常低,适合于受限环境。
Rijndael 是一个分组迭代密码, 分组长度和密钥长度设计灵活。
AES标准支持可变分组长度,分组长度可设定为32 比特的任意倍数,最小值为128 比特,最大值为256 比特。
AES的密钥长度比DES大, 它也可设定为32 比特的任意倍数,最小值为12 比特,最大值为256 比特,所以用穷举法是不可能破解的。
AES算法的设计策略是WTS。WTS 是针对差分分析和线性分析提出的,可对抗差分密码分析和线性密码分析。
而AES的优点, 正是 DES的缺点所在。
AES的具体实现,就不再这里提到了, 感兴趣的可以看参考链接。 在本篇中, 更关注 其核心思想是什么, 适用范围在何处,局限性又有哪些。
而 DES 3DES AES 其核心都是 分组, 置换, 加密混淆, 迭代。 这样一套处理体系。
用密码生成函数 替换了 原本固定的密码表。
AES参考: 密码算法详解——AES
密码块链接需要注意到的是, 即使我们已经拥有了很强大的对称加密算法,但这就能够保证不被破解了吗?
假设我们认为暴力破解是不可行的, 那么在已知部分明文的情况下, 破解出密码并不是不可能的事情, 因为在加密算法中, 我们对于同一数据的加密结果总是相同的。而在 http传输中, HTTP/1.1 这必然是一个很常见的明文输入,我们匹配了所有的输入, 发现出现次数最多的 就可以代表其实 HTTP/1.1
考虑这样一种情况, 在两个人的通讯过程中,其中一个人的惯用词汇是 你猜, 几乎在100句聊天中, 就会出现80句以上的你猜。
那么我们只要抓取到 出现次数最多的密文, 必然就可以认定, 这个密文所对应的明文是 你猜。这样就能够大大减小我们破解密码的难度。
那么自然的, 就要求存在这样的方式, 使得对于相同的输入, 其加密后的密文 是不相同的。 即使小明说了一百句你猜。 对于其表现形式来说,其密文都是不同的。
因此,根本无法从杂乱无章的密文中, 判断出来究竟哪一句对应的明文是 小明的口头禅, 你猜。
这怎么实现呢?无非是在每次传输都附带一串数据,仅用于本数据的加密。 这依赖的是 异或 运算。
CBCCBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。
明文: Mi, 密文 Ci, 加密算法: Ks, 随机的k 比特数: Ri, 异或运算的结果: Ti 异或运算: a⊕b
首先需要知道的是: 对于异或运算:
a ⊕ a = 0
a ⊕ b = b ⊕ a
a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c
a ⊕ b ⊕ a = b
对于密文: Ci = Ks(Mi ⊕ Ri), 即将Mi 与 Ri执行异或运算, 通过Ks加密算法对其进行加密, 最终得到密文 Ci。
对于解密: 根据第四条运算法则: d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c
解密后的数据: Ti = Mi ⊕ Ri 则有 Mi = Ti ⊕ Ri, 即对密文进行解密 与 Ri做异或运算, 即可得到初始明文 Mi。