AES算法(6300字)

来源:m.fanwen118.com时间:2021.5.2

高级加密标准(AES)

AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。

AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换。下面是要加密的128位值以及它们对应的索引数组:

00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

192位密钥的值是:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17

0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23

当 AES 的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的密钥调度表。

w[] 最初的 Nk (6) 行被作为种子,用原始密钥值(0x00 到0x17)。剩余行从种子密钥来产生。变量 Nk 代表以 32 位字为单位的种子密钥长度。关键是现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)。

AES 加密例程开始是拷贝 16 字节的输入数组到一个名为 State (态)的 4×4 字节矩阵中。AES 加密算法 取名为 Cipher,它操作 State[]。

在规范中,加密算法实现的一个预备的处理步骤被称为 AddRoundKey(轮密钥加)。AddRoundKey 用密钥调度表中的前四行对 State 矩阵实行一个字节一个字节的异或(XOR)操作,并用轮密钥表 w[c,r] 异或 输入 State[r,c]。 举个例子,如果 State 矩阵的第一行保存的字节是{ 00, 44, 88, cc },第 一列密钥调度表是{ 00, 04, 08, 0c },那么新的 State[0,2] 值是用

w[2,0]( 0x08 或 0x80 )异或 State[0,2](0x88)的结果:

1 0 0 0 1 0 0 0

0 0 0 0 1 0 0 0 XOR

1 0 0 0 0 0 0 0

AES 算法的主循环对 State 矩阵执行四个不同的操作,在规范中被称为

SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和 AddRoundKey。除了每次循环 AddRoundKey 都被调用并使用密钥调度表的下面四行外,AddRoundKey 与预备处理步骤中的 AddRoundKey 相同。

SubBytes 例程是一个代替操作,它将 State 矩阵中的每个字节替换成一个由 Sbox 决定的新字节。比如,如果 State[0,1]的值是 0x40 如果你想找到它的代替者,你取 State[0,1] 的值 (0x40) 并让 x 等于左边的数字(4)并让 y 等于右边的数字(0)。然后你用 x 和 y 作为索引 进到 Sbox 表中寻找代替值。 ShiftRows 是一个置换操作,它将 State 矩阵中的字节向左旋转。Figure 6 示范了 ShiftRows 如何操作 State[]。State 的第0行被向左旋转0个位置,State 的第1行被向左旋转1个位置,State 的第2行被向左旋转2个位置,而 State 的第3行被向左旋转3个 位置。

MixColumns 是一个代替操作,它是理解 AES 算法时最具技巧(或者说是最需要动脑筋的部分)的部分。它用 State 字节列的值进行数学域加和域乘的结果代替每个字节。

假设 State[0,1] 的值是0x09,并且列1上的其它值分别为 0x60,0xe1 和 0x04,那么State[0,1]的新值计算如下:

State[0,1] = (State[0,1] * 0x01) + (State[1,1] * 0x02) +(State[2,1] * 0x03) +(State[3,1] * 0x01)

= (0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) +(0x04 * 0x01) = 0x57

此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。

SubBytes、ShiftRows、MixColumns 和 AddRoundKey 四个操作在一个执行 Nr 次的循环里被调用,Nr 为给定密钥大小的轮数减 1。加密算法使用的轮数要么是10,12,要么是14,这依赖于种子密钥长度是128位、192 位还是 256 位。在这个例子中,因为 Nr 等于12, 则这四个操作被调用11次。该迭代完成后,在拷贝 State 矩阵到输出参数前,加密算法调用 SubBytes、ShiftRows 和 AddRoundKey 后结束。

大致说来,AES 加密算法的核心有四个操作。AddRoundKey 使用从种子密钥值中生成的轮密钥代替 4 组字节。SubBytes 替换用一个代替表 替换单个字 节。ShiftRows 通过旋转 4字节行 的 4 组字节进行序列置换。MixColumns 用域加和域乘的组合来替换字节。

AES 加密算法使用相当简单明了的技术来代替和置换,除 MixColumns 例程以外。MixColumns 使用特殊的加法和乘法。AES 所用的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES 基于有限域GF(28)。

GF(28)由一组从 0x00 到 0xff 的256个值组成,加上加法和乘法,因此是(28)。GF代表伽罗瓦域。GF(28) 的一个特性是一个加法或乘法的操作的结果必须是在{0x00 ... 0xff}这组数中。虽然域论是相当深奥的,但GF(28)加法的最终结果却很简单。GF(28) 加法就是异或(XOR)操作。

