Rijn dael 加密算法的介绍 作者:林祝兴 叶义雄 杨国鸿 本文针对Rijndael 加密算法的数学理论背景,算法的架构,回合的转换,金钥的产生,以及各种攻击破密法等等,做了一些简单的介绍。 一、简介 在 AES ( Advanced Encryption Standard ) 的选拔中,从最初的十五个算法,到十个、五个,逐步筛选出适合用来作为下一代加密算法的标准。Rijndael 在经过了一番时日的考验之后,也一直名列前矛。直至十月二日,Rijndael 才脱颖而出,这篇文章便是针对Rijndael 作简要的介绍。 Rijndael 是一个反复运算的加密算法,它允许可变动的数据区块及金钥的长度。数据区块与金钥长度的变动是各自独立的。 在 Rijndael 算法中定义了几个名词,分述如下: State:在运算过程中所产生的中间值,是一个 4× Nb 的矩阵,Nb 可由数据长度除以32 位求得,也就是把数据分割成 Nb 个区块。 Cipher Key:用来做加密运算的金钥,形式是一个 4× Nk 的矩阵,Nk 可由金钥长度除以32位求得,也就是把金钥分割成 Nk 个 32 位的子金钥。 在 Rijndael 算法中,运算的回合数(Nr)是由 Nb 及Nk 所决定的,回合数的变动定义如下表。 Nr Nb=4 Nb=6 Nb=8 Nk=4 10 12 14 Nk=6 12 12 14 Nk=8 14 14 14 二、Rijn dael 的数学背景 在 Rijndael 中使用了许多字节层级的运算,而这些运算是以GF(28)为基础架构。也有一些采用了4-byte 的字组运算。在这部分,我们将介绍这些基本的数学原理。 (1) GF(28)的定义 假设一个字节b 由b7b6b5b4b3b2b1b0 组成,我们可以把这些bi 想象成一个7 次多项式的系数,而这些系数不是0 就是1: b7 x7+ b6 x6+ b5 x5+ b4 x4+ b3 x3+ b2 x2+ b1 x + b0, 例如,(57)16 的二进制表示法为(0101,0111)2 表示成多项式,则为: x6+ x4+ x2+ x + 1 . (2) 加法 两个多项式的加法,则是定义为相同指数项的系数和再模余2,简单的说就是作EXOR 运算(i.e., 1+1=0)。例如: (57)16+(83)16=(01010111)2+(10000011)2 = (11010100)2 = (D4)16 或是(x6+x4+x2+x+1) + (x7+x+1) = x7+x6+x4+x2 (3) 乘法 在乘法里面,多项式相乘之后的结果很容易造成溢位的问题,解决溢位的方式是把相乘的结果,再模余一个不可分解的多项式m(x)。在 Rijndael 中,定义一个这样子的多项式为 m(x)=x8+x4+x3+x+1 或是(11B)16 例如: (57)16‧(83)16 = ( x6+ x4+ x...