实验1 AES算法分析及其IP核体系结构设计.docx

上传人:b****7 文档编号:8970247 上传时间:2023-02-02 格式:DOCX 页数:24 大小:319.17KB
下载 相关 举报
实验1 AES算法分析及其IP核体系结构设计.docx_第1页
第1页 / 共24页
实验1 AES算法分析及其IP核体系结构设计.docx_第2页
第2页 / 共24页
实验1 AES算法分析及其IP核体系结构设计.docx_第3页
第3页 / 共24页
实验1 AES算法分析及其IP核体系结构设计.docx_第4页
第4页 / 共24页
实验1 AES算法分析及其IP核体系结构设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

实验1 AES算法分析及其IP核体系结构设计.docx

《实验1 AES算法分析及其IP核体系结构设计.docx》由会员分享,可在线阅读,更多相关《实验1 AES算法分析及其IP核体系结构设计.docx(24页珍藏版)》请在冰豆网上搜索。

实验1 AES算法分析及其IP核体系结构设计.docx

实验1AES算法分析及其IP核体系结构设计

实验报告1:

AES算法分析及其IP核体系结构设计

一、实验目的

理解并掌握AES算法的细节,提出一个AESIP核的体系结构设计方案。

二、实验内容

1、学习AES算法,理解并掌握AES算法的原理、结构及其需要的基本运算。

2、在对算法进行深入分析的基础上,提出一个AESIP核的体系结构设计方案。

三、实验环境

PC机1台、Modelsim仿真软件1套。

四、实验步骤

1、AES算法学习和分析

1.1AES的加密过程

AES的加密过程可以用下面的伪语言代码描述:

Cipher(plaintext,ciphertext,CiperKey){

//初始化

State=plaintext;

KeyExpansion(CipherKey,ExpandedKey);

//生成扩展密钥ExpandedKey

AddRoundKey(State,ExpandedKey);

//前Nr–1轮

for(r=1;r

SubBytes(State);

ShiftRow(State);

MixColumn(State);

AddRoundKey(State,ExpandedKey);

}

//最后一轮

SubBytes(State);

ShiftRow(State);

AddRoundKey(State,ExpandedKey);

Ciphertext=state;

}

其中plaintext是输入明文,可以定义成plaintext[4×Nb]数组;ciphertext是输出密文,可以定义成ciphertext[4×Nb]数组;CipherKey是加密密钥,可以定义成CipherKey[4×Nk]数组;圈密钥ExpandedKey可表示成w[Nb×(Nr+1)]数组;State是状态,整个加密过程都是针对State进行的。

(1)S盒变换SubBytes()

S盒变换又称字节替代变换,是一个针对字节的非线性、可逆变换。

它将状态中的每一个字节进行非线性变换转换为另一个字节,作用在状态上每个字节的变换可以表示为SubBytes(state)。

可以将变换SubBytes()对各种可能字节的变换结果排成一个表,如表2-3所示,该表称为AES的S盒。

通过查表可以直接得到SubBytes()的输出,这样可以加快程序执行的速度。

如果状态中的一个字节为xy,则S盒中第x行第y列的字节就是SubBytes()的输出。

表2-3S盒变换表

Tab.2-3ThetableofS-boxtransformation

列号y

0

1

0

3

4

5

6

7

8

9

A

B

C

D

E

F

 

x

0

63

7C

77

7B

F2

6B

6F

C5

30

01

67

2B

FE

D7

AB

76

1

CA

82

C9

7D

FA

59

47

F0

AD

D4

A2

AF

9C

A4

72

C0

2

B7

FD

93

26

36

3F

F7

CC

34

A5

E5

F1

71

D8

31

15

3

04

C7

23

C3

18

96

05

9A

07

12

80

E2

EB

27

B2

75

4

09

83

2C

1A

1B

6E

5A

A0

52

3B

D6

B3

29

E3

2F

84

5

53

D1

00

ED

20

FC

B1

5B

6A

CB

BE

39

4A

4C

58

CF

6

D0

EF

AA

FB

43

4D

33

85

45

F9

02

7F

50

3C

9F

A8

7

51

A3

40

8F

92

9D

38

F5

BC

B6

DA

21

10

FF

F3

D2

8

CD

0C

13

EC

5F

97

44

17

C4

A7

7E

3D

64

5D

19

73

9

60

81

4F

DC

22

