密码学基础学习总结-07

 

密码学基础学习总结-07感觉AES快说完了,接下来说一下密钥的问题:前面说的Key的问题这里先说Rijndael密钥生成方案。wiki有言:AES(Rijndael)使用一个密钥生成方案把一个短密钥扩展成各轮用于加密的子密钥。该方案的名称就叫做Rijndael密钥生成方案(Rijndael key schedule)。对于不同位数的原始密钥(128, 192, 256),加密的轮次是不相同的...

密码学基础学习总结-07

感觉AES快说完了,接下来说一下密钥的问题:

前面说的Key的问题

这里先说Rijndael密钥生成方案。

wiki有言:

AES(Rijndael)使用一个密钥生成方案把一个短密钥扩展成各轮用于加密的子密钥。该方案的名称就叫做Rijndael密钥生成方案(Rijndael key schedule)。对于不同位数的原始密钥(128, 192, 256),加密的轮次是不相同的,但每一轮都需要与128位的密钥异或,而根据原始密钥生成各轮子密钥的过程就是由Rijndael密钥生成方案完成的。

RotWord

rotword

after rotword

注意两幅图的区别,在这里09下来了,这样就完成了这个操作。

替换

这里又用到了S盒,如下图:

subbyte

这里又使用来S盒来进行替换

求2的幂次操作(Rcon)

wiki有言:

Rcon在Rijndael的参考文档里称为求2的幂次。需要注意的是这个操作不是作用在常规的整数域中的,它是作用在Rijndael有限域中的。2的多项式形式为

,计算的公式为:

或者等价于:

Rcon

after rcon

灰色就是rcon之后的部分,这样就完成了这个生成过程。

这样就介绍完了这个动画中的这个部分,对密钥的处理。

分组密码的工作方式

我们在平时看到的加密算法的时候,还会发现这个名字不只是AES,比如说AES-256-CFB,AES-256-CTR,等等等等,后面的CFB,CTR等等就是分组密码的工作方式,下面就来介绍这些工作方式。

其实还是为了解决一个问题,按照一开始的分组密码的模式,将会有一个密钥长度和明文长度相同,这样是很有问题的,而且我们要记住,还要引入随机数啊,难道又要加长?所以就要引入工作模式来解决这个问题:

初始化向量(IV)

初始化向量就是随机数,保证了同样的明文被多次加密也会产生不同的密文,这是非常重要的。

填充

流密码有个优点,就是能够生成一个和明文长度完全相同的密文,但是分组密码就不一样了,这样的话就需要有填充的规范来保证分组加密可以正常工作。

常用模式

ECB 电子密码本模式 (其实不常用,因为不安全)

ECB

ECB decryption

这里用一下wiki的图,这种方式非常简单,但是很危险,因为相同的明文块会被加密成相同的密文块,这样是很不安全的,我还没见过用这种模式的安全应用,wiki上还是给了一个很好的例子,这里也用一下:

ECB is unsafe

对了,其实还是有人用这种模式的,有一片论文分析了一个还蛮常见的浏览器,论文链接,具体是谁自己去看看,手动滑稽,不知道现在他们浏览器修改这个毛病没有。

CBC 密码块链接模式

CBC enc

cbc dec

这种模式图中描述的非常好,需要一个IV,之后每轮都是上一轮的密文当作下一轮IV之后进行加密,解密就是反过来,下面给出一个简单的公式:

  • 加密:$C_i = Enc_k(p_i \oplus C_{i-1});C_0 = IV$
  • 解密:$P_{i} = Dec_{k}(C_i)\oplus C_{i-1};C_{0} = IV$

我们可以发现,CBC模式可以实现串行加密,可以并行解密。只能串行加密是个缺点,同时仔细看看图,你会发现加密的时候用的是加密函数,解密的时候图中明确的写了是解密函数,这表示我们的加密算法是要可逆的,不能复用一套加密函数,这也是个问题。

CFB 密文反馈模式

CFB ENC

CFB DEC

CFB和CBC实际上还蛮相似的,图中描写的很详细,下面还是给出一个公式来描述加密和解密流程:

  • 加密:$C_i=Enc_{k}(C_{i-1}) \oplus P_{1};C_0 = IV$
  • 解密:$P_i = Enc_{k}(C_{i-1})\oplus C_{i};C_0 = IV$

这次,还是可以串行加密,可以并行解密,这次就可以复用一套算法了,CFB模式还是很常用的模式。

OFB 输出反馈模式

Ofb ENC

Ofb Dec

这个加密解密还挺特殊的,下面给个公式:

每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。(完了开始照搬wiki😂,求轻喷)

CTR 计数器模式

个人认为最快的模式,但是总感觉有点奇怪的感觉,因为感觉设计的就很简单的样子,还是上图:

CTR Enc

CTR DEC

对,就跟名字说的一样就是计数器,Counter每次加一,注意图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。

这样的设计真的感觉很简单,而且计数器这个数字就是计数一个一个出来了的,攻击者也知道,这让有些人类似我总觉得不安全,但是现在还没发现什么问题。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。感觉应该是最快的。

这样常见的工作模式就完成了,这样整个AES从这种角度也算懂了怎么工作的,但是具体感觉实际上是不理解为什么要这样设计的,我相信背后都是有深邃的数学思想在里面的,不是拍脑袋强行定义的。