安卓逆向学习之DES加密算法
DES 算法简介
DES(Data Encryption Standard)是目前最为流行的加密算法之一。DES 是对称的,也就是说它使用同一个密钥来加密和解密数据。
DES 还是一种分组加密算法,该算法每次处理固定长度的数据段,称之为分组。DES 分组的大小是 64 位,如果加密的数据长度不是 64 位的倍数,可以按照某种具体的规则来填充位。
从本质上来说,DES 的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混乱和扩散”的原则。混乱的目的是为隐藏任何明文同密文、或者密钥之间的关系,而扩散的目的是使明文中的有效位和密钥一起组成尽可能多的密文。两者结合到一起就使得安全性变得相对较高。
DES 算法具体通过对明文进行一系列的排列和替换操作来将其加密。过程的关键就是从给定的初始密钥中得到 16 个子密钥的函数。要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复 16 次。每一次迭代称之为一轮。要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。
DES 算法框架
以下是 DES 的算法框架
从这个图中我们可以看到
明文传入 IP 进行置换 进行 16 次迭代 将 R16 与 L16 拼接 IP 逆置换 生成密文
- 从 64-bit 的主钥匙里面选取特定的 56 位,其余的位就没用了。于是我们现在手上有了一个 56 位的布尔数组。把它分成左、右两个半密钥,它们都是 28-bit 的布尔数组。
- 左、右两个半密钥都左旋(也就是循环左移。整个数组往左移,左边弹出去了的东西补到最右边去)一定位数,这个左移的位数也是指定的。有些轮次是 1 位,有些轮次是 2 位。
- 把左、右半密钥拼起来,再做一个置换,就得到了这一轮生成的子密钥。这个置换是从 56-bit 的数组里面选取指定的 48 位。所以现在每一轮都可以生成一个 48 位的子密钥。(注意,步骤 3 并不改变左右半密钥)。
- 重复 步骤 2、步骤 3 一共 16 次,于是得到了 16 个 48-bit 的子密钥。