2A

90

88

46

EE

B8

14

DE

5E

0B

DB

A

E0

32

3A

0A

49

06

24

5C

C2

D3

AC

62

91

95

E4

79

B

E7

C8

37

6D

8D

D5

4E

A9

6C

56

F4

EA

65

7A

AE

08

C

BA

78

25

2E

1C

A6

B4

C6

E8

DD

74

1F

4B

BD

8B

8A

D

70

3E

B5

66

48

03

F6

0E

61

35

57

B9

86

C1

1D

9E

E

E1

F8

98

11

69

D9

8E

94

9B

1E

87

E9

CE

55

28

DF

F

8C

A1

89

0D

BF

E6

42

68

41

99

2D

0F

B0

54

BB

16

(2)行移位变换ShiftRows()

行移位是将状态阵列的各行进行循环移位,不同状态行的位移量不同。

第0行不移位,保持不变,第1行移动C1个字节,第2行移动C2个字节,第3行移动C3个字节。

C1,C2,c3值依赖于分组长度Nb的大小。

位移量C1、C2和C3与分组长度Nb有关,如下表:

表2-4对应于不同分组长度的位移量

Tab.3-3thedisplacementcorrespondingtodifferentpacketlength

Nb

C1

C2

C3

4

1

2

3

6

1

2

3

8

1

3

4

在AES加密标准中Nb=4。

(3)列混合变换MixColumns()

列混合变换是对一个状态逐列进行变换,它将一个状态的每一列视为有限域GF(28)上的一个多项式。

其中,

,是AES选择的一个逆元多项式,

表示模

乘法。

表示为矩阵乘法:

(2-3)

相乘之后每一列的结果如下:

(4)轮密钥加AddRoundKey()变换

轮密钥加是将轮密钥简单地与状态矩阵进行逐比特异或运算。

每个轮密钥由密钥扩展算法得到,轮密钥的长度为Nb个字。

轮密钥按顺序取自扩展密钥ExpandedKey,扩展密钥是由原始密钥经过扩展后得到的,扩展密钥的长度为Nb(Nr+1)个字。

1.2AES的密钥扩展过程

AES算法得到初始密钥K后,首先经过一个密钥扩展过程以产生所有的轮密钥。

密钥扩展共产生Nb(Nr+1)个字,算法初始需要一个Nb个字的集合,接着每个轮操作都需要Nb个字的密钥数据。

最终的密钥流程共包含了一个4字节字的线性数组,用[wi]表示,

扩展密钥程序涉及RotWord()、SubWord()和Rcon()模块。

它们的工作方式如下:

(1)位置变换RotWord():

把一个4字节的输入序列(a0,a1,a2,a3)循环左移一个字节后输出。

例如将(a0,a1,a2,a3)循环左移一个字节后输出为(a1,a2,a3,a0)。

(2)SubWord():

把一个4字节的输入序列(a0,a1,a2,a3)的每一个字节进行S盒变换,然后作为输出。

(3)变换Rcon[]:

Rcon[]是一个10个字节的常量数组,Rcon[i]是一个32比特字符串(xi-1,00,00,00)。

这里x=(02),xi-1是x=(02)的(i-1)次幂的十六进制表示,即x0=(01),x=(02),xi={02}·xi-1。

这里“·”表示有限域GF(28)中的乘法。

密钥扩展前Nk个字就是外部密钥CipherKey,以后的字w[i]等于它前一个字w[i-1]与前Nk个字w[i-Nk]的异或,w[i]=w[i-Nk]⊕SubWord(RotWord(w[i-1]))⊕Rcon[i/Nk]。

输入密钥扩展的整个过程可以用下面的程序段描述:

KeyExpansion(bytekey[4*NK],wordw[Nb*(Nr+1)],Nk)

begin

wordtemp

i=0

