AES算法原理及实现(3200字)

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

AES算法及实现

JW114043 丁晓娟

摘要:对称密码算法根据对明文消息加密方式不同科分为两大类,即分组密码和流密码。 AES是美国国家标准技术研究所NIST旨在取代DES的新一代的加密标准。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍[2]。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。

关键字:AES、加密算法、解密算法、AES的实现

1. 引言:随着对称密码的发展,DES数据加密标准算法由于密钥长度较小

(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此19xx年NIST公开征集新的数据加密标准,即AES[1]。经过三轮的筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为AES的最终算法。

2. AES算法

2. 1 AES背景

NIST对AES候选算法基本要求是:对称分组密码体制;密钥长度支持128,192,256位;明文分组长度128位;算法应易于各种硬件和软件实现。19xx年NIST开始AES第一轮征集、分析、测试、共产生了15个候选算法。19xx年8月NIST公布了五种算法(MARS,RC6,Rijindael,Serpent,Twofish)成为候选算法。最后Rijndarl,这个由比利时人设计的算法与其它候选算法在成为高级加密标准(AES)的竞争中取得成功,于20xx年10月被NIST宣布成为取代DES的新一代的数据加密标准即AES。尽管人们对AES还有不同的看法,但总体来说Rijndael作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256 比特,相对而言,AES的128比特密钥比DES的56比特密

钥强1021

倍。

2.2 AES加密、解密算法原理概述

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

(1)密钥

密钥(Key)是密码算法中参与运算的数值(或者数值集)。对报文进行加密,我们需要一个加密算法、一个加密密钥以及明文,并由此产生密文。对报文进行解密,我们需要一个解密算法、一个解密密钥以及密文,并由此复原原始的明文。

(2)加密变换

AES的加密和解密

* 加密变换

设X施AES的128比特明文输入,Y是128比特的密文输出,则AES的密文Y可以用下面的复合变换表示:Y=A k(r+1) R S Akr C R S A k(r1)?? C R S Ak1(X) 其中“”表示复合运算。这里Ak1 表示对X的一个变换Aki (X)=X ?KI(KI为第i轮的子密钥,为比特串的异或运算)。S:S盒置换。即对每一个字节用S-Box做一个置换。S-Box是一个给定的转换表。R:行置换。C:列置换。S’(x)=a(x)S(X) 这里是特殊的乘法运算,将在下面仔细介绍。

(2)解密变换

解密变换是加密变换的逆转换。

2.3 AES加密/解密算法的实现 :

2.3.1 分组加密

表1是三种不同类型的AES加密密钥组大小与相应的加密轮数对照表。 加密开始时,输入分组的各字节按表2的方式装入一个矩阵State中。如输入ACBDEFGHIJKLMONE则输入块影射到如表2的状态矩阵State中。 AES类型 密钥长度 分组大小 加密轮数 A E I M AES-128 4字节 4字 10 B F J O AES192 6字节

4字

12

C

G

K

N

AES256 8字节 4字 14 D H L E

2.3.1.1 S盒变换(Subyte)

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

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

(2)从AES算法给定的S-Box(16行16列其中每个元素为一个字节具体的S-Box略)中找出S[A]=S[x,y]的值。如A=11010100时,S[A]=S[x,y]=S[c,4]={1c}=00011101 。或直接通过下面的公式将A=b7b6b5b4b3b2b1b0变为S[A]=b ’7b’6b’5b’4b’3b’2b’1b’0b’=b′这里c=(c0,c1,c2,c3,c4,c5,c6,c7)=(0,1,1,0,0,0,1,1)。

2.3.1.2行变换(ShiftRows)

在行变换中,中间状态矩阵State的第一行不变;第二至四行做如下变换,即将

表3的状态矩阵变为表四的状态矩阵。 BAIDU_CLB_fillSlot( '920970' );

2.3.1.3 列变换

AES算法原理及实现

这里的?为按位异或运算,其中的乘法X 按照下面介绍的模乘同余规则进行计算 列变换中药用到的模乘同余规则和我们一般用到的乘法有些不同,由于每一个元素都是一个字节于是可以把字节看成一个形式上的七次多项式,即将b7b6b5b4b3b2b1b0视为b7X7

+b6X6+b5X5+b4X4+b3X3+b2X2+b1X+b0 如{11011001}2 ={d9} 16可以被看成是X7+X6+X4+X3+1.列变换希望把一个字节变为一个新的字节,所以需要把两个形式上的的七次多项的乘法结果变为一个新形式上去七次多项式,然后才能将其恢复为一个字节的长度。这里采用模一个八次不可约多项式的同余乘法,即将两七次多项式的乘法结果除以这个八次不可约多项式再取其余式。在AES中这个八次不可约多项式为

m(X)=X8+X4+X3+X+1。

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

扩展密钥只参与了这一个变换。根据加密的轮数用相应的扩展密钥的四个数据项和中间状态矩阵上的列进行按位异或。

2.3.2密钥扩展程序KeyExpansion

AES算法利用外部输入密钥K(密钥串的字数为Nk)通过密钥扩展程序得到共4(Nr+1)字的扩展密钥w[4X(Nr+1)]涉及如下三个模块;

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

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

(3)变换Rcon[].Rcon[i] 表示32比特字符串[xi-1,00,00,00]。这里X=(02),,xi-1 是X=

(02)的(i-1)次幂的十六进制表示。

(4)扩展密钥生成。扩展的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的异或,即W[[i -1]]XORw[[i -Nk]]。

但是若i为Nk的倍数W[i]=W[i -Nk]XORSubWord(RotWord(w[[i -1]]))XORRcon[i/Nk] ,则


第二篇:AES算法加密解密原理及其编程实现 6000字

AES算法加密解密原理及其编程实现

张敏瑞1 苏初旭1,2 李寒2

(1. 西安科技大学通信与信息工程学院 陕西 西安 710054; 2. 陕西威蓝工业自动化有限公司 陕西 西安 710072)

摘要:AES(Advanced Encryption Standard)是美国高级加密标准算法,将在未来几十年里代替DES(Data Encryption Standard)在各个领域中的应用。本文在研究分析AES加密解密算法原理的基础上,着重介绍了加密解密整个过程。最后说明了AES算法的部分核心代码,并利用VC++集成开发环境完整地实现AES加密和解密。

关键词:AES;DES;加密;VC++

中图分类号:TP309 文献标识码:A

the encryption and decryption of AES algorithm and it’s

implementation

ZHANG Minrui1 SU Chuxu1,2 Li Han2

(1. college of communication and information engineering, xi’an university of science and technology, xi’an shaanxi, 710054; 2. Shaanxi Westland Industial Automation Limited Company, xi’an shaanxi,710072)

Abstract: AES is advanced encryption standard algorithm in the United States, it will substitute for DES in various fields in the coming decades. Based on the study of principle of AES, the whole encryption and decryption process is introduced in detail. Finally illustrated part of the core code of AES algorithm, and realized AES encryption and decryption in VC + + integrated development environment. Key words: AES;DES; encryption;VC++

1 引言

随着密码分析水平、芯片处理能力和计算技术的不断进步,以前广泛使用的DES数据加密标准算法由于密钥长度较小(56位),已经难以适应新的安全需要,其实现速度、代码大小和跨平台性均难以继续满足新的应用要求。在这种形势下,迫切需要设计一种强有力的算法作为新的一代分组加密标准,因此19xx年美国 1

国家标准技术研究院(NIST,National Institute of Standards and Technology)公开征集新的数据加密标准,即AES。该算法作为新一代的数据加密标准汇聚了安全性、效率、密钥灵活性、多样性、简单性和对称性等优点[1]。

2 AES算法加密解密原理

AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥长度,并且用128位分组长度加密和解密数据[2]。该算法输入分组、输出分组、状态长度均为128比特。

对于AES算法的运算是在一个称为状态的二维字节数组上进行。一个状态由四行组成,每一行包括Nb个字节,Nb等于分组长度除以32,AES分组长度为128位,因此,Nb=4,该值反应了状态中32-bit字的个数(列数);密钥长度128、192和256位可分别表示为Nk=4、6或8,反应了密钥中32-bit字的个数(列数)。而AES算法的轮数Nr仅依赖于密钥长度Nk,轮数和密钥长度的关系可以表示为:Nr=6+Nk。密钥长度—分组长度—轮数的关系如表1所示。

表1 Key-Block-Round关系

AES算法加密解密原理及其编程实现

对于加密和解密变换,AES算法使用的轮函数由4个不同的以字节为基本单位的变换复合而成,该过程由四个不同的阶段组成[3]:

(1)S盒变换,用一个S盒完成分组中的按字节代替;(2)行移位变换,一个简单的置换;(3)列混淆变换,一个利用在域GF(28) 上的算术性的代替;(4)轮密钥加变换,一个利用当前分组和扩展密钥的一个部分进行按位异或。

AES对数据的加密过程是通过把输入的明文和密钥由轮函数经Nr轮迭代来实现的,结尾轮与前Nr-1轮不同。前Nr-1轮依次进行S盒变换、行移位变换、列混淆变换和轮密钥加变换;结尾轮与前Nr-1轮相比去掉了列混淆变换。

而解密过程与加密过程相反,通过把输入的密文和密钥由轮函数经Nr轮迭代来实现的,结尾轮与前Nr-1轮不同。前Nr-1轮依次进行逆行移位变换、逆S 2

盒变换、轮密钥加变换和逆列混淆变换;结尾轮与前Nr-1轮相比去掉了逆列混淆变换。

AES算法的加密解密过程如图1所示:

AES算法加密解密原理及其编程实现

AES算法加密解密原理及其编程实现

AES算法加密解密原理及其编程实现

图1 AES加密解密流程

3

2.1 加密过程基本变换

(1) S盒变换

S盒变换是一个基于S盒的非线性置换,它用于输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是:把输入字节的高4位作为S盒的行值,低4位作为列值,然后取出S盒中对应行和列的元素作为输出。例如,输入为“89”(十六进制)的值所对应的S盒的行值为“8”,列值为“9”,S盒中相应位置的值为“a7”,就说明“89”被映射为“87”。

(2) 列混淆变换

列混淆变换实现逐列混淆,其方法是:

s'(x)?c(x)?s(x)mod(x4?1)

其中,c(x)?{03}?x3?{01}?x2?{01}?x?{02},{x}内的数表示是字节。 用矩阵表示为

'?s0,??02c?'???s1,c???01

'??s2,?01c?'????s3,c???03030201010103020101??s0,c??s?01???1,c? 03??s2,c????02??s3,c?

(3) 行移位变换

行移位变换完成基于行的循环移位操作,即行移位变换的作用在中间态的行上,第0行不动,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。

(4) 轮密钥加变换

轮密钥加变换用于将输入或中间态S的每一列与一个密钥字W[i]进行按位异或,其中,W[i](i?0,1,???,4(Nr?1)?1)由原始密钥通过密钥扩展算法产生。

2.2 解密过程基本变换

解密过程是加密的逆过程,S盒变换、行移位变换、列混淆变换都要进行求逆变换,即逆S盒变换、逆行移位变换、逆列混淆变换。而轮密钥加变换与加密过程相同。

(1) 逆S盒变换

与S盒变换类似,逆S盒变换是基于逆S盒实现的。

4

(2) 逆行移位变换

与行移位变换相反,逆行移位变换将态State的后三行按相反的方向进行移位操作,即第0行保持不变,第1行向右移1个字节,第2行向右移2个字节,第3行向右移3个字节。

(3) 逆列混淆变换

逆列混淆变换的处理方法与列混淆变换类似,每一列都通过与一个固定的多项相乘进行变换。

写为矩阵乘法的形式,逆列混淆变换按以下方式对列进行变换:

'?s0,??0E0B0D09??s0,c?c?'????s?s090E0B0D1,c??????1,c? '??s2,?0D090E0B??s2,c?c?'?????s0B0D090E????s3,c??3,c??

2.3 密钥扩展算法

AES加密解密过程中,每一轮都需要一个与输入分组具有相同长度的扩展密钥W[i]的参与。由于外部输入的加密密钥长度有限,所以在算法中要用一个密钥扩展程序把外部密钥扩展成更长的比特串,以生成各轮的加密和解密密钥。

通过生成器产生Nr+1轮轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字W[i],i=0,1,??,Nb(Nr+1)-1。

3 AES算法编程实现

AES加密解密过程主要函数有:

Cipher(); //加密函数

InvCipher (); //解密函数

AddRoundKey(); //轮密钥加变换函数

SubBytes(); //S盒变换函数

InvSubBytes(); //逆S盒变换函数

ShiftRows(); //行移位变换函数

InvShiftRows(); //逆行移位变换函数

MixColumns(); //列混淆变换函数

InvMixColumns(); //逆列混淆变换函数

部分源程序代码如下:

5

//加密函数

Cipher(unsigned char* input, unsigned char* output)

{

memset(&State[0][0],0,16); //先给状态初始值赋0 for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的

{ //如果输入换成先写行后写列也是可以的,只要在

State[i%4][i/4]=input[i]; //输出时也这样就可以了 } AddRoundKey(0); //起始时轮密钥加变换 for (int round = 1; round <= (Nr - 1); round++) //前(Nr-1)轮 {

//S盒变换 //行移位变换 //列混淆变换 SubBytes(); ShiftRows(); MixColumns();

AddRoundKey(round); //轮密钥加变换

}

//最后一轮没有列混淆变换

SubBytes(); ShiftRows(); //S盒变换 //行移位变换 //轮密钥加变换 AddRoundKey(Nr); for (i = 0; i < (4 * Nb); i++) //这里的输出是一列一列的,与输入时按列 { //输入格式相同

output[i] = State[i % 4][ i / 4];//加密后的输出

}

///////////////////////////////////////////////////////////////////////////////////////////////////////

//解密函数

InvCipher(unsigned char* input, unsigned char* output)

{ }

6

memset(&State[0][0],0,16); //先给状态初始值赋0

for (int i = 0; i < (4 * Nb); i++) //这里是先写列后写行的,即输入是一列一列的 {

}