AES的加密和解密例程需要知道怎样只用七个常量 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e 来相乘。

在GF(28)中用0x01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样—任何值乘0x01等于其自身。

用0x02做乘法。被乘的值小于0x80,这时乘法的结果就是该值左移1比特位。如果被乘的值大于或等于0x80,这时乘法的结果就是左移1比特位再用值0x1b异或。它防止了“域溢出”并保持乘法的乘积在范围以内。

一旦在GF(28)中用0x02建立了加法和乘法,你就可以用任何常量去定义乘法。用0x03做乘法时,可以将 0x03 分解为2的幂之和。为了用 0x03 乘以任意字节b, 因为 0x03 = 0x02 + 0x01,因此:

b * 0x03 = b * (0x02 + 0x01)

= (b * 0x02) + (b * 0x01)

用0x0d去乘以任意字节b:

b * 0x0d = b * (0x08 + 0x04 + 0x01)

= (b * 0x08) + (b * 0x04) + (b * 0x01)

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x01)

在加解密算法中,AES MixColumns 例程的其它乘法遵循大体相同的模式,如下所示:

b * 0x09 = b * (0x08 + 0x01)

= (b * 0x02 * 0x02 * 0x02) + (b * 0x01)

b * 0x0b = b * (0x08 + 0x02 + 0x01)

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02) + (b * 0x01) b * 0x0e = b * (0x08 + 0x04 + 0x02)

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x02)

总之,在GF(28)中,加法是异或操作。其乘法将分解成加法和用0x02做的乘法,而用0x02做的乘法是一个有条件的左移1比特位。AES规范中包括大量 有关GF(28)操作的附加信息。

AES加密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表。AES规范中称之为密钥扩展例程(KeyExpansion)。从本质上讲,从一个原始密钥中生成多重密钥以代替使用单个密钥大大增加了比特位的扩散。虽然不是无法抵御的困难,但理解 KeyExpansion 仍是 AES 算法中的一个难点。

KeyExpansion 例程高级伪代码如下所示:

KeyExpansion(byte[] key, byte[][4] w)

{

copy the seed key into the first rows of w

for each remaining row of w

{

use two of the previous rows to create a new row

}

}

“用前面两行来产生一个新行”(“use two of the previous rows to create a new row”)的例程用到了两个子 例程,RotWord 和 SubWord 以及一个名为“Rcon”的常数表(作为“轮常数”)。

RotWord 例程很简单。它接受一个4个字节的数组并将它们向左旋转一个位置。因为轮调度表 w[] 有四列,RotWord 将 w[]的1行左旋。注意 KeyExpansion 使用的这个 RotWord 函数与加密算法使用的 ShiftRows (行位移变换)例程非常相似,只是它 处理的是单行密钥调度 w[],而不是整个加密状态表 State[]。

SubWord 例程使用替换表 Sbox 对一给定的一行密钥调度表 w[] 进行逐字节替换。KeyExpansion 操作中的替换实际上就像在加密算法中的 替换一样。被代替的输入字节被分成 (x,y) 对,它被当作进入替换表 Sbox 的索引。举例来说,0x27的代替结果是 x=2 和 y=7,并且 Sbox[2,7] 返回 0xcc。

KeyExpansion 例程使用一个被称为轮常数表的数组 Rcon[]。这些常数都是4个字节,每一个与密钥调度表的某一行相匹配。AES 的 KeyExpansion 例程需要11个轮常数。你可以在 Figure 7 中看到这些常数清单。

每个轮常数的最左边的字节是GF(28)域中2的幂次方。它的另一个表示方 法是其每个值是前一个值乘上0x02,正如前一部分讨论 GF(28) 乘法 时所描述的那样。注意 0x80 × 0x02 = 0x1b 是 0x80 左移1个比特位后紧接着与 0x1b 进行异或,如前所述。

现在让我们更进一步看看 KeyExpansion 内幕中的循环。这里所用的伪码比以前更为详细,这个循环是:

for (row = Nk; row < (4 * Nr+1); ++row)