while(i

w[i]=word(key[4*i],]key[4*i+1],key[4*i+2],key[4*i+3]

i=i+1

endwhile

i=Nk

while(i

temp=w[i-1]

if(imodNk=0)

temp=Subword(Rotword(temp))xorRcon[i/Nk]

elseif(Nk>6andimodNk=4)

temp=Subword(temp)

endif

w[i]=w[i-Nk]xortemp

i=i+1

endwhile

end

2、AESIP核的体系结构设计方案

2.1AES模块框图及外部信号说明

图2AES模块框图

表1AES模块外部信号说明

信号名称

信号宽度

传输方向

信号含义

clk

1位

输入

时钟信号

rst

1位

输入

复位信号,1有效。

load

1位

输入

数据装载使能信号,用于控制输入明/密文、密钥、S盒配置数据等,1有效。

address

8位

输入

寄存器或RAM地址,用于表示明文/密文/密钥寄存器、S盒RAM单元。

keyexpen

1位

输入

密钥扩展使能信号,1有效。

keyexprdy

1位

输出

密钥扩展完成标识信号,1有效。

staenc

1位

输入

开始加密使能信号,1有效。

stadec

1位

输入

开始解密使能信号,1有效。

encdecrdy

1位

输出

加/解密运算完成标识信号,1有效。

din

16位

输入

输入数据总线,用于输入明/密文、密钥、配置数据等。

dout

16位

输出

输出数据总线,用于输出加/解密结果。

shift

1位

输入

结果移位输出使能信号,1有效。

有效时,每个时钟周期移位输出16位结果。

2.2AES模块体系结构

AES模块包括明/密文和密钥寄存器、密钥扩展、加/解密运算、控制等多个子模块,其系统结构图如下图所示。

图3AES模块系统结构图

每个子模块的功能如下:

1.明文/密文/密钥寄存器的功能:

在时钟信号clk的上升沿,若寄存器写使能信号write有效,则将输入数据总线din上的16位数据写入明文/密文/密钥寄存器的高16位,同时将寄存器原来的数据右移16位放入寄存器的低112位。

若寄存器写使能信号write无效,则寄存器保持原来的数据不变。

由此可见,1个128位的数据需要经过8个时钟周期,通过8次写操作才能装入寄存器。

2.密钥扩展模块的功能:

AES算法首先得到初始密钥K后,执行一个密钥扩展程序以产生所有的轮密钥。

密钥扩展共产生Nb(Nr+1)个32bit字,算法初始需要一个Nb个32bit字的集合,接着每个轮操作都需要Nb个32bit字的密钥数据。

3.加密/解密模块的功能:

实现AES加密和解密。

AES加密过程由一个初始密钥加(异或)变换和十个轮变换构成,其中除第10个轮变换外,每个轮变换都是一样的,都是由字节代替(S盒变换)、行移位、列混合、密钥加4个子变换组成,第10个轮变换由字节代替、行移位、密钥加3个子变换组成,不包括列混合变换。

通过类似分析,可以得出AES解密过程包括逆S盒变换、09乘字节、0b乘字节、0d乘字节、0e乘字节、异或共6种操作。

4.控制模块的功能:

用于控制密钥扩展过程的执行,控制加密过程的执行,控制解密过程的执行。

2.3密钥扩展子模块体系结构

1)密钥扩展模块的电路结构如下图所示:

 

2)密钥扩展模块的外部信号如下表所示:

信号名称

信号宽度

传输方向

信号含义

clk

1位

输入

时钟信号。

rst

1位

输入

复位信号,1有效。

有效时使轮常数产生模块输出第一个轮常数。

keysel

1位

输入

轮密钥选择信号,keysel=0选择密钥寄存器中的种子密钥,否则,选择经过密钥扩展变换的轮密钥。

rndkren

1位

输入

轮密钥寄存器写使能信号,1有效。

wrrndkrf

1位

输入

轮密钥寄存器堆写使能信号,1有效。

addr

4位

输入

轮密钥寄存器堆地址,表示11个轮密钥寄存器的地址。

rconen

1位

输入

轮常数寄存器写使能信号,1有效。

当有效时将下一个轮常数写入轮常数寄存器。

key

128位

输入

种子密钥,来自于密钥寄存器的输出。

rndkrfout

128位

输出

轮密钥寄存器堆的输出,为加解密模块提供需要的轮密钥。

密钥扩展模块由1个128位的轮密钥寄存器rndkreg、1个11*128的轮密钥寄存器堆rndkrf、1个轮常数产生模块rcon、1个字节代替模块subword、1个32位的循环左移移位器rotword、1个128位的二选一选通器MUX以及5个32位异或器构成。

3)其电路工作原理如下:

在进行密钥扩展之前,首先令复位信号rst=1,以便使轮常数产生模块输出第1个轮常数。