AddRoundKey(Nr); //轮密钥加变换

for (int round = Nr-1; round >= 1; round--) //前(Nr-1)轮

{

InvShiftRows(); //逆行位移变换

InvSubBytes(); //逆S盒变换

AddRoundKey(round); //轮密钥加变换

InvMixColumns(); //逆列混淆变换

} State[i % 4][ i / 4] = input[i];

//最后一轮没有逆列混淆变换

InvShiftRows(); //逆行移位变换 InvSubBytes(); //逆S盒变换 AddRoundKey(0); //轮密钥加变换 for (i = 0; i < (4 * Nb); i++) //这里的输出是一列一列的,与输入时按列 { //输入格式相同

output[i] = State[i % 4][ i / 4]; //解密后的输出

}

AES算法加密解密举例:

源字符串:西安科技大学

加密密钥:suchuxuworksatshaanxiwestlandcompany

密钥长度:128bit

加密结果:a760ca6eddffae49fb16420e9b1d97b1

解密结果:西安科技大学

AES算法加密解密界面如图2所示: }

7

图2 AES加密解密界面

4 结束语

通过AES算法加密解密原理的分析,该加密解密算法具有安全性、效率、密钥灵活性、多样性、简单性和对称性等优点,本文基于VC++集成开发环境以高速计算性能实现了AES加密解密。对于当今快速的密码破解工具,AES算法能够抵抗各类攻击,起到很好的防护作用,因此,今后将逐步代替DES而在加密解密领域中得到广泛应用。

参考文献

[1] Joan Daemen, Vincent Rijmen著,谷大武,徐胜波译.高级加密标准(AES)算法

—Rijndael的设计[M].北京:清华大学出版社,2003.3:65-72.

[2] Hyubgun Lee, Kyounghwa Lee, Yongtae Shin. AES Implementation and

Performance Evaluation on 8-bit Microcontrollers[J]. International Journal of Computer Science and Information Security, Vol.6,No.1,2009.

[3] 胡向东,魏琴芳著.应用密码学教程[M].北京:电子工业出版社,2005.1:78-94.

AES算法加密解密原理及其编程实现

8

更多类似范文
┣ 更多算法实验报告
┗ 搜索类似范文