内容发布更新时间 : 2024/12/31 5:46:19星期一 下面是文章的全部内容请认真阅读。
华北电力大学
实 验 报 告
现代密码学课程设计 课程名称 现代密码学
专业班级: 学生姓名: 学 号: 成 绩:
指导教师: 实验日期:
| |
实验名称
| |
[综合实验一] AES-128加密算法实现 一、实验目的及要求
(1)用C++实现;
(2)具有16字节的加密演示;
(3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB.
二、所用仪器、设备
计算机、Visual C++软件。
三. 实验原理
3.1、设计综述
AES中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。State可以用4×4的矩阵表示。AES算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。AES算法的主循环State矩阵执行Nr?1轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey,(由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。最后执行只包括 3个阶段 (省略 MixColumns变换)的最后一轮运算。
表2 AES参数
密钥长度(bits) 明文分组长度(bits) 轮数 每轮密钥长度(bits) 扩展密钥长度(bytes) 128 128 10 128 176 192 128 12 128 206 256 128 14 128 240 基本要求按标准分组,以128比特为分组大小。所以轮数为10轮,密钥长度也为128比特。
3.2、字节代替(SubBytes)
AES定义了一个S盒,State中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S盒中对应行和列的元素作为输出。例如,十六进制数{84}。对应S盒的行是8列是4,S盒中该位置对应的值是{5F}。
S盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。S盒按照以下方式构造:
(1) 逐行按照升序排列的字节值初始化S盒。第一行是{00},{01},{02},…,{OF};
第二行是{10},{l1},…,{1F}等。在行X和列Y的字节值是{xy}。
(2) 把S盒中的每个字节映射为它在有限域GF(2k)中的逆。GF代表伽罗瓦域,GF(28)
由一组从0x00到0xff的256个值组成,加上加法和乘法。
GF(28)?Z2[X]。{00}被映射为它自身{00}。
(x8?x4?x3?x?1)(3) 把S盒中的每个字节记成(b8,b7,b6,b5,b4,b3,b2,b1,b0)。对S盒中每个字节的每位
做如下变换:
bi??bi?b(i?4)mod8?b(i?5)mod8?b(i?6)mod8?b(i?7)mod8?ci
上式中ci是指值为{63}字节C第i位,即(c8,c7,c6,c5,c4,c3,c2,c1,c0)?(01100011)。符号(')表示更新后的变量的值。AES用以下的矩阵方式描述了这个变换:
?b0??1?b??1?1???b2??1????b3???1?b4??1????b5??0?b??0?6????0?b7???
最后完成的效果如图:
0001111??b0??1??b??1?1000111???1???1100011??b2??0??????1110001??b3??0??
1111000??b4??0??????1111100??b5??1?0111110??b6??1??????0011111????0???b7???