tag 标签: aes

相关博文
  • 热度 14
    2013-6-4 14:37
    1669 次阅读|
    1 个评论
    加密它:用新的高级加密标准(AES)保持你的数据安全 原著:James McCaffrey 翻译:小刀人   原文出处:MSDN Magazine November 2003 (Encrypt It) 本文的代码下载:msdnmag200311AES.exe (143KB) 本文假设你熟悉 C# 和 位(bit)操作。 摘要   AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了AES的概貌并解析了它使用的算法。包括一个完整的C#实现和加密.NET数据的举例。在读完本文后你将能用AES加密、测试 基于AES的软件并能在你的系统中使用AES加密。     美国国家标准与技术研究所(NIST)在2002年5月26日建立了新的高级数据加密标准(AES)规范。本文中我将提供一个用C#编写的的能运行的 AES 实现,并详细解释到底什么是 AES 以及编码是如何工作的。我将向您展示如何用 AES 加密数据并扩展本文给出的代码来开发一个商业级质量的 AES 类。我 还将解释怎样把 AES 结合到你的软件系统中去和为什么要这么做,以及如何测试基于 AES 的软件。   注意本文提供的代码和基于本文的任何其它的实现都在联邦加密模块出口控制的适用范围之内(详情请参看 Commercial Encryption Export Controls )。   AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。 Figure 1 部分数据 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 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 Figure 2 S-盒( Sbox ) 当 AES 的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为w 最初的 Nk (6) 行被作为种子,用原始密钥值(0x00 到0x17)。剩余行从种子密钥来产生。变量 Nk 代表以 32 位字为单位的种子密钥长度。稍后我分析 AES 实现时你将清楚地看到 w ,其过程描述的伪代码参见 Figure 5 。   在规范中,加密算法实现的一个预备的处理步骤被称为 AddRoundKey(轮密钥加)。AddRoundKey 用密钥调度表中的前四行对 State 矩阵实行一个字节一个字节的异或(XOR)操作,并用轮密钥表 w 异或 输入 State 。   举个例子,如果 State 矩阵的第一行保存的字节是{ 00, 44, 88, cc },第一列密钥调度表是{ 00, 04, 08, 0c },那么新的 State 值是用 w ( 0x08 或 0x80 )异或 State (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 的值是 0x40 如果你想找到它的代替者,你取 State 的值 (0x40) 并让 x 等于左边的数字(4)并让 y 等于右边的数字(0)。然后你用 x 和 y 作为索引 进到 Sbox 表中寻找代替值,如 Figure 2 所示。   ShiftRows 是一个置换操作,它将 State 矩阵中的字节向**转。Figure 6 示范了 ShiftRows 如何操作 State 的值是0x09,并且列1上的其它值分别为 0x60,0xe1 和 0x04,那么State 的新值计算如下: State = (State * 0x01) + (State * 0x02) +(State * 0x03) +(State * 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 用域加和域乘的组合来替换字节。 有限域GF(28)的加法和乘法   正如你所看到的,AES 加密算法使用相当简单明了的技术来代替和置换,除 MixColumns 例程以外。MixColumns 使用特殊的加法和乘法。AES 所用的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES 基于有限域GF(28)。   GF(28)由一组从 0x00 到 0xff 的256个值组成,加上加法和乘法,因此是(28)。GF代表伽罗瓦域,以发明这一理论的数学家的名字命名。GF(28) 的一个特性是一个加法或乘法的操作的结果必须是在{0x00 ... 0xff}这组数中。虽然域论是相当深奥的,但GF(28)加法的最终结果却很简单。GF(28) 加法就是异或(XOR)操作。   然而,GF(28)的乘法有点繁难。正如你稍后将在 C# 实现中所看到的,AES的加密和解密例程需要知道怎样只用七个常量 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e 来相乘。所以我不全面介绍GF(28)的乘法,而只是针对这七种特殊情况进行说明。   在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) 这是可以行得通的,因为你知道如何用 0x02 和 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 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”的常数表(作为“轮常数”)。让我们先来逐个看一下这三东西,然后再回到整个 KeyExpansion 的讨论中来。   RotWord 例程很简单。它接受一个4个字节的数组并将它们向**转一个位置。因为轮调度表 w 的1行**。注意 KeyExpansion 使用的这个 RotWord 函数与加密算法使用的  ShiftRows (行位移变换)例程非常相似,只是它 处理的是单行密钥调度 w 。   SubWord 例程使用替换表 Sbox 对一给定的一行密钥调度表 w 返回 0xcc。   KeyExpansion 例程使用一个被称为轮常数表的数组 Rcon if (row % Nk == 0) temp = SubWord(RotWord(temp)) xor Rcon else if (Nk == 8 and row % Nk == 4) temp = SubWord(temp) w = w xor temp } 先不要去看if子句,你将看到密钥调度表 w 的维数是 4 列并且 Nb × (Nr + 1) 等于 4 × (12 + 1),或 52 行。KeyExpansion 将种子密钥的值拷贝到密钥调度字节表 w 表总是 4 列,在这种情况下KeyExapansion 将种子密钥拷贝到 w = 14 15 16 17 条件 (row % Nk == 0)为真,因此首先 RotWord 子程序被应用:   temp = 15 16 17 14 这时 SubWord 被应用: temp = 59 47 f0 fa 用 Rcon = Rcon = 01 00 00 00 进行异或: temp = 58 47 f0 fa 这时用 w = w = 00 01 02 03 异或,产生了下面结果: w = 58 46 f2 f9 密钥调度表 w[] 中其余所有行来重复这个过程本身。   总而言之,AES 加密和解密的一个重要部分就是从最初的种子密钥中生成多重轮密钥。这个 KeyExapansion 算法生成一个密钥调度并 以某种方式进行替代和置换,在这种方式中,加密和解密算法极其相似。     本文中文网址:http://blog.csdn.net/guo2777/article/details/1791399 MSDN原文网址:http://msdn.microsoft.com/zh-cn/magazine/cc164055(en-us).aspx
  • 热度 21
    2009-12-21 10:53
    1746 次阅读|
    0 个评论
    拥有NIST证明而且极其成熟的加密IP模块AES-G2产品,为了迎接圣诞,以仅源代码成本的许可证价 格贡献给中国客户! AES-G2圣诞价格:$5000美元 资料参考: http://www.algotronix-store.com/ 购买联系地址: http://www.shwltech.com/ 上海微岭电子科技有限公司祝大家圣诞快乐!
  • 热度 15
    2009-12-14 11:59
    3821 次阅读|
    0 个评论
    目前最先进的加密和解密技术就是AES(Advanced Encryption Standard)了,AES算法是由NIST (National Institute of Standards and Technology)所制定,并且还提供了AESAVS(The Advanced Encryption Standard Algorithm Validation Suite)测试标准和FIPS197实现标准。 根据NIST的标准,AES加密和解密可以支持有多种的比特长度,以及很多应用模式和数据线宽度。 英国的Algotronix公司所开发设计的各种AES系列模块IP,正对各种平台的需要拥有非常齐全的种 类,其包括支持Xilinx,Actel,Altera的FPGA平台,以及用户的ASIC应用。即有AES for Xilinx, AES for Actel, AES for Altera和AES for ASIC。 1)AES-G2具有支持128,192和256位的键长,数据线宽度是32位。功能包括有加密,解密,以及加 密/解密,其时钟周期为44(AES 128,加密)。其具有ECB,CBC,CFB,CFB,CTR模式。 2)AES-G3同样支持128,192和256位的键长,但数据线宽度具有8,16,32,64和128位,容许面 积和速度的最适合化。其时钟周期为40(AES 128,加密,典型操作)。其具有ECB,CBC,OFB, CFB1, CFB8, CFB128和CTR模式。 3)AES-GCM是一款用于10Gbit IEEE802.1网络的IP内核。其用于连接于AES-G3并实现AES的128位 的(Galois)伽罗瓦域乘算器来提供给高速苏剧流解密和验证功能。该IP内核可以应用于有线,光纤 ,无线网络通信和卫星应用系统中。 4)AES-Keywrap是AES-G2内核的功能扩展模块,其采用IETF的RFC3394标准。AES Keywrap算法也 符合W3C XML保密要求以及IEEE P1619加密标准。该模块可以应用于要求FIPS140-2 Level3或者 Level4的高保密应用要求,硬盘驱动保密IEEE P1619,财政保密:ANSI X9.53,各种通信中。 5)DesignTag Red是一款使用于在操作FPGA芯片时验明用户设计并还可以报告状态信息。不同于 ASIC器件,FPGA芯片包装上的印签标记是验明FPGA的类型和制造商。DesignTag内核在设别芯片包 装和设计的应用上是及其广泛而重要的。 上述Algotronix的各种AES模块IP内核,可以应用于, ◆各种通信系统,VoIP,VPN等 ◆无线网络 ◆内部加密:IPSec,SSL,TSL协议 ◆财政保密:ANSI X9.53 ◆游戏机 ◆满足于防盗版 ◆专利保密应用 对于上述各种AES模块,可提供VHDL,Verilog-HDL,以及各种平台的网表。 有关Algotronix的各种AES加密解密IP内核模块的详细信息,可参见 或者 具体数据手册也可以向我们公司 到我们公司( http://www.shwltech.com/ )索取。 使用AES的IP内核系列产品的理念是:因为世界需要强力的保密措施!!!
相关资源