AES算法实验报告
- 格式:doc
- 大小:208.00 KB
- 文档页数:7
aes实验报告AES实验报告引言:AES(Advanced Encryption Standard)是一种对称加密算法,被广泛应用于保护敏感数据的安全传输和存储。
本实验旨在探究AES算法的原理和应用,并通过实验验证其加密和解密的效果。
一、AES算法的原理AES算法是一种分组密码算法,将明文分成固定长度的数据块,并通过一系列的加密和解密操作来保护数据的机密性。
AES算法的核心是轮函数,它通过一系列的轮变换来对数据进行加密和解密。
二、实验准备1. 实验环境搭建:在计算机上安装支持AES算法的编程环境,如Python或Java。
2. 实验材料准备:准备一些测试用的明文和密钥,以及相应的加密和解密结果。
三、AES算法的加密过程1. 密钥扩展:AES算法需要对输入的密钥进行扩展,生成一系列的轮密钥。
这些轮密钥用于后续的加密和解密操作。
2. 初始轮:将明文与第一轮密钥进行异或运算。
3. 轮变换:AES算法中的轮变换包括字节代换、行移位、列混淆和轮密钥加。
这些变换操作按照一定的顺序进行,每一轮都会产生一个新的加密结果。
4. 最终轮:在最后一轮中,省略列混淆操作,并将结果与最后一轮密钥进行异或运算。
四、实验步骤1. 选择一组明文和密钥作为输入数据。
2. 使用AES算法对明文进行加密,得到密文。
3. 使用相同的密钥对密文进行解密,得到还原的明文。
4. 比较还原的明文与原始明文是否一致,验证AES算法的正确性。
五、实验结果与分析在实验中,我们选择了一组明文和密钥进行加密和解密操作。
经过实验,我们成功地得到了相应的密文和还原的明文,并与原始明文进行了比较。
结果显示,还原的明文与原始明文完全一致,证明了AES算法的正确性和可靠性。
六、AES算法的应用AES算法在现代密码学中被广泛应用于数据的加密和解密过程。
它可以用于保护敏感数据的安全传输和存储,如网络通信、文件加密和数据库加密等领域。
AES算法具有高度的安全性和可靠性,被认为是目前最强大的对称加密算法之一。
实验报告学号:姓名:专业:班级:第 10 周static void SubBytes(unsigned char p[16]);static void inSubBytes(unsigned char p[16]);static void ShiftRows(unsigned char e[]);static void inShiftRows(unsigned char e[]);static void MatrixToByte(unsigned char e[]);static void inMatrixToByte(unsigned char e[]);static unsigned char FFmul(unsigned char a, unsigned char b);static void KeyAdding(unsigned char state[16], unsigned char k[][4]);static void KeyExpansion(unsigned char* key, unsigned char w[][4][4]);~plaintext();private:};#include""using namespace std;static unsigned char sBox[] = {};/定义加密S盒/unsigned char insBox[256] ={};//定义解密S盒plaintext::plaintext(){}void plaintext::createplaintext(unsigned char a[])//创建明文{int i = 0;unsigned int p[16];for (int j = 0; j<200; j++){if (a[j] == 0){break;}}for (; i<16; i++){p[i] = a[i];a[i] = a[i + 16];}}void plaintext::SubBytes(unsigned char p[16])//字节变换函数{unsigned char b[16];for (int i = 0; i<16; i++){b[i] = sBox[(int)p[i]];}}void plaintext::inSubBytes(unsigned char p[16])//逆字节变换函数{unsigned char b[16];for (int i = 0; i<16; i++){b[i] = insBox[(int)p[i]];}}void plaintext::ShiftRows(unsigned char e[])//行移位变换函数{unsigned char t[4];for (int i = 1; i<4; i++){for (int x = 0; x<4; x++)t[x] = e[x + i * 4];for (int y = 0; y<4; y++)e[(y + 4 - i) % 4 + i * 4] = t[y];}}void plaintext::inShiftRows(unsigned char e[])//逆行移位变换函数{unsigned char t[4];for (int i = 1; i<4; i++){for (int x = 0; x<4; x++)t[x] = e[x + i * 4];for (int y = 0; y<4; y++)e[(y + i) % 4 + i * 4] = t[y];}}void plaintext::MatrixToByte(unsigned char e[])//列混合变换函数{unsigned char t[4];int r, c;for (c = 0; c< 4; c++){for (r = 0; r<4; r++){t[r] = e[r * 4 + c];}for (r = 0; r<4; r++){e[r * 4 + c] = FFmul(0x02, t[r])^ FFmul(0x03, t[(r + 1) % 4])^ FFmul(0x01, t[(r + 2) % 4])^ FFmul(0x01, t[(r + 3) % 4]);}}}void plaintext::inMatrixToByte(unsigned char e[])//逆列混合变换函数{unsigned char t[4];int r, c;for (c = 0; c< 4; c++){for (r = 0; r<4; r++){t[r] = e[r * 4 + c];}for (r = 0; r<4; r++){e[r * 4 + c] = FFmul(0x0e, t[r])^ FFmul(0x0b, t[(r + 1) % 4])^ FFmul(0x0d, t[(r + 2) % 4])^ FFmul(0x09, t[(r + 3) % 4]);}}}unsigned char plaintext::FFmul(unsigned char a, unsigned char b){unsigned char bw[4];unsigned char res = 0;int i;bw[0] = b;for (i = 1; i<4; i++){bw[i] = bw[i - 1] << 1;if (bw[i - 1] & 0x80){bw[i] ^= 0x1b;}}for (i = 0; i<4; i++){if ((a >> i) & 0x01){res ^= bw[i];}}return res;}void plaintext::KeyAdding(unsigned char state[16], unsigned char k[][4])//轮密钥加{int r, c;for (c = 0; c<4; c++){for (r = 0; r<4; r++){state[r + c * 4] ^= k[r][c];}}}void plaintext::KeyExpansion(unsigned char* key, unsigned char w[][4][4])//密钥扩展{int i, j, r, c;unsigned char rc[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };for (r = 0; r<4; r++){for (c = 0; c<4; c++){w[0][r][c] = key[r + c * 4];}}for (i = 1; i <= 10; i++){for (j = 0; j<4; j++){unsigned char t[4];for (r = 0; r<4; r++){t[r] = j ? w[i][r][j - 1] : w[i - 1][r][3];}if (j == 0){unsigned char temp = t[0];for (r = 0; r<3; r++){t[r] = sBox[t[(r + 1) % 4]];}t[3] = sBox[temp];t[0] ^= rc[i - 1];}for (r = 0; r<4; r++){w[i][r][j] = w[i - 1][r][j] ^ t[r];}}}}plaintext::~plaintext(){}#include<iostream>#include<>#include<>//使用文件选取功能#include""using namespace std;unsigned char w[11][4][4] = { 0 };int len = 0;//图片每行需要加密的长度void Cipher();//加密图片void inCipher();//解密图片void Cipher(unsigned char a[]){unsigned char b[16];for (int i = 0; i < (len / 16); i++){for (int j = 0; j<16; j++)b[j] = a[j + i * 16];plaintext::KeyAdding(b, w[0]);for (int n = 1; n <= 10; n++){plaintext::SubBytes(b);plaintext::ShiftRows(b);if (n != 10)plaintext::MatrixToByte(b);plaintext::KeyAdding(b, w[n]);}for (int m = 0; m<16; m++)a[m + i * 16] = b[m];}}void inCipher(unsigned char a[]){unsigned char b[16];for (int i = 0; i < (len / 16) ; i++){for (int j = 0; j<16; j++){b[j] = a[j + i * 16];}plaintext::KeyAdding(b, w[10]);for (int n = 9; n >= 0; n--){plaintext::inShiftRows(b);plaintext::inSubBytes(b);plaintext::KeyAdding(b, w[n]);if (n)plaintext::inMatrixToByte(b);}for (int m = 0; m<16; m++)a[m + i * 16] = b[m];}}bool ImageCopy(const CImage &srcImage, CImage &destImage) {int i, j;//循环变量if ())return FALSE;//源图像参数BYTE* srcPtr = (BYTE*)();int srcBitsCount = ();int srcWidth = ();int srcHeight = ();int srcPitch = ();//销毁原有图像if (!()){();}//创建新图像if (srcBitsCount == 32) //支持alpha通道{(srcWidth, srcHeight, srcBitsCount, 1);}else{(srcWidth, srcHeight, srcBitsCount, 0);}BYTE *destPtr = (BYTE*)();int destPitch = ();len=abs(srcPitch);for (int i = 0; i<srcHeight; i++)Cipher(srcPtr + i*srcPitch);//复制图像数据for (i = 0; i<srcHeight; i++){memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch));}return TRUE;}bool inImageCopy(const CImage &srcImage, CImage &destImage){int i, j;//循环变量if ())return FALSE;//源图像参数BYTE* srcPtr = (BYTE*)();int srcBitsCount = ();int srcWidth = ();int srcHeight = ();int srcPitch = ();//销毁原有图像if (!()){();}//创建新图像if (srcBitsCount == 32) //支持alpha通道{(srcWidth, srcHeight, srcBitsCount, 1);}else{(srcWidth, srcHeight, srcBitsCount, 0);}BYTE *destPtr = (BYTE*)();int destPitch = ();len = abs(srcPitch);for (int i = 0; i<srcHeight; i++)inCipher(srcPtr + i*srcPitch);//复制图像数据for (i = 0; i<srcHeight; i++){memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch));}return TRUE;}int main(){unsigned char key[16] = {//固定密钥0x77, 0x59, 0xc5, 0xa4,0x55, 0x90, 0xa4, 0xa3,0xb2, 0xcc, 0x01, 0xa9,0xcb, 0xac, 0x77, 0x23 };plaintext::KeyExpansion(key, w);TCHAR szBuffer[MAX_PATH] = { 0 };//使用文件选取功能OPENFILENAME ofn = { 0 };= sizeof(ofn);// = m_hWnd;= _T("");//要选择的文件后缀= _T("D:\\");//默认的文件路径= szBuffer;//存放文件的缓冲区= sizeof(szBuffer) / sizeof(*szBuffer);= 0;= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECTBOOL bSel = GetOpenFileName(&ofn);CImage image, image2, image3;//读取图片(szBuffer);。
第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。
二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。
其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。
选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。
计算e关于φ(n)的模逆元d。
公开密钥为(e,n),私有密钥为(d,n)。
加密过程为C=Me mod n,解密过程为M=Cd mod n。
2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。
AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。
每个轮包括字节替换、行移位、列混淆和轮密钥加。
3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。
DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。
四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。
2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。
实验报告姓名:陈清扬学号:2051313 班级:信息安全日期:2011-04-23AES加密算法一、实验环境1.硬件配置:酷睿i3cpu ,2G内存2.使用软件:(1) 操作系统:windows7旗舰版(2) 软件工具:visualc++6.0二、AES涉及的相关概念或基本原理简介:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
密码说明:严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支援更大范围的区块和密钥长度:AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;而Rijndael使用的密钥和区块长度可以是32位元的整数倍,以128位元为下限,256位元为上限。
加密过程中使用的密钥是由Rijndael密钥生成方案产生。
大多数AES计算是在一个特别的有限域完成的。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。
(Rijndael加密法因支援更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:1AddRoundKey—矩阵中的每一个字节都与该次回合金钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
2SubBytes—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
北理工aes实验报告实验目的通过实践学习,掌握AES对称加密算法的原理和实现方法。
实验环境- 操作系统:Windows 10- 开发工具:Visual Studio Code- 编程语言:Python实验步骤1. 导入所需的库pythonfrom Crypto.Cipher import AES2. 定义AES加密算法的密钥和初始化向量pythonkey = b'0123456789abcdef' 密钥必须是16、24或者32个字符iv = b'1234567890abcdef' 初始化向量必须是16个字符3. 定义AES加密函数和AES解密函数pythondef encrypt(text):cipher = AES.new(key, AES.MODE_CBC, iv)加密后的数据长度必须是16的整数倍ciphertext = cipher.encrypt(text.ljust(16))return ciphertextdef decrypt(ciphertext):cipher = AES.new(key, AES.MODE_CBC, iv)plaintext = cipher.decrypt(ciphertext).rstrip()return plaintext4. 进行加密和解密测试pythontext = b'this is a test' 待加密的数据ciphertext = encrypt(text)print('加密后的数据:', ciphertext)plaintext = decrypt(ciphertext)print('解密后的数据:', plaintext)实验结果经过测试,加密后的数据为:b'\x93\x972\xe1)\xff\x1a]\x80\x95A\x0e&\xdf\r5'解密后的数据为:b'this is a test'实验总结通过本次实验,我们掌握了AES对称加密算法的基本原理和实现方法。
华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] 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 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。
最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。
表2 AES 参数比特。
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}等。
密码学算法设计与实现的实验报告实验报告一、实验目的本实验的目的是设计和实现一个密码学算法,加深对密码学基本知识的理解,并掌握密码学算法设计与实现的方法。
二、实验原理本实验选取的密码学算法是AES(Advanced Encryption Standard)算法,该算法是一种对称加密算法,具有高度的安全性和广泛的应用。
AES算法基于替代、置换和混合技术,用于对数据进行加密和解密。
实现AES算法的关键是实现四个基本操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
其中字节替代和行移位不涉及密钥,可以使用固定的S-box和位移表进行计算;列混淆和轮密钥加需要根据密钥来计算。
三、实验步骤1. 设计并实现AES算法的主函数,控制加密和解密操作;2. 实现字节替代和行移位操作的代码,并通过测试验证正确性;3. 实现列混淆和轮密钥加操作的代码,并通过测试验证正确性;4. 设计并实现密钥扩展函数,用于生成轮密钥;5. 实现AES算法的加密函数和解密函数,通过测试验证正确性;6. 验证AES算法对数据进行加密和解密的正确性和安全性。
四、实验结果经过实验,AES算法实现的加密和解密功能正常,能够对数据进行可靠的保护。
验证加密函数和解密函数的正确性时,采用了多组不同的密钥和明文进行测试,结果都能够正确地实现加密和解密的逆操作。
五、实验心得体会通过本实验,我深入理解了AES算法的工作原理和实现方法,学会了使用替代、置换和混合技术对数据进行加密和解密。
在实验中,我不仅学习了密码学的基本知识,还锻炼了编程和算法设计的能力。
在实现算法的过程中,我特别注重代码的可读性和可维护性,采用了模块化和函数化的设计方法,使得代码逻辑清晰,易于理解和修改。
总之,本实验对于深入学习密码学和加密算法具有重要意义,通过动手实践,我不仅理解了密码学的基本原理,还培养了自主学习和解决问题的能力。
中南大学现代密码学实验报告学生姓名郁博文学号0906130205专业班级信息安全1302指导教师段桂华学院信息科学与工程学院完成时间2015年5月AES1.背景AES,密码学中的高级加密标准(Advanced Encryption Stan dard,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.2功能模块与系统结构主要功能模块如下:2.2.1字节替换SubByte非线性代换是可逆的,由以下两个变换的合成得到:① 首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元,‘00’映射到自己。
实验报告姓名:XXXXXXX学号:XXXXXXXXXX班级:XXXXXXXXX日期:2013/12/*题目:AES算法实验一、实验环境1.硬件配置:处理器:Inter(R)Core(TM)*******************(4CPUs),~2.4GHz内存:2048MB RAM2.使用软件:(1) 操作系统:win7 旗舰版(2) 软件工具:Microsoft Visual c++ 6.0二、实验涉及的相关概念或基本原理AES 是一个新的可以用于保护电子数据的加密算法。
明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。
与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。
通过分组密码返回的加密数据的位数与输入数据相同。
迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。
Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。
对称密码算法根据对明文消息加密方式的不同可分为两大类 ,即分组密码和流密码。
分组密码将消息分为固定长度的分组 ,输出的密文分组通常与输入的明文分组长度相同。
AES 算法属于分组密码算法 ,它的输入分组、输出分组以及加/ 解密过程中的中间分组都是 128比特。
密钥的长度 K为 128,192或 256 比特。
用 Nk=4,6,8 代表密钥串的字数 ( 1 字 =32 比特) ,在本文编制的程序中由用户选定。
用 Nr 表示对一个数据分组加密的轮数 ( 加密轮数与密钥长度的关系见表 1) 。
每一轮都需要一个和输入分组具有同样长度 ( 128 比特) 的扩展密钥Ke的参与。
由于外部输入的加密密钥 K 长度有限 ,所以在 AES 中要用一个密钥扩展程序 ( KeyExpansion) 把外部密钥 K 扩展成更长的比特串 ,以生成各轮的加密密钥。
信息安全工程课程实验报告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位大小的密钥大小。
实验报告姓名:XXXXXXX学号:XXXXXXXXXX班级:XXXXXXXXX日期:2013/12/*题目:AES算法实验一、实验环境1.硬件配置:处理器:Inter(R)Core(TM)*******************(4CPUs),~2.4GHz内存:2048MB RAM2.使用软件:(1) 操作系统:win7 旗舰版(2) 软件工具:Microsoft Visual c++ 6.0二、实验涉及的相关概念或基本原理AES 是一个新的可以用于保护电子数据的加密算法。
明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。
与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。
通过分组密码返回的加密数据的位数与输入数据相同。
迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。
Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。
对称密码算法根据对明文消息加密方式的不同可分为两大类 ,即分组密码和流密码。
分组密码将消息分为固定长度的分组 ,输出的密文分组通常与输入的明文分组长度相同。
AES 算法属于分组密码算法 ,它的输入分组、输出分组以及加/ 解密过程中的中间分组都是 128比特。
密钥的长度 K为 128,192或 256 比特。
用 Nk=4,6,8 代表密钥串的字数 ( 1 字 =32 比特) ,在本文编制的程序中由用户选定。
用 Nr 表示对一个数据分组加密的轮数 ( 加密轮数与密钥长度的关系见表 1) 。
每一轮都需要一个和输入分组具有同样长度 ( 128 比特) 的扩展密钥Ke的参与。
由于外部输入的加密密钥 K 长度有限 ,所以在 AES 中要用一个密钥扩展程序 ( KeyExpansion) 把外部密钥 K 扩展成更长的比特串 ,以生成各轮的加密密钥。
( 1) 加密变换设 X 是 AES 的 128 比特明文输入 ,Y 是 128 比特的密文输出 ,则 AES 密文 Y可以用下面的复合变换表示 :Y=A R・ A C・ S・… C・ S・k(r+1 ) ・ S・ kr・ R・ Ak(r21)其中”“・表示复合运算。
这里 Aki :表示对 X 的一个变换Aki ( X) =X Ki ( Ki为第 i 轮的子密钥 ,为比特串的异或运算) 。
S:S 盒置换。
即对每一个字节用 S2Box 做一个置换。
S2Box 是一个给定的转换表。
R: 行置换。
C: 列置(换。
s′x) =a ( x) s ( x)解密变换是加密变换的逆变换。
三、实验内容AES是分组密钥,算法输入128位数据,密钥长度也是128位。
用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。
每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。
由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。
1.1圈变化AES每一个圈变换由以下三个层组成:非线性层——进行Subbyte变换;线行混合层——进行ShiftRow和MixColumn运算;密钥加层——进行AddRoundKey运算。
① Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。
② ShiftRow是一个字节换位。
它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。
③在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。
b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即b(x)=c(x)·a(x)(mod x4+1) 对于这个运算 b0=02。
a0+03。
a1+a2+a3 令xtime(a0)=02。
a0其中,符号“。
”表示模一个八次不可约多项式的同余乘法[3]。
对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。
④密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。
⑤根据线性变化的性质[1],解密运算是加密变化的逆变化。
这里不再详细叙述。
1.2轮变化对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。
1.3密钥扩展AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。
它涉及如下三个模块:①位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];② S盒变换(subword)——对一个4字节进行S盒代替;这里的x是(02),如 Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]W[[i- Nk]]。
但是若i为Nk的倍数,则W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。
流程图:主要代码:①unsigned char* AES::Cipher(unsigned char* input){unsigned char state[4][4];int i,r,c;for(r=0; r<4; r++){for(c=0; c<4 ;c++){state[r][c] = input[c*4+r];}}AddRoundKey(state,w[0]);for(i=1; i<=10; i++){SubBytes(state);ShiftRows(state);if(i!=10)MixColumns(state);AddRoundKey(state,w[i]);}for(r=0; r<4; r++){for(c=0; c<4 ;c++){input[c*4+r] = state[r][c];}}return input;}unsigned char* AES::InvCipher(unsigned char* input) {unsigned char state[4][4];int i,r,c;for(r=0; r<4; r++){for(c=0; c<4 ;c++){state[r][c] = input[c*4+r];}}AddRoundKey(state, w[10]);for(i=9; i>=0; i--){InvShiftRows(state);InvSubBytes(state);AddRoundKey(state, w[i]);if(i){InvMixColumns(state);}}for(r=0; r<4; r++){for(c=0; c<4 ;c++){input[c*4+r] = state[r][c];}}②unsigned char* in = (unsigned char*) input;int i;if(!length){while(*(in+length++));in = (unsigned char*) input;}for(i=0; i<length; i+=16){Cipher(in+i);}return input;unsigned char* in = (unsigned char*) input;int i;for(i=0; i<length; i+=16){InvCipher(in+i);}④int i,j,r,c;unsigned char rc[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};for(r=0; r<4; r++){for(c=0; c<4; c++){w[0][r][c] = key[r+c*4];}}for(i=1; i<=10; i++){for(j=0; j<4; j++){unsigned char t[4];for(r=0; r<4; r++){t[r] = j ? w[i][r][j-1] : w[i-1][r][3];}if(j == 0){unsigned char temp = t[0];for(r=0; r<3; r++){t[r] = Sbox[t[(r+1)%4]];}t[3] = Sbox[temp];t[0] ^= rc[i-1];}for(r=0; r<4; r++){w[i][r][j] = w[i-1][r][j] ^ t[r];}}}⑤int r,c;for(r=0; r<4; r++){for(c=0; c<4; c++){state[r][c] = Sbox[state[r][c]];}}⑥unsigned char t[4];int r,c;for(r=1; r<4; r++){{t[c] = state[r][(c+r)%4];}for(c=0; c<4; c++){state[r][c] = t[c];}}⑦void AES::AddRoundKey(unsigned char state[][4], unsigned char k[][4]) {int r,c;for(c=0; c<4; c++){for(r=0; r<4; r++){state[r][c] ^= k[r][c];}}}void AES::InvSubBytes(unsigned char state[][4]){int r,c;for(r=0; r<4; r++){for(c=0; c<4; c++){state[r][c] = InvSbox[state[r][c]];}}}void AES::InvShiftRows(unsigned char state[][4]){unsigned char t[4];int r,c;for(r=1; r<4; r++){for(c=0; c<4; c++){t[c] = state[r][(c-r+4)%4];}for(c=0; c<4; c++){state[r][c] = t[c];}}}void AES::InvMixColumns(unsigned char state[][4]){unsigned char t[4];int r,c;for(c=0; c< 4; c++){t[r] = state[r][c];}for(r=0; r<4; r++){state[r][c] = FFmul(0x0e, t[r])^ FFmul(0x0b, t[(r+1)%4])^ FFmul(0x0d, t[(r+2)%4])^ FFmul(0x09, t[(r+3)%4]);}}四、实验总结分析心得体会AES加密算法是前辈们付出很多才有的知识。