AES算法原理及实现

时间:2024.4.21

AES算法及实现

JW114043 丁晓娟

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

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

1.        引言:随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。经过三轮的筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为AES的最终算法。

2.        AES算法

2. 1  AES背景 

NIST对AES候选算法基本要求是:对称分组密码体制;密钥长度支持128,192,256位;明文分组长度128位;算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮征集、分析、测试、共产生了15个候选算法。1999年8月NIST公布了五种算法(MARS,RC6,Rijindael,Serpent,Twofish)成为候选算法。最后Rijndarl,这个由比利时人设计的算法与其它候选算法在成为高级加密标准(AES)的竞争中取得成功,于20##年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 

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 列变换  

                    

这里的?为按位异或运算,其中的乘法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算法加密解密原理及其编程实现


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???030xxxxxxxxxxxx0101??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

更多相关推荐:
算法实验报告

算法设计与分析实验报告班级姓名学号年月日目录实验一二分查找程序实现03页实验二棋盘覆盖问题分治法08页实验三01背包问题的动态规划算法设计11页实验四背包问题的贪心算法14页实验五最小重量机器设计问题回溯法17...

算法设计实验报告

算法设计课程报告课题名称算法设计与实现课题负责人名学号张樱紫0743111317同组成员名单角色无指导教师左劼评阅成绩评阅意见提交报告时间20xx年12月23日课程名称算法设计学生姓名张樱紫学生学号074311...

中南大学--算法实验报告

中南大学--算法实验报告,内容附图。

遗传算法实验报告

遗传算法实验报告姓名:**学号:**一、实验目的:熟悉和掌握遗传算法的运行机制和求解的基本方法。遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻…

算法设计实验报告

1hanoi塔packagesyyimportjavautilpublicclassHanoipublicstaticvoidmoveintnintaintbSystemoutprintlnquot把第quot...

算法实验报告

算法导论实验报告实验一快速排序1问题描述实现对数组的普通快速排序与随机快速排序2算法原理设要排序的数组是A0AN1首先选取一个数据普通快排选择的是最后一个元素随记快排是随机选择一个元素作为关键数据然后将所有比它...

算法分析与设计实验报告

排序问题求解实验日志实验题目排序问题求解实验目的1以排序分类问题为例掌握分治法的基本设计策略2熟练掌握一般插入排序算法的实现3熟练掌握快速排序算法的实现4理解常见的算法经验分析方法实验要求1生成实验数据要求编写...

算法实验报告

中南大学算法设计与分析实验报告学生姓名惠苗壮指导教师郑瑾专业班级计科0904班学号0909091627完成时间20xx年12月18日学院信息科学与工程学院目录一实验目的1二实验要求1三实验内容1四实验分析1五实...

页面置换算法的实验报告

操作系统课程设计报告院(系):衡阳师范学院专业:计算机科学与技术姓名:***班级:1103班学号:***题目:页面置换算法20XX年12月10日至12月28日摘要操作系统(英语;OperatingSystem,…

算法上机实验报告

算法分析与设计实验报告计算机与信息工程学院实验报告填写时间20xx124第1页共8页算法分析与设计实验报告计算机与信息工程学院第2页共8页算法分析与设计实验报告计算机与信息工程学院第3页共8页算法分析与设计实验...

计算机操作系统银行家算法实验报告

计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。…

算法综合性实验报告模板

综合性设计性实验报告姓名刘海香学号20xx08003107专业软件工程班级20xx级1班实验课程名称算法分析与设计指导教师及职称黎明讲师开课学期20xx至20xx学年下学期上课时间20xx年3月21日至20xx...

算法实验报告(32篇)