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

  • 格式:pdf
  • 大小:441.21 KB
  • 文档页数:8

for (int round = 1; round <= (Nr - 1); round++) //前(Nr-1)轮 { SubBytes(); ShiftRows(); MixColumns(); //S 盒变换 //行移位变换 //列混淆变换
ห้องสมุดไป่ตู้
AddRoundKey(round); //轮密钥加变换 } //最后一轮没有列混淆变换 SubBytes(); ShiftRows(); AddRoundKey(Nr); for (i = 0; i < (4 * Nb); i++) { //S 盒变换 //行移位变换 //轮密钥加变换 //这里的输出是一列一列的,与输入时按列 //输入格式相同 output[i] = State[i % 4][ i / 4];//加密后的输出 } } /////////////////////////////////////////////////////////////////////////////////////////////////////// //解密函数 InvCipher(unsigned char* input, unsigned char* output) {
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++
4
(2) 逆行移位变换 与行移位变换相反,逆行移位变换将态 State 的后三行按相反的方向进行移 位操作,即第 0 行保持不变,第 1 行向右移 1 个字节,第 2 行向右移 2 个字节, 第 3 行向右移 3 个字节。 (3) 逆列混淆变换 逆列混淆变换的处理方法与列混淆变换类似, 每一列都通过与一个固定的多 项相乘进行变换。 写为矩阵乘法的形式,逆列混淆变换按以下方式对列进行变换:
AES 算法加密解密原理及其编程实现
张敏瑞 1 苏初旭 1,2 李寒 2 (1. 西安科技大学通信与信息工程学院 自动化有限公司 陕西 西安 710072) 陕西 西安 710054; 2. 陕西威蓝工业
摘要: AES(Advanced Encryption Standard)是美国高级加密标准算法,将在未来 几十年里代替 DES(Data Encryption Standard)在各个领域中的应用。本文在研究 分析 AES 加密解密算法原理的基础上,着重介绍了加密解密整个过程。最后说 明了 AES 算法的部分核心代码,并利用 VC++集成开发环境完整地实现 AES 加 密和解密。 关键词:AES;DES;加密;VC++ 中图分类号:TP309 文献标识码:A
' s0, 0E 0B 0D 09 s0,c c ' s1,c 09 0E 0B 0D s1,c ' s2, 0D 09 0E 0B s2,c c ' s3,c 0B 0D 09 0E s3,c
2
盒变换、轮密钥加变换和逆列混淆变换;结尾轮与前 Nr-1 轮相比去掉了逆列混 淆变换。 AES 算法的加密解密过程如图 1 所示:
图 1 AES 加密解密流程
3
2.1 加密过程基本变换 (1) S 盒变换 S 盒变换是一个基于 S 盒的非线性置换, 它用于输入或中间态的每一个字节 通过一个简单的查表操作,将其映射为另一个字节。映射方法是:把输入字节的 高 4 位作为 S 盒的行值,低 4 位作为列值,然后取出 S 盒中对应行和列的元素 作为输出。例如,输入为“89”(十六进制)的值所对应的 S 盒的行值为“8” ,列 值为“9” ,S 盒中相应位置的值为“a7” ,就说明“89”被映射为“87” 。 (2) 列混淆变换 列混淆变换实现逐列混淆,其方法是:
5
//加密函数 //解密函数 //轮密钥加变换函数 //S 盒变换函数 //逆 S 盒变换函数 //行移位变换函数 //逆行移位变换函数 //列混淆变换函数 //逆列混淆变换函数
//加密函数 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); //起始时轮密钥加变换
6
memset(&State[0][0],0,16); //先给状态初始值赋 0 for (int i = 0; i < (4 * Nb); i++) //这里是先写列后写行的,即输入是一列一列的 { State[i % 4][ i / 4] = input[i]; } AddRoundKey(Nr); //轮密钥加变换
03 01 01 s0,c s 02 03 01 1,c 01 02 03 s2,c 01 01 02 s3,c
(3) 行移位变换 行移位变换完成基于行的循环移位操作, 即行移位变换的作用在中间态的行 上,第 0 行不动,第 1 行循环左移 1 个字节,第 2 行循环左移 2 个字节,第 3 行循环左移 3 个字节。 (4) 轮密钥加变换 轮密钥加变换用于将输入或中间态 S 的每一列与一个密钥字 W[i]进行按位 异或,其中, W [i ](i 0,1, , 4( N r 1) 1) 由原始密钥通过密钥扩展算法产生。 2.2 解密过程基本变换 解密过程是加密的逆过程,S 盒变换、行移位变换、列混淆变换都要进行求 逆变换,即逆 S 盒变换、逆行移位变换、逆列混淆变换。而轮密钥加变换与加密 过程相同。 (1) 逆 S 盒变换 与 S 盒变换类似,逆 S 盒变换是基于逆 S 盒实现的。
for (int round = Nr-1; round >= 1; round--) //前(Nr-1)轮 { InvShiftRows(); InvSubBytes(); AddRoundKey(round); InvMixColumns(); } //最后一轮没有逆列混淆变换 InvShiftRows(); InvSubBytes(); AddRoundKey(0); //逆行移位变换 //逆 S 盒变换 //轮密钥加变换 //逆行位移变换 //逆 S 盒变换 //轮密钥加变换 //逆列混淆变换
s ' ( x ) c ( x ) s ( x ) mod( x 4 1)
其中, c( x) {03} x 3 {01} x 2 {01} x {02} ,{x}内的数表示是字节。 用矩阵表示为
' s0, 02 c ' s1,c 01 ' s2, 01 c ' s3,c 03
2.3 密钥扩展算法 AES 加密解密过程中,每一轮都需要一个与输入分组具有相同长度的扩展 密钥 W[i]的参与。由于外部输入的加密密钥长度有限,所以在算法中要用一个密 钥扩展程序把外部密钥扩展成更长的比特串,以生成各轮的加密和解密密钥。 通过生成器产生 Nr+1 轮轮密钥, 每个轮密钥由 Nb 个字组成, 共有 Nb(Nr+1) 个字 W[i],i=0,1,……,Nb(Nr+1)-1。
表1 Key-Block-Round 关系
密钥长度 (Nk words) 4 6 8
分组长度 (Nb words) 4 4 4
轮数 (Nr) 10 12 14
对于加密和解密变换,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