然后,在第1个时钟周期,通过选通器选择种子密钥key作为第1个子密钥,并在本周期结束时的时钟上升沿,将其同时保存到轮密钥寄存器rndkreg和轮密钥寄存器堆rndkrf。

在第2个时钟周期,对保存在轮密钥寄存器rndkreg中的第1个子密钥先后进行循环左移、字节代替变换、异或、选通操作得到第2个子密钥,并在本周期结束时的时钟上升沿,将其同时保存到轮密钥寄存器rndkreg和轮密钥寄存器堆rndkrf。

重复第2个时钟周期的操作10次,就可以得到AES第1-10轮迭代所需要的轮密钥。

这样,经过11个时钟周期之后,AES加密/解密所需的全部11个子密钥就都产生出来了,并且被保存在轮密钥寄存器堆rndkrf中。

4)各个子模块的功能以及各子模块之间的相互关系与信号连接为:

其中,循环左移运算实现对一个32位的数据循环左移8位,在电路实现时通过硬件连线即可实现,无须设计专门的移位电路。

字节代替变换由4个8*8S盒实现,S盒采用查表方式实现。

为了充分利用cycloneFPGA中的RAM资源,减少LE(逻辑单元)的使用数量,我们利用cycloneFPGA中的RAM构建了一个8*8的ROM作为S盒,该ROM共有256个的存储单元,每个存储单元存储一个字节,这256个字节就是实现S盒变换的查找表。

该ROM可以利用quartusII的megafunction工具自动生成,但需要注意的是该ROM的地址要经寄存器锁存以后才能进入ROM,因此在地址有效的下一个周期才能在ROM的输出端口得到读出的数据。

二选一选通器MUX用于选择外部输入的种子密钥或者内部逻辑产生的数据作为子密钥。

轮密钥寄存器rndkreg是1个128位的寄存器,用于暂时保存当前产生的子密钥,以便产生下一个子密钥时使用。

轮密钥寄存器堆rndkrf共有11个128位的存储单元,用于保存密钥扩展以后的全部11个子密钥,供AES加密/解密使用。

轮常数产生模块rcon由1个8位寄存器和轮常数产生逻辑构成,当复位时,寄存器输出第一个轮常数,当轮常数寄存器写使能信号rconen有效时,将由轮常数产生逻辑产生的下一个轮常数写入轮常数寄存器。

5)密钥扩展的程序描述:

KeyExpansion(bytekey[4*Nk],wordw[Nb*(Nr+1)],Nk)

begin

wordtemp

i=0

while(i

w[i]=word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])

i=i+1

endwhile

i=Nk

while(i

temp=w[i-1]

if(imodNk=0)

temp=Subword(Rotword(temp))xorRcon[i/Nk]

elseif(Nk>6andimodNk=4)

temp=Subword(temp)

endif

w[i]=w[i-Nk]xortemp

i=i+1

endwhile

end

2.4加密子模块体系结构

1)AES加密/解密模块的电路结构如下图所示

2)AES加密/解密模块的外部信号如下表所示:

信号名称

信号宽度

传输方向

信号含义

clk

1位

输入

时钟信号。

wrsben

1位

输入

向S盒写入配置数据的使能信号,1有效。

wrsbaddr

7位

输入

S盒配置数据的地址,一个S盒包含256个字节,一次写入16位,因此共需要写128次,需要128个地址,所以需要7位地址码。

sbdata

16位

输入

S盒配置数据。

keyadsel

2位

输入

密钥加操作输入数据选择信号,

mixsel

1位

输入

选择是否进行逆列混合变换,在进行第1-9轮解密变换时为1,其余时间为0。

reginsel

1位

输入

结果寄存器输入数据选择信号。

wrregen

1位

输入

结果寄存器写使能信号,1有效。

intxt

128位

输入

外部输入数据(明文或密文)。

roundkey

128位

输入

子密钥。

shift

1位

输入

结果寄存器移位使能信号,1有效,有效时将128位结果寄存器中的数据右移16位。

outtxt

16位

输出

输出数据(加密/解密结果)。

AES加密过程由一个初始密钥加(异或)变换和十个轮变换构成,其中除第10个轮变换外,每个轮变换都是一样的,都是由字节代替(S盒变换)、行移位、列混合、密钥加4个子变换组成,第10个轮变换由字节代替、行移位、密钥加3个子变换组成,不包括列混合变换。

