信息安全工程课程实验报告AES加密解密的实现课程名称:信息安全工程学生姓名:***学生学号: **********专业班级:系统工程2038班任课教师:***2012年11月22日目录1.背景 (1)1.1 Rijndael密码的设计标准: (1)1.2 设计思想 (1)2.系统设计 (2)2.1系统主要目标 (2)2.2功能模块与系统结构 (2)2.2.1字节替换SubByte (2)2.2.2行移位ShiftRow (2)2.2.3 列混合MixColumn (3)2.2.4 轮密钥加AddRoundKey (4)2.2.5 逆字节替换 (4)2.2.6逆行移位InvShiftRow (4)2.2.7 逆列混淆 (4)3 加密模式 (5)3.1 电子密码本ECB模式 (5)3.2加密块链模式CBC模式 (6)4 系统功能程序设计 (8)4.1基本加密部分 (8)4.1.1字节替换 (8)4.1.2行移位 (8)4.1.3列混合 (9)4.1.4轮密钥加 (9)4.1.5密钥扩展 (10)4.1.6逆字节替换 (11)4.1.7逆行移位 (11)4.1.8逆列混合 (12)4.1.9加密 (12)4.1.10解密 (13)5 实验结果 (14)5.1 需要加密文件 (14)5.2 实验加密解密结果 (15)6 参考资料 (16)1.背景AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。
Rijndael算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。
该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。
(Rijdael的发音近于"Rhine doll"。
)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。
作为一个新的加密标准,目前正被部署应用到更广大的范围.1.1 Rijndael密码的设计标准:①抵抗所有已知的攻击。
②在多个平台上速度快,编码紧凑。
③设计简单。
➢当前的大多数分组密码,其轮函数是Feistel结构。
➢Rijndael没有这种结构。
➢Rijndael轮函数是由3个不同的可逆均匀变换1.2 设计思想⏹分组和密钥长度可变,各自可独立指定为128、192、256比特。
⏹状态⏹算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数N b为分组长度除32⏹种子密钥⏹以字节为元素的矩阵阵列描述,阵列为4行,列数N k为密钥长度除322.系统设计2.1系统主要目标基本要求部分:1. 在深入理解AES 加密/解密算法理论的基础上,设计一个AES 加密/解密软件系统; 2. 完成CBC 和ECB 模式加密解密2.2功能模块与系统结构主要功能模块如下:2.2.1字节替换SubByte非线性代换是可逆的,由以下两个变换的合成得到:① 首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元,‘00’映射到自己。
② 其次,对字节做如下仿射变换:0011223344556677100011111110001111111000110111100010111110000011111001001111101000111110y x y x y x y x y x y x y x y x ⎛⎫⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪ ⎪⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ =+ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭⎝⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪图 1 字节代换示意图2.2.2行移位ShiftRow将状态阵列的各行进行循环移位,移位量与分组长度的关系0行:不动N b C1 C2 C3 4 1 2 3 6 1 2 3 8134图2 行移位示意图2.2.3 列混合MixColumn图3 列混合示意图状态阵列的每个列a(x)与一个固定的多项式c(x)进行模x 4+1乘法后混淆为b(x).记为c(x)是模x 4+1可逆的多项式‘03’x 3+‘01’x 2+‘01’x+‘02’ 逆d(x)=‘0B’x 3+‘0D’x 2+‘09’x+‘0E’0011223302030101010203010101020303010102b a b a b a b a ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪ ⎪ ⎪⎪= ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭2.2.4 轮密钥加AddRoundKey图4 轮密钥加示意图密钥加:轮密钥与状态进行逐比特异或。
轮密钥长度等于分组长度N b。
密钥加运算的逆运算是其自身。
2.2.5 逆字节替换通过逆S盒的映射变换得到2.2.6逆行移位InvShiftRow图5 逆行移位示意图与加密时的行移位区别在于移位方向相反。
2.2.7 逆列混淆图6 逆列混合示意图加密与解密系统流程图如下所示,读进明文读进密钥(1)产生轮子密钥(2)AddRoundKey变换(3)轮变换Round(State,RoundKey) {ByteSub(State);ShiftRow(State);MixColumn(State);AddRoundKey(State,RoundKey);}(4)最后轮变换FinalRound(State,RoundKey){ByteSub(State)ShiftRow(State)AddRoundKey(State,RoundKey);}密文1rN图7 加密解密流程图3 加密模式3.1 电子密码本ECB模式ECB模式是最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;然后每组都用相同的密钥加密, 比如DES算法, 如果最后一个分组长度不够64位,要补齐64位;定义:Enc(X,Y)是加密函数Dec(X,Y)是解密函数Key是加密密钥;Pi ( i = 0,1…n)是明文块,大小为64bit;Ci ( i = 0,1…n)是密文块,大小为64bit;ECB加密算法可表示为:Ci = Enc(Key, Pi)ECB解密算法可以表示为:Pi = Dec(Key,Ci)算法特点:•每次Key、明文、密文的长度都必须是64位;•数据块重复排序不需要检测;•相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;•一个错误仅仅会对一个密文块产生影响;图8 电子密码本ECB模式3.2加密块链模式CBC模式CBC 与ECB模式最大的不同是加入了初始向量定义:Enc(X,Y)是加密函数Dec(X,Y)是解密函数Key是加密密钥;Pi ( i = 0,1…n)是明文块,大小为64bit;Ci ( i = 0,1…n)是密文块,大小为64bit;XOR(X,Y)是异或运算;IV是初始向量(一般为64位);ECB加密算法可表示为:C0 = Enc(Key, XOR(IV, P0)Ci = Enc(Key, XOR(Ci-1, Pi)ECB解密算法可以表示为:P0 = XOR(IV, Dec(Key, C0))Pi = XOR(Ci-1, Dec(Key,Ci))算法特点:每次加密的密文长度为64位(8个字节);当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;密文块要依赖以前的操作结果,所以,密文块不能进行重新排列;可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击; 一个错误发生以后,当前和以后的密文都会被影响;图9 加密块链模式CBC模式4 系统功能程序设计4.1基本加密部分4.1.1字节替换SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。
映射方法是把输入字节的高四位作为S 盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。
Aes::SubBytes(){for (int r = 0; r < 4; ++r){for (int c = 0; c < 4; ++c){State[r,c] = Sbox[ ( State[r,c] >> 4), ( State[r,c] & 0x0f) ];}}} // SubBytes4.1.2行移位ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。
Aes::ShiftRows(){byte[,] temp = new byte[4,4];for (int r = 0; r < 4; ++r) // copy State into temp[]{for (int c = 0; c < 4; ++c){temp[r,c] = State[r,c];}}for (int r = 1; r < 4; ++r) // shift temp into State{for (int c = 0; c < 4; ++c){State[r,c] = temp[ r, (c + r) % Nb ];}}} // ShiftRows()4.1.3列混合MixColumns()实现逐列混合,方法是s’(x)=c(x)*s(x)mod(x^4+1)Aes::MixColumns(){byte[,] temp = new byte[4,4];for (int r = 0; r < 4; ++r) // copy State into temp[]{for (int c = 0; c < 4; ++c){temp[r,c] = State[r,c];}}for (int c = 0; c < 4; ++c){State[0,c] = (byte) ( (int)gfmultby02(temp[0,c]) ^(int)gfmultby03(temp[1,c]) ^(int)gfmultby01(temp[2,c]) ^ (int)gfmultby01(temp[3,c]) );State[1,c] = (byte) ( (int)gfmultby01(temp[0,c]) ^(int)gfmultby02(temp[1,c]) ^(int)gfmultby03(temp[2,c]) ^ (int)gfmultby01(temp[3,c]) );State[2,c] = (byte) ( (int)gfmultby01(temp[0,c]) ^(int)gfmultby01(temp[1,c]) ^(int)gfmultby02(temp[2,c]) ^ (int)gfmultby03(temp[3,c]) );State[3,c] = (byte) ( (int)gfmultby03(temp[0,c]) ^(int)gfmultby01(temp[1,c]) ^(int)gfmultby01(temp[2,c]) ^ (int)gfmultby02(temp[3,c]) );}} // MixColumns4.1.4轮密钥加AddRoundKey ()用于将输入或中间态S的每一列与一个密钥字ki进行按位异或,每一个轮密钥由Nb个字组成。