AES加密解密实验报告

合集下载

aes实验报告

aes实验报告

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算法具有高度的安全性和可靠性,被认为是目前最强大的对称加密算法之一。

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);。

AES加密解密实验报告

AES加密解密实验报告

AES加密解密实验报告实验目的:了解和学习AES加密算法的原理和实现过程,掌握AES加密解密的方法。

实验原理:AES(Advanced Encryption Standard)高级加密标准,是一种对称加密算法,使用相同的密钥进行加密和解密。

AES加密算法使用数学运算和逻辑操作混合的方式,通过多轮迭代和替代、逆替代、置换等步骤,对数据进行加密和解密操作。

实验材料和方法:材料:计算机、Python编程环境。

方法:通过Python编程环境调用AES库函数,进行AES加密解密实验。

实验步骤:1. 导入AES库函数:在Python编程环境中,导入AES的库函数。

```pythonfrom Crypto.Cipher import AESfrom Crypto.Random import get_random_bytes```2. 生成随机密钥:使用get_random_bytes(函数生成一个长度为16字节的随机密钥。

```pythonkey = get_random_bytes(16)```3. 实例化AES加密对象:使用AES.new(函数,传入随机密钥和加密模式“AES.MODE_ECB”创建AES加密对象。

```pythoncipher = AES.new(key, AES.MODE_ECB)```4. 加密数据:使用encrypt(函数,传入要加密的数据进行加密操作。

```pythonmessage = "This is a secret message.".encodeciphertext = cipher.encrypt(message)```5. 解密数据:使用decrypt(函数,传入密文进行解密操作。

```pythonplaintext = cipher.decrypt(ciphertext)```6. 打印加密和解密结果:使用print(函数,打印加密前后和解密后的数据。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第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)输出加密后的密文。

密码学实验报告AESRSA

密码学实验报告AESRSA

华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] 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}等。

加密解码_实训报告

加密解码_实训报告

一、实训目的本次实训旨在通过实际操作,加深对加密和解码原理的理解,提高对加密算法的应用能力,并培养在实际工作中运用加密技术保护信息安全的能力。

通过实训,学生能够:1. 掌握常见的加密算法,如对称加密、非对称加密和哈希算法。

2. 理解加密和解码的过程,包括密钥管理、加密操作和验证过程。

3. 学会使用加密工具和库,如Python的cryptography库。

4. 能够根据实际需求选择合适的加密算法,并解决加密过程中遇到的问题。

二、实训环境1. 操作系统:Windows 102. 编程语言:Python3.83. 加密库:cryptography4. 实训工具:PyCharm三、实训原理1. 对称加密:使用相同的密钥进行加密和解密。

常见的对称加密算法有AES、DES 和3DES。

2. 非对称加密:使用一对密钥,公钥用于加密,私钥用于解密。

常见的非对称加密算法有RSA和ECC。

3. 哈希算法:将任意长度的数据映射为固定长度的哈希值,用于验证数据的完整性和一致性。

常见的哈希算法有SHA-256、MD5和SHA-1。

四、实训过程1. 对称加密实训:- 使用AES算法对一段文本进行加密和解密。

- 使用DES算法对一段文本进行加密和解密。

- 比较不同对称加密算法的效率和安全性。

2. 非对称加密实训:- 使用RSA算法生成密钥对,并使用公钥加密、私钥解密一段文本。

- 使用ECC算法生成密钥对,并使用公钥加密、私钥解密一段文本。

- 比较不同非对称加密算法的效率和安全性。

3. 哈希算法实训:- 使用SHA-256算法对一段文本进行哈希运算。

- 使用MD5算法对一段文本进行哈希运算。

- 比较不同哈希算法的效率和安全性。

4. 实际应用实训:- 使用加密工具和库对文件进行加密和解密。

- 使用加密算法保护通信过程中的数据传输安全。

- 分析加密过程中可能出现的安全问题,并提出解决方案。

五、实训结果1. 成功掌握了AES、DES、RSA、ECC和SHA-256等加密算法的原理和应用。

aes 实验报告

aes 实验报告

aes 实验报告AES实验报告1. 引言AES(Advanced Encryption Standard)是一种对称加密算法,被广泛应用于各种领域中的数据保护和安全通信。

本实验旨在通过实际操作,深入了解AES算法的原理和应用。

2. 实验目的2.1 理解AES算法的基本原理;2.2 掌握AES算法的加密和解密过程;2.3 通过实验验证AES算法的安全性和效率。

3. 实验环境本实验使用的环境为Python编程语言和相关的密码学库。

4. 实验步骤4.1 密钥生成AES算法使用的密钥长度可以是128位、192位或256位。

在本实验中,我们选择128位密钥长度。

首先,通过随机数生成器生成一个128位的密钥。

4.2 加密过程4.2.1 分组将待加密的明文按照128位分组,如果最后一个分组不足128位,则需要进行填充。

4.2.2 轮密钥扩展AES算法使用了多轮加密,每一轮都需要使用不同的轮密钥。

通过密钥扩展算法,将初始密钥扩展为多个轮密钥。

4.2.3 轮函数AES算法的核心是轮函数,它包括字节替代、行移位、列混淆和轮密钥加四个步骤。

这些步骤在每一轮中都会被执行。

4.2.4 轮数循环根据密钥长度的不同,AES算法的轮数也不同。

在本实验中,我们选择10轮加密。

4.2.5 输出密文经过多轮加密后,得到最终的密文。

4.3 解密过程解密过程与加密过程相似,只是在轮密钥的使用上有所不同。

解密过程需要使用逆向的轮密钥。

5. 实验结果与分析通过实验,我们得到了AES算法对明文进行加密和解密的结果。

经过比对,我们可以验证加密和解密的正确性。

同时,我们还可以通过实验数据分析AES算法的安全性和效率。

6. 实验结论AES算法是一种安全可靠的对称加密算法,能够有效地保护数据的机密性。

通过本实验,我们深入了解了AES算法的原理和应用,并且掌握了AES算法的加密和解密过程。

7. 实验总结通过本次实验,我们不仅学习了AES算法的基本原理和应用,还通过实际操作加深了对该算法的理解。

aes算法实验报告

aes算法实验报告

aes算法实验报告AES 算法实验报告一、实验目的本次实验的主要目的是深入研究和理解高级加密标准(AES)算法的工作原理、加密和解密过程,并通过实际编程实现来验证其安全性和有效性。

二、实验原理AES 算法是一种对称加密算法,它使用了分组密码的结构,将明文分成固定长度的分组进行处理。

AES 支持 128、192 和 256 位三种密钥长度,对应的分组长度均为 128 位。

AES 算法的核心是轮函数,包括字节替换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)四个操作。

经过多次轮函数的迭代,实现对明文的加密。

字节替换操作是一个非线性的字节替换,通过一个固定的 S 盒进行替换。

行移位操作是将矩阵中的每行进行循环移位。

列混淆操作是对矩阵中的每列进行线性变换。

轮密钥加操作是将轮密钥与当前状态进行异或运算。

三、实验环境编程语言:Python相关库:pycryptodome操作系统:Windows 10四、实验步骤1、导入所需的库```pythonfrom CryptoCipher import AESfrom CryptoUtilPadding import pad, unpad ```2、定义加密和解密函数```pythondef encrypt_aes(message, key):cipher = AESnew(key, AESMODE_ECB) padded_message = pad(message, AESblock_size) ciphertext = cipherencrypt(padded_message) return ciphertextdef decrypt_aes(ciphertext, key):cipher = AESnew(key, AESMODE_ECB)plaintext = cipherdecrypt(ciphertext)unpadded_plaintext = unpad(plaintext, AESblock_size) return unpadded_plaintext```3、生成密钥```pythonkey = b'secretkey123456' 16 字节的密钥```4、明文输入```pythonmessage = b'This is a secret message'```5、加密过程```pythonciphertext = encrypt_aes(message, key)print("加密后的密文:", ciphertext)```6、解密过程```pythondecrypted_message = decrypt_aes(ciphertext, key)print("解密后的明文:", decrypted_message)```五、实验结果与分析通过实验,成功对输入的明文进行了 AES 加密,并能够正确解密得到原始明文。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息安全工程课程实验报告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个字组成。

相关文档
最新文档