类似分析,可以得出AES解密过程包括逆S盒变换、09乘字节、0b乘字节、0d乘字节、0e乘字节、异或共6种操作。

3)AES加密/解密模块的工作原理如下:

加密流程:

首先将S盒配置为加密S盒,即在使能信号wrsben和地址信号wrsbaddr的控制下,通过S盒配置数据端口sbdata将加密S盒配置数据写入16个S盒sbox0~sbox15。

然后实现初始密钥加变换,即在选择信号keyadsel的控制下,通过四选一选通器选择外部输入明文数据intxt,与初始子密钥roundkey进行异或操作,并在选择信号reginsel的控制下,通过二选一选通器将异或操作的结果e0~e15保存到S盒的输入寄存器。

接下来进行第一轮加密变换,即初始密钥加变换的结果经sbox0~sbox15完成S盒变换后,在选择信号mixsel的控制下,通过二选一选通器进入byte0203模块,完成02乘字节和03乘字节运算,然后进行(5)式中前4项的异或运算,得结果c0~c15,在选择信号keyadsel的控制下,通过四选一选通器选择c0~c15与第一轮子密钥进行异或操作,从而得到第一轮加密变换的结果e0~e15,并将其保存到S盒的输入寄存器,作为下一轮加密变换的输入数据。

依次类推,可以完成第1-9轮加密变换。

最后进行第10轮加密变换,即第9轮加密变换变换的结果经sbox0~sbox15完成S盒变换后,在选择信号keyadsel的控制下,通过四选一选通器选择恰当的S盒输出与第10轮子密钥进行异或操作,即可得到密文,最后将其保存到结果寄存器resultreg。

初始密钥加变换和每轮加密变换都在一个周期内完成,因此上述加密过程共需要11个时钟周期。

解密流程:

首先将S盒配置为解密S盒,配置过程与加密S盒配置过程一样,只是配置数据不同。

然后实现初始密钥加变换,即在选择信号keyadsel的控制下,通过四选一选通器选择外部输入密文数据intxt,与初始子密钥roundkey进行异或操作,并在选择信号reginsel的控制下,通过二选一选通器将异或操作的结果e0~e15保存到S盒的输入寄存器。

接下来进行第一轮解密变换,即初始密钥加变换的结果经sbox0~sbox15完成逆S盒变换后,再与第一轮子密钥进行异或操作,然后在选择信号mixsel的控制下,通过二选一选通器进入byte0203模块和byte9bde模块,完成进行逆列混合变换所需要的字节乘法运算(即09乘字节、0b乘字节、0d乘字节和0e乘字节),然后通过一系列异或运算得列混合变换的结果g0~g15,在选择信号reginsel的控制下,通过二选一选通器选择g0~g15输出,从而得到第一轮解密变换的结果h,并将其保存到S盒的输入寄存器,作为下一轮解密变换的输入数据。

依次类推,可以完成第1-9轮解密变换。

最后进行第10轮解密变换,即第9轮加密变换变换的结果经sbox0~sbox15完成逆S盒变换后,在选择信号keyadsel的控制下,通过四选一选通器选择恰当的S盒输出与第10轮子密钥进行异或操作,即可得到明文,最后将其保存到结果寄存器resultreg。

初始密钥加变换和每轮解密变换都在一个周期内完成,因此上述解密过程共需要11个时钟周期。

需要注意的是,解密过程使用的子密钥与加密过程使用的子密钥相同,但使用顺序恰好相反。

4)AES加密过程可用伪代码描述为:

Cipher(bytein[4*4],byteout[4*4],wordw[4*(Nr+1)])

Begin

Bytestate[4,4]

State=in

AddRoundKey(state,w[0,3])

Forround=1step1toNr-1

SubBytes(state)

ShiftRows(state)

MixColumns(state)

AddRoundKey(state,w[round*4,(round+1)*4-1])

Endfor

SubBytes(state)

ShiftRows(state)

AddRoundKey(state,w[Nr*4,(Nr+1)*4-1])

Out=state

End

5)AES解密过程是加密过程的逆过程,可用伪代码描述为:

InvCipher(bytein[4*4],byteout[4*4],wordw[4*(Nr+1)])

Begin

Bytestate[4,4]

State=in

AddRoundKey(state,w[Nr*4,(Nr+1)*4-1])

Forround=Nr-1step-1to1

InvShiftRows(state)

InvSubBytes(state)

AddRoun

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

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1