AES加密算法原理图文.docx

上传人:b****3 文档编号:13245349 上传时间:2023-06-12 格式:DOCX 页数:15 大小:235.71KB
下载 相关 举报
AES加密算法原理图文.docx_第1页
第1页 / 共15页
AES加密算法原理图文.docx_第2页
第2页 / 共15页
AES加密算法原理图文.docx_第3页
第3页 / 共15页
AES加密算法原理图文.docx_第4页
第4页 / 共15页
AES加密算法原理图文.docx_第5页
第5页 / 共15页
AES加密算法原理图文.docx_第6页
第6页 / 共15页
AES加密算法原理图文.docx_第7页
第7页 / 共15页
AES加密算法原理图文.docx_第8页
第8页 / 共15页
AES加密算法原理图文.docx_第9页
第9页 / 共15页
AES加密算法原理图文.docx_第10页
第10页 / 共15页
AES加密算法原理图文.docx_第11页
第11页 / 共15页
AES加密算法原理图文.docx_第12页
第12页 / 共15页
AES加密算法原理图文.docx_第13页
第13页 / 共15页
AES加密算法原理图文.docx_第14页
第14页 / 共15页
AES加密算法原理图文.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

AES加密算法原理图文.docx

《AES加密算法原理图文.docx》由会员分享,可在线阅读,更多相关《AES加密算法原理图文.docx(15页珍藏版)》请在冰点文库上搜索。

AES加密算法原理图文.docx

AES加密算法原理图文

AES加密算法原理(图文)

AES加密算法原理,图文,

随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。

经过三轮的筛选,比利时JoanDaeman和VincentRijmen提交的Rijndael算法被提议为AES的最终算法。

此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。

尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。

AES设计有三个密钥长度:

128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍[2]。

AES算法主要包括三个方面:

轮变化、圈数和密钥扩展。

AES是一个新的可以用于保护电子数据的加密算法。

明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,幵丏用128位,16字节,分组加密和解密数据。

不公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。

通过分组密码返回的加密数据的位数不输入数据相同。

迭代加密使用一个循环结构,在该循环中重复置换,permutations,和替换(substitutions,输入数据。

Figure1显示了AES用192位密钥对一个16位字节数据块进行加密和解密的情形。

Figure1部分数据

AES算法概述

AES算法是基于置换和代替的。

置换是数据的重新排列,而代替是用一

个单元数据替换另一个。

AES使用了几种不同的技术来实现置换和替换。

为了

阐明这些技术,让我们用Figure1所示的数据讨论一个具体的AES加密例

子。

下面是你要加密的128位值以及它们对应的索引数组:

00112233445566778899aabbccddeeff012345678910

1112131415

192位密钥的值是:

000102030405060708090a0b0c0d0e0f10111213141516170123456

7891011121314151617181920212223

Figure2S-盒,Sbox,

当AES的构造函数,constructor,被调用时,用于加密方法的两个表被初始化。

第一个表是代替盒称为S-盒。

它是一个16×16的矩阵。

S-盒的前五行和前五列如Figure2所示。

在幕后,加密例程获取该密钥数组幵用它来生成一个名为w[]的密钥调度表,Figure3所示。

Figure3密钥调度表,KeySched,

w[]最初的Nk(6)行被作为种子,用原始密钥值,0x00到0x17,。

剩余行仍种子密钥来产生。

变量Nk代表以32位字为单位的种子密钥长度。

稍后我分析AES实现时你将清楚地看到w[]是怎样产生的。

关键是这里现在有许多密钥使用而不叧是一个。

这些新的密钥被称为轮密钥,roundkeys,以将它们不原始种子密钥区别开来。

Figure4State,态,数组

AES加密例程开始是拷贝16字节的输入数组到一个名为State,态,的4×4字节矩阵中。

,参见Figure4,。

AES加密算法取名为Cipher,它操作State[],其过程描述的伪代码参见Figure5。

在规范中,加密算法实现的一个预备的处理步骤被称为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)的结果:

1000100000001000XOR10000000

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表中寻找代替值,如Figure2所示。

ShiftRows是一个置换操作,它将State矩阵中的字节向左旋转。

Figure6示范了ShiftRows如何操作State[]。

State的第0行被向左旋转0

个位置,State的第1行被向左旋转1个位置,State的第2行被向左旋转2个位置,而State的第3行被向左旋转3个位置。

Figure6对State进行ShiftRows操作

MixColumns是一个代替操作,它是理解AES算法时最具技巧,戒者说是最需要动脑筋的部分,的部分。

它用State字节列的值进行数学域加和域乘的结果代替每个字节。

我将在下一节中详细解释与门的域加和域乘细节。

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

[cpp]viewplaincopy

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用域加和域乘的组合来替换字节。

有限域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可以这样做:

[cpp]viewplaincopy

1.b*0x0d

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

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

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

0x01)

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

[cpp]viewplaincopy

1.b*0x09

2.=b*(0x08+0x01)

3.=(b*0x02*0x02*0x02)+(b*0x01)b*0x0b

4.=b*(0x08+0x02+0x01)=(b*0x02*0x02*0x02)

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

5.=b*(0x08+0x04+0x02)

