文档介绍:加密它:用新的高级加密标准(AES)保持你的数据安全
James McCaffrey
摘要
AES (The Advanced Encryption Standard)是美国国家标准与技术研究所用于 加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数 字信息的方法。本文展示了 AES的概貌并解析了它使用的算法。包括一个完整 的C#。在读完本文后你将能用AES加密、测试 基 于AES的软件并能在你的系统中使用AES加密。
美国国家标准与技术研究所(NIST)在2002年5月26日建立了新的高级数据加密 标准(AES)规范。本文中我将提供一个用C#编写的的能运行的AES实现,并 详细解释到底什么是AES以及编码是如何工作的。我将向您展示如何用AES 加密数据并扩展本文给出的代码来开发一个商业级质量的AES类。我还将解 释怎样把AES结合到你的软件系统中去和为什么要这么做,以及如何测试基于 AES的软件。
AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥, 并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不 同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数 据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换 (permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用 192位密钥对一个16位字节数据块进行加密和解密的情形。
AES算法概述
AES算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个 单元数据替换另一个。AES使用了几种不同的技术来实现置换和替换。为了阐 明这些技术,让我们用Figure 1所示的数据讨论一个具体的AES加密例子。 下面是你要加密的128位值以及它们对应的索引数组:
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
0 1 23456789 10 11 12 13 14 15
192位密钥的值是:
00 01 02 03 04 05 06 07 08 09 0a Ob 0c Od Oe Of 10 11 12 13 14 15 16 17 012345678910111213141516171819 20 21 22 23
Figure 2 S-盒(Sbox )
当AES的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。
第一个表是代替盒称为S-盒。它是一个16x16的矩阵。S-盒的前五行和前五列如 Figure 2所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的 密钥调度表,Figure 3所示。
0 90
01
•2
•3
1・4
05
,6
G7
2・8
09
•a
•b
3・c
Oil
机
•f
4 10
11
12
13
5 14
15
16
17
6 58
12
19
7 5c
43
f4
f«
8 54
4a
ft
f5
9 58
47
fa
10 48
5€
•2
•9
49 la
71
4c
•9
50。4
U
c2
71
51 «3
a4
Id
5d
Figure 3 密钥调度表(Key Sched)
w[]最初的Nk (6)行被作为种子,用原始密钥值(0x00至i]0x17)o剩余行从种 子密钥来产生。变量Nk代表以32位字为单位的种子密钥长度。稍后我分析 AES实现时你将清楚地看到w[]是怎样产生的。关键是这里现在有许多密钥 使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它们与原始 种子密钥区别开来。
0 1 2 3
Figure 4 State (态)数组
AES加密例程开始是拷贝16字节的输入数组到一个名为State (态)的 4x4字节矩阵中。(参见Figure 4)。AES加密算法取名为Cipher,它操作 State]],其过程描述的伪代码参见Figure 5 □
在规范中,加密算法实现的一个预备的处理步骤被称为AddRoundKey (轮 密钥加)。AddRoundKey用密钥调度表中的前四行对State矩阵实行一个字节 一个字节的异或(XOR)操作,并用轮密钥表w[c,r]异或输入State[r,c]o
举个例子,如果State矩阵的第一行保存的字节是{ 00, 44, 88, cc },第一 列密钥调度表是{0