扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共9页)
不使用 Feistel 结构!
在大多数加密算法中,轮回变换都使用著名的 Feistel 结构。在这个结构中,中间 State 的位部分通常不做更改调换到另一个位置。(这种
线性结构的示例是我们在 DES 部分中讨论的那些表,即使用固定表的形式交换位。)Rijndael 的轮回变换不使用这个古老的 Feistel 结构。
轮回变换由三个不同的可逆一致变换组成,叫做层。(“一致”在这里表示以类似方法处理 State 中的位。)
线性混合层保证了在多个轮回后的高度扩散。非线性层使用 S 盒的并行应用,该应用程序有期望的(因此是最佳的)最差非线性特性。S 盒是
非线性的。依我看来,这就 DES 和 Rijndael 之间的密钥概念差异。密钥加法层是对中间 State 的轮回密钥 (Round Key) 的简单 EXOR,如
以下所注。
Rijndael算法
加密算法
Rijndael算法是一个由可变数据块长和可变密钥长的迭代分组加密算法,数据块长和密钥长可分别为128,192或256比特。
数据块要经过多次数据变换操作,每一次变换操作产生一个中间结果,这个中间结果叫做状态。状态可表示为二维字节数组,它有4行,Nb列,
且Nb等于数据块长除32。如表2-3所示。
a0,0
a0,1
a0,2
a0,3
a0,4
a0,5
a1,0
a1,1
a1,2
a1,3
a1,4
a1,5
a2,0
a2,1
a2,2
a2,3
a2,4
a2,5
a3,0
a3,1
a3,2
a3,3
a3,4
a3,5
数据块按a0,0 , a1,0 , a2,0 , a3,0 , a0,1 , a1,1 , a2,1 , a3,1 , a0,2…的顺序映射为状态中的字节。在加密操作结束时,密文按
同样的顺序从状态中抽取。
密钥也可类似地表示为二维字节数组,它有4行,Nk列,且Nk等于密钥块长除32。算法变换的圈数Nr由Nb和Nk共同决定,具体值列在表2-4
中。
表3-2 Nb和Nk决定的Nr的值
Nr
Nb = 4
Nb = 6
Nb = 8
Nk = 4
10
12
14
Nk = 6
12
12
14
Nk = 8
14
14
14
3.2.1圈变换
加密算法的圈变换由4个不同的变换组成,定义成:
Round(State,RoundKey){ByteSub(State);ShiftRow(State);MixColumn(State);AddRoundKey(State,RoundKey); (EXORing a Round Key to
the State)}
加密算法的最后一圈变换与上面的略有不同,定义如下:
FinalRound(State,RoundKey){ByteSub(State);ShiftRow(State);AddRoundKey(State,RoundKey);}
ByteSub变换
ByteSub变换是作用在状态中每个字节上的一种非线形字节变换。这个S盒子是可逆的且由以下两部分组成:
把字节的值用它的乘法逆替代,其中‘00’的逆就是它自己。
经(1)处理后的字节值进行如下定义的仿射变换:
y0 1 1 1 1 1 0 0 0 x0 0
y1 0 1 1 1 1 1 0 0 x1 1
y2 0 0 1 1 1 1 1 0 x2 1
y3 0 0 0 1 1 1 1 1 x3 0
y4 = 1 0 0 0 1 1 1 1 x4 + 0
y5 1 1 0 0 0 1 1 1 x5 0
y6 1 1 1 0 0 0 1 1 x6 1
y7 1 1 1 1 0 0 0 1 x7 1
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。