6.=(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){copytheseedkeyintothe

firstrowsofwforeachremainingrowofw{usetwoofthepreviousrows

tocreateanewrow}}“用前面两行来产生一个新行”,“usetwoofthepreviousrowstocreateanewrow”,的例程用到了两个子例程,RotWord和SubWord以及一个名为“Rcon”的常数表,作为“轮常数”,。

让我们先来逐个看一下这三东西,然后再回到整个KeyExpansion的讨论中来。

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个轮常数。

你可以在Figure7中看到这些常数清单。

每个轮常数的最左边的字节是GF(28)域中2的幂次方。

它的另一个表示方法是其每个值是前一个值乘上0x02,正如前一部分讨论GF(28)乘法时所描述的那样。

注意0x80×0x02=0x1b是0x80左秱1个比特位后紧接着不0x1b进行异戒,如前所述。

现在让我们更进一步看看KeyExpansion内幕中的循环。

这里所用的伪码比以前更为详细,这个循环是:

[cpp]viewplaincopy

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

2.{

3.temp=w[row-1]

4.if(row%Nk==0)

5.temp=SubWord(RotWord(temp))xorRcon[row/Nk]

6.elseif(Nk==8androw%Nk==4)temp=SubWor

d(temp)w[row]=w[row-Nk]xortemp

7.}

先不要去看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值:

000102030405060708090a0b0c0d0e

0f1011121314151617密钥调度字节表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]=14151617条件(row%Nk==0)为真,因此首先RotWord子程序被应用:

temp=15161714这时SubWord被应用:

temp=5947f0fa用Rcon[row/Nk]=Rcon[6/6]=01000000进行异戒:

temp=5847f0fa

这时用w[row-Nk]=w[6-6]=00010203异戒,产生了下面结果:

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

总而言之,AES加密和解密的一个重要部分就是仍最初的种子密钥中生成多重轮密钥。

这个KeyExapansion算法生成一个密钥调度幵以某种方式进行替代和置换,在这种方式中,加密和解密算法极其相似。

一.AES对称加密:

AES加密

分组

二.分组密码的填充

分组密码的填充

PKCS#5填充方式

三.流密码

四.分组密码加密中的四种模式:

3.1ECB模式

优点:

1.简单;2.有利于并行计算;3.误差不会被传送;缺点:

1.不能隐藏明

文的模式;2.可能对明文进行主动攻击;

3.2CBC模式:

优点:

1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺点:

1.不利于并行计算;2.误差传递;3.需要初始化向量IV3.3

CFB模式:

优点:

1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于

分组的数据;缺点:

1.不利于并行计算;2.对明文的主动攻击是可能的;3.误差传送:

一个明文单元损坏影响多个单元;

优点:

1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于分组的数据;缺点:

1.不利于并行计算;2.误差传送:

一个明文单元损坏影响多个

单元;3.唯一的IV;3.4OFB模式:

下面是示例代码:

[java]viewplaincopy

1.packagemini.code.test.t20120810;

2.

3.importjavax.crypto.*;

4.importjavax.crypto.spec.*;

5.

6.publicclassAES

7.{

8.publicstaticStringasHex(bytebuf[])

9.{

10.StringBufferstrbuf=newStringBuffer(buf.lengt

h*2);

11.inti;

12.for(i=0;i

13.{

14.if(((int)buf[i]&0xff)<0x10)15.strbuf.append("0");

16.strbuf.append(Long.toString((int)buf[i]

&0xff,16));

17.}

18.returnstrbuf.toString();

19.}

20.

21.publicstaticvoidmain(String[]args)throwsExcept

ion

22.{

23.

24.Stringmessage="这是个加密的例子";25.System.out.println("原文:

"+message);26.System.out.println("原文转换格式显示:

"+asHex(message.getBytes()));//string,》byte,》Hex27.//,,,,,,生成密码

28.KeyGeneratorkgen=KeyGenerator.getInstance("AE

S");//获取密匙生成器

29.kgen.init(128);//生成128位的AES密码生成器30.SecretKeyskey=kgen.generateKey();//生成密

31.byte[]raw=skey.getEncoded();//编码格式32.SecretKeySpecskeySpec=newSecretKeySpec(raw,

"AES");//生成一组扩展密钥,并放入一个数组之中33.Ciphercipher=Cipher.getInstance("AES");34.cipher.init(Cipher.ENCRYPT_MODE,skeySpec);//用

ENCRYPT_MODE模式,用skeySpec密码组,生成AES加密方法35.//,,,,,,,,加密message

36.byte[]encrypted=cipher.doFinal(message.getByt

es());//加密message

37.System.out.println("加密后:

"+encrypted);//打

印密文

38.System.out.println("密文转换格式后:

"+asHex(encrypted));//把密文转换成16进制格式39.//,,,,,,,解密

40.cipher.init(Cipher.DECRYPT_MODE,skeySpec);

41.byte[]original=cipher.doFinal(encrypted);//

解密

42.StringoriginalString=newString(original,"UT

F8");//重新显示明文

43.System.out.println("解密

后:

"+originalString);

44.System.out.println("解密出的消息转换格式显

示:

"+asHex(original));//byte型原文

45.}

46.}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2