{

temp = w[row-1]

if (row % Nk == 0)

temp = SubWord(RotWord(temp)) xor Rcon[row/Nk]

else if (Nk == 8 and row % Nk == 4)

temp = SubWord(temp)

w[row] = w[row-Nk] xor temp

}

先不要去看if子句,你将看到密钥调度表 w[] 的每一行都是前面一行与行 Nk 异或的结果(4, 6, 或 8 取决于密钥的长度)。if条件的第一部分用 SubWord、RotWord 以及与轮常数的异或修改密钥调度表的每个第4、第6或第8行,取决于是否密钥的长度是128、192或256位。这个条件的第二部分将修改行 12、20 和 28 等等——对于256位密钥而言——每 一个第8行都将添加密钥调度额外的可变性。

让我们用本文开头所举的例子来考察 KeyExpansion 是如何开始的。种子密钥是192-bit / 6-word 值:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17

密钥调度字节表 w[] 的维数是 4 列并且 Nb × (Nr + 1) 等于 4 × (12 +

1),或 52 行。KeyExpansion 将种子密钥的值拷贝到密钥调度字节表 w[] 的第一行。因为我的种子密钥是 192 位(24字节),并且 w[] 表总是 4 列,在这种情况下KeyExapansion 将种子密钥拷贝到 w[] 的前面 6 行。现在让我们看看 KeyExapansion 例程是如何填充密钥调度表其余部分的。在我的例子里,第一个被计算的行是第 6 行 ,因为第0-5行已被种子密钥的值填上了: temp = w[row-1] = 14 15 16 17

条件 (row % Nk == 0)为真,因此首先 RotWord 子程序被应用:

temp = 15 16 17 14

这时 SubWord 被应用:

temp = 59 47 f0 fa

用 Rcon[row / Nk] = Rcon[6 / 6] = 01 00 00 00 进行异或:

temp = 58 47 f0 fa

这时用 w[row-Nk] = w[6-6] = 00 01 02 03 异或,产生了下面结果: w[6] = 58 46 f2 f9

密钥调度表 w[] 中其余所有行来重复这个过程本身。

总而言之,AES 加密和解密的一个重要部分就是从最初的种子密钥中生成多重轮密钥。这个 KeyExapansion 算法生成一个密钥调度并 以某种方式进行替代和置换,在这种方式中,加密和解密算法极其相似。

新的 AES 将无疑成为加密所有形式电子信息的事实上的标准,取代 DES。AES 加密的数据在某种意义上是牢不可破的,因为没有已知的密码分析攻击可

以解密 AES 密文,除非强行遍历搜索所有可能的 256 位密钥。

在任何软件设计过程中安全已不再是后顾之忧。AES 是一个重大进步,使用并理解它将大大增加软件系统的可靠性和安全性。


第二篇:AES算法原理及其实现 7000字

第12期何明星等:AES算法原理及其实现

AES算法原理及其实现

?  16?

AES算法原理及其实现

何明星1,2,林 昊2

(1.西南交通大学计算机与通信工程学院,四川成都610031;2.

四川成都610039)

3

四川工业学院计算机科学与工程系,

摘 要:在研究分析了AES加密原理的基础上着重说明了AES算法实现的具体步骤,并用C语言完整地实现

)方式将其用于对文件的加密/解密(密钥长度可选)。AES结合其它技了AES算法,并利用密文分组链接(CBC

术还可实现更为广泛的安全协议。

关键词:分组密码;对称密码体制;DES;AES中图法分类号:TP30917   文献标识码:A   文章编号:100123695(2002)1220061203

ImplementationoftheAdvancedEncryptionStandard

HEMing2xing

1,2

(AES)

,LINHao

2

(1.CollegeofComputer&CommunicationEngineering,SouthwestJiaotongUniversity,ChengduSichuan610031,China;2.Dept.&En2gineering,SichuanUniversityofScience&Technology,ChengduSichuan,610039,China)

Abstract:(CBC)Keywords:(1 引言

,通信双

方在加密/。对称密码算法的使用相当广泛,密码学界已经对它们进行了深入的研究[1]。最常用的对称密码算法是数据加密标准(DES)算法,它是由IBM在美国国家安全局(NSA)授意之下研制的一种使用56位密钥的分组密码算法。自19xx年公布成为美国政府的商用加密标准以来已使用20多年[2]。DES的主要问题是其密钥长度较短,已不适合于当今分布式开放网络对数据加密安全性的要求。在DES每隔五年的评估会议中,最后一次在19xx年美国政府终于决定不再继续延用DES作为联邦加密标准,也就表明了DES将退出加密标准的舞台,而新的标准AES(AdvancedEncryptionStandard)将粉墨登场[3]。

AES是美国国家标准技术研究所NIST旨在取代DES的新一代的加密标准[3~5]。NIST对AES候选算法的基本要求是:对称分组密码体制;密钥长度支持128,192,256位;明文分组长度128位;算法应易于各种硬件和软件实现。19xx年NIST开始AES第一轮征集、分析、测试,共产生了15个候选算法。19xx年3月完成了第二轮AES的分析、测试。19xx年8月NIST公布了五种算法(MARS,RC6,Rijndael,Serpent,Twofish)成为候选算法。最后,Rijn2dael[5],这个由比利时人设计的算法与其它候选算法在成

(AES)的竞争中取得成功,于20xx年10月被NIST宣布成为取代DES的新一代的数据加密标准,即AES。尽管人们对AES还有不同的看法[6~8],但总体来说,Rijndael作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256比特,相对而言,AES的128比特密钥比DES的56比特密钥强1021倍[4]。

2 AES加密/解密算法原理

对称密码算法根据对明文消息加密方式的不同可分为两大类,即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。AES算法属于分组密码算法,它的输入分组、输出分组以及加/解密过程中的中间分组都是128比特。密钥的长度K为128,192或256比特。用Nk=4,6,8代表密钥串的字数(1字=32比特),在本文编制的程序中由用户选定。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系见表1)。每一轮都需要一个和输入分组具有同样长度(128比特)的扩展密钥Ke的参与。由于外部输入的加密密钥K长度有限,所以在AES中要用一个密钥扩展程序(KeyExpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密密钥。

AES的加密与解密框图如图1所示。

收稿日期:2002201208;修返日期:2002205221基金项目:国家自然科学基金资助项目(69825102)

AES算法原理及其实现

  ?26?计算机应用研究

(state,w+round34)  AddRoundKeyendfor

(state)SubBytes

(state)ShiftRows

(state,w+Nr34)AddRoundKey

out=stateend

20xx年

31111 S盒变换SubBytes()

图1 AES的加密与解密框图

(1)加密变换

设X是AES的128比特明文输入,Y是128比特的密文输出,则AES密文Y可以用下面的复合变换表示:

Y=A

R?S?Akr?C?R?S?Ak(r21)?…?C?R?S?Ak1(X)k(r+1)?

对输入矩阵的任一个元素A做如下变换S[A]:

(1)一个元素A从存储角度看都是一个八位的二进制数。算出前四位所代表的十六进制数x和后四位所代表的十六进制数y。如A=11010100时,x=c,y=4。

(2)从AES算法给定的S2Box(

AES算法原理及其实现

16行16列的矩阵,其中每个元素为一个字节,具体的S2Box略)中找出S[A]=S[x,y]

AES算法原理及其实现

的值。如A=11010100时,S[A]=S[x,y]=S[c,4]={1c}=00011101。或直接通过下面的公式将A=b7b6b5b4b3b2b1b0变为S[A]=b’7b’

AES算法原理及其实现

6b’5b’4b’3

AES算法原理及其实现

b’2b’1b’0。

b′i=bi?b(i+4)mod8?b(i+5)mod8?b(i+6)mod8?b(i+6)mod8?Ci

其中“?”表示复合运算。这里Aki:表示对X的一个变换

Aki(X)=X?Ki(Ki为第i轮的子密钥,为比特串的异或运算)。S:S盒置换。即对每一个字节用S2Box做一个置换。S2Box是一个给定的转换表。R:行置换

AES算法原理及其实现

。C:列置

(x)=a(x)?s(x)换。s′

s′0,cs

AES算法原理及其实现

1,cs′2,cs′′

这里c=

(c0,c1,c2,c3,c4,c5,c6,c7)=(0,1,1,0,0,0,1,1)。

()31112 行变换ShiftRows

02 03 01 =

01 02 03 0101 01 02 0303 01  s0,cs1,cs2,c,的第一行不变;第

34这里?313绍。

(2)解密变换

解密变换是加密变换的逆变换,这里不再详述。

()31113 列变换MixColumns

列变换是对中间状态矩阵State逐列进行变换。其

变换为如下的矩阵运算:

s′0,cs′1,cs′2,cs′=

02 03 01 01 02 03 0101 01 02 0303 01 01 s0,cs1,cs2,cs3,c

3 AES加密/解密算法的实现

311 分组加密

表1是三种不同类型的AES加密密钥分组大小与

相应的加密轮数的对照表。

加密开始时,输入分组的各字节按表2的方式装入一个矩阵State中。如输入ABCDEFGHIJKLMNOP,则输入块影射到如表2的状态矩阵State中。

经过上面的运算,原来的一列就被替换成下面的式子所表达的新列:

S(0,c)′=({02}×S(0,c))?({03}×S(1,c))?S(2,c)?S(3,c)S(1,c)′=S(0,c)?({02}×S(1,c))?({03}×S(2,c))?S(3,c)S(2,c)′=S(0,c)?S(1,c)?({02}×S

AES算法原理及其实现

(2,c))?({03}×S(3,c)S(3,c)′=({03}×S(0,c))?S(1,c)?S(2,c)?({02}×S(3,c))

加密过程主程序由下面的伪代码描述。其中的子

程序SubBytes(),ShiftRows(),MixColumns()和Ad2dRounKey()将在接下来的部分介绍,密钥扩展程序(Key

)将在3.2介绍。Expansion

Cipher(bytein[434],byteout[434],wordw[43(Nr+1)])

begin

bytestate[4,4]state=in;

(state,w)  AddRoundKey//SeeSec.3.1.4

forround=1step1toNr21

(state)  //SeeSec.3.1.1  SubBytes

(state)  //SeeSec.3.1.2  ShiftRows

(state)  //SeeSec.3.1.3  MixColumns

这里?为按位异或运算,其中的乘法×按照下面介

绍的模乘同余规则进行计算。

列变换中要用到的模乘同余规则和我们一般用到的乘法有些不同,由于每一个元素都是一个字节,于是可把这个字节看成一个形式上的七次多项式,即将b7b6b5b4b3b2b1b0视为b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b

,如{11011001}2={d9}16可以被看成是

x7

+x6+x4+x3+1。列变换希望把一个字节变换为一个新的字节,所以需要把两个形式上的七次多项式的乘法结果变为一个新的形式上的七次多项式,然后才能将其恢

复为一个字节的长度。这里采用模一个八次不可约多项式的同余乘法,即将两七次多项式的乘法结果除以这个八次不可约多项式再取其余式。在AES中这个八次

第12期何明星等:AES算法原理及其实现

AES算法原理及其实现

?  36?

不可约多项式为m(x)=x8+x4+x3+x+1。例如:

(x6+x4+x2+x+1)×(x7+x+1)=x13+x11+x9+x8+x6+x5+x4+x3+1

(x13+x11+x9+x8+x6+x5+x4+x3+1)mod(x8+x4+x3+x+1)=x7+x6+1

对应为{57}×{83}={c1}。

()31114 与扩展密钥的异或运算AddRoundKey

特)和密钥。

(3)用密钥扩展程序对密钥加以扩展。128比特、

(key),192比特、256比特密钥分别对应KeyExpansion128(key),KeyExpansion256(key),分别生成KeyExpansion192

72bytes,204bytes,236bytes的扩展密钥。

(4)创建加密/解密文件。文件都是以文本格式存

扩展密钥只参与了这一个变换。根据加密的轮数

用相应的扩展密钥的四个数据项和中间状态矩阵上的列进行按位异或。

[S(0,c)′,S(1,c)′,S(2,c)′,S(3,c)′]=[S(0,c),S(1,c),S(2,c),S(3,c)]XOR[W(round×nb+c)]

储的。

(5)从等待加密/解密文件中取出16字节。若是未取出16个字节文件就结束,则在结束处标上文件结束

)中。符。把取出的数据放入中间变量(STATE

(6)根据密钥的长度对STATE中的数据进行加密/

312 密钥扩展程序KeyExpansion

AES算法利用外部输入密钥K(密钥串的字数为

Nk),通过密钥扩展程序得到共4(Nr+1)字的扩展密钥w[4×(Nr+1)]。涉及如下三个模块:

(1)位置变换RotWord()。把一个四个字节的序列[a0,a1,a2,a3]左移一个字节变为[a1,a2,a3,a0]。

(2)SubWord()。对一个四字节的输入字[a0,a1,a2,a3]的每一个字节进行S盒变换,然后作为输出(见31111)。

(3)变换Rcon[]。Rcon[i]表示32比特字符串[xi21,00,00,00]。这里x=(02),xi21是x=(02)的(i21)次幂的十六进制表示。例如,Rcon[1]=[01000000],Rcon[2]=

[02000000],Rcon[3]=[04000000],Rcon[4]=[08000000],Rcon[10]=[36000000]。

解密。128比特、192比特、256比特分别对应Cipher128(InvCipher128),Cipher192(InvCipher192),Cipher256(In2)。并把加密/解密后的数据保存在STATEvCipher256

中。把STATE中的数据写入加密/解密文件中。

(7)如果等待加密/解密的文件已经结束,则关闭文件,回到操作(1);否则回到操作/解密操作。

,

AES加密原理的基础上着重说明了AES算法实现的具体步骤,包括扩展密钥的异或运算、AddRoundKey()、列变换MixColumns()、行变换()、ShiftRowsS盒变换SubBytes()等,以及各步骤的轮换

(4)k外部密钥K;w[[i21]]与前第Nk个字2,即w[[i]]=w[[i21]]XORw[[i2Nk]]。但是若i为Nk的倍数,则w[i]=w[i2Nk]XORSubWord(RotWord(w[[i21]]))XORRcon[i/Nk]。

举例:①设外部输入的加密密钥CipherKey=2b7e151628aed2a6abf7158809cf4f3c

Nk=4,

顺序和最重要的密钥扩展程序KeyExpansion等,并用C语言完整地实现了AES算法。参考文献:

[1][2][3][4][5][6]

冯登国,裴定一1密码学导引[M]1北京:科学出版社,19991

NSA1DataEncryptionStandard[M]1FIPSPUB46,19771

则w0=2b7e1516w1=28aed2a6w2=abf71588w3=09cf4f3c;

(w3))XORRcon[4/Nk]=a0fafe17;w4=w0XORSubWord(RotWord

w5=w[[i21]]XORw[[i2Nk]=w[[4]]XORw[[1]]=88542cb1;w43=b6630ca6。

何明星,范平志1新一代私钥加密标准AES进展与评述[J]1计算机应用研究,2001,18(10):426.

NIST1AdvancedEncryptionStandard(AES)[M]1FederalInfor2mationProcessingStandardsPublication,2001.

TheAdvancedEncryptionStandard(Rijndael)[EB/OL]1.cn/,March,2001

②输入明文:00112233445566778899aabbccddeeff;

输入密钥:000102030405060708090a0b0c0d0e0f各轮密文:

round[0].input00112233445566778899aabbccddeeff;round[0].k

sch000102030405060708090a0b0c0d0e0f

round[1].start00102030405060708090a0b0c0d0e0f0

1

2

~sean/.AESForum

SMurphy,MRobshaw1FurtherCommentsontheStructureofRijndael[EB/OL]1http://www.cs.rbbnc.ac.uk/Comment,2000208217.

round[10].output69c4e0d86a7b0430d8cdb78070b4c55aOUTPUT:69c4e0d86a7b0430d8cdb78070b4c55a

[7]SMurphy,MRobshaw1NewObservationonRijndael[EB/OL]1http://www.cs.rbbnc.ac.uk/2000208207.

~sean/,AESForumComment,

2

4 对文件的加密/解密

在完成了DES分组加密算法实现的基础上,现在利

用密文分组链接(CBC)方式将其用于对文件的加密/解密(密钥长度可选),程序的操作步骤如下:

(1)根据文件处理方式选择模块,选择对文件加密、对文件解密或是退出程序。

(2)输入密钥K的长度(128比特、192比特、256比

[8]

AESDiscussionForum[EB/OL]1http://aes.nist.gov/aes/,2001031

作者简介:

何明星,男,四川工业学院计算机科学与工程系副教授,博士生,研究方向为电子商务、网络与信息安全等;林昊,男,学生,研究方向为网络与信息安全。

更多类似范文
┣ 算法各种算法总结 15400字
┣ 分类算法总结 2200字
┣ 算法总结 2300字
┣ 常用推荐系统算法总结及性能比较 3600字
┣ 更多算法心得
┗ 搜索类似范文