AES加密算法实验报告_第1页
AES加密算法实验报告_第2页
AES加密算法实验报告_第3页
AES加密算法实验报告_第4页
AES加密算法实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上四 川 大 学 计 算 机 学 院、软 件 学 院实 验 报 告 学号:姓名:专业: 班级: 第 10 周课程名称 密码学与网络安全实验课时2实验项目AES加密算法实验时间2015.5.7实验目的 完成AES加密算法,实现图片加密与解密,并将加密后的结果以图片格式保存。实验环境 PC机,Windows7操作系统,Visual C+ 6.0实验内容(算法、程序、步骤和方法) 一、 简介美国国家标准技术研究所在2001年发布了高级加密标准(AES)。AES是一个对称加密算法,旨在取代DES成为广泛使用的标准。AES中的所有运算都是在8为的字节上运行的。特别饿,加减乘除算术

2、都是在有限域GF(28)上运行的。二、 程序特点本次试验中要求对图片进行加密与解密,并将加密结果以图片格式进行保存。因此为了实现对图片的调度及保存,使用头文件atlimage.h进行对图片的操作,实现对图片的像素读取,图片的保存。在程序运行读取需要加密的图片时,需要进行图片的选取,本次实验中使用在弹窗中选取文件的方式,使用头文件commdlg.h来实现在文件夹中选择需要的文件的选取。三、 加密算法流程AES加密算法流程如下字节代替:用一个S盒完成分组的字节到字节的代替;行移位:进行一次行上的置换;列混合:利用有限域GF(28)上的运算特性的一个代替;轮密钥加:当前分组和扩展密钥的一部分进行按位

3、异或。四、 代码实现cryptograph.h#include <string>#include <iostream>class plaintextpublic:plaintext();static void createplaintext(unsigned char a);static void SubBytes(unsigned char p16);static void inSubBytes(unsigned char p16);static void ShiftRows(unsigned char e);static void inShiftRows(unsig

4、ned 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 state16, unsigned char k4);static void KeyExpansion(unsigned char* key, unsigned char w44);plaintext();pr

5、ivate:;cryptograph.cpp#include "cryptography.h"using namespace std;static unsigned char sBox = ;/定义加密S盒/unsigned char insBox256 =;/定义解密S盒plaintext:plaintext()void plaintext:createplaintext(unsigned char a)/创建明文int i = 0;unsigned int p16;for (int j = 0; j<200; j+)if (aj = 0)break;for (;

6、i<16; i+)pi = ai;ai = ai + 16;void plaintext:SubBytes(unsigned char p16)/字节变换函数unsigned char b16;for (int i = 0; i<16; i+)bi = sBox(int)pi;void plaintext:inSubBytes(unsigned char p16)/逆字节变换函数unsigned char b16;for (int i = 0; i<16; i+)bi = insBox(int)pi;void plaintext:ShiftRows(unsigned char

7、 e)/行移位变换函数unsigned char t4;for (int i = 1; i<4; i+)for (int x = 0; x<4; x+)tx = ex + i * 4;for (int y = 0; y<4; y+)e(y + 4 - i) % 4 + i * 4 = ty;void plaintext:inShiftRows(unsigned char e)/逆行移位变换函数unsigned char t4;for (int i = 1; i<4; i+)for (int x = 0; x<4; x+)tx = ex + i * 4;for (i

8、nt y = 0; y<4; y+)e(y + i) % 4 + i * 4 = ty;void plaintext:MatrixToByte(unsigned char e)/列混合变换函数unsigned char t4;int r, c;for (c = 0; c< 4; c+)for (r = 0; r<4; r+)tr = er * 4 + c;for (r = 0; r<4; r+)er * 4 + c = FFmul(0x02, tr) FFmul(0x03, t(r + 1) % 4) FFmul(0x01, t(r + 2) % 4) FFmul(0x

9、01, t(r + 3) % 4);void plaintext:inMatrixToByte(unsigned char e)/逆列混合变换函数unsigned char t4;int r, c;for (c = 0; c< 4; c+)for (r = 0; r<4; r+)tr = er * 4 + c;for (r = 0; r<4; r+)er * 4 + c = FFmul(0x0e, tr) FFmul(0x0b, t(r + 1) % 4) FFmul(0x0d, t(r + 2) % 4) FFmul(0x09, t(r + 3) % 4);unsigned

10、 char plaintext:FFmul(unsigned char a, unsigned char b)unsigned char bw4;unsigned char res = 0;int i;bw0 = b;for (i = 1; i<4; i+)bwi = bwi - 1 << 1;if (bwi - 1 & 0x80)bwi = 0x1b;for (i = 0; i<4; i+)if (a >> i) & 0x01)res = bwi;return res;void plaintext:KeyAdding(unsigned ch

11、ar state16, unsigned char k4)/轮密钥加int r, c;for (c = 0; c<4; c+)for (r = 0; r<4; r+)stater + c * 4 = krc;void plaintext:KeyExpansion(unsigned char* key, unsigned char w44)/密钥扩展int i, j, r, c;unsigned char rc = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 ;for (r = 0; r<4; r+)fo

12、r (c = 0; c<4; c+)w0rc = keyr + c * 4;for (i = 1; i <= 10; i+)for (j = 0; j<4; j+)unsigned char t4;for (r = 0; r<4; r+)tr = j ? wirj - 1 : wi - 1r3;if (j = 0)unsigned char temp = t0;for (r = 0; r<3; r+)tr = sBoxt(r + 1) % 4;t3 = sBoxtemp;t0 = rci - 1;for (r = 0; r<4; r+)wirj = wi -

13、 1rj tr;plaintext:plaintext()main.cpp#include<iostream>#include<atlimage.h>#include<commdlg.h>/使用文件选取功能#include "cryptography.h"using namespace std;unsigned char w1144 = 0 ;int len = 0;/图片每行需要加密的长度void Cipher();/加密图片void inCipher();/解密图片void Cipher(unsigned char a)unsigne

14、d char b16;for (int i = 0; i < (len / 16); i+)for (int j = 0; j<16; j+)bj = aj + i * 16;plaintext:KeyAdding(b, w0);for (int n = 1; n <= 10; n+)plaintext:SubBytes(b);plaintext:ShiftRows(b);if (n != 10)plaintext:MatrixToByte(b);plaintext:KeyAdding(b, wn);for (int m = 0; m<16; m+)am + i * 1

15、6 = bm;void inCipher(unsigned char a)unsigned char b16;for (int i = 0; i < (len / 16) ; i+)for (int j = 0; j<16; j+)bj = aj + i * 16;plaintext:KeyAdding(b, w10);for (int n = 9; n >= 0; n-)plaintext:inShiftRows(b);plaintext:inSubBytes(b);plaintext:KeyAdding(b, wn);if (n)plaintext:inMatrixToB

16、yte(b);for (int m = 0; m<16; m+)am + i * 16 = bm;bool ImageCopy(const CImage &srcImage, CImage &destImage)int i, j;/循环变量if (srcImage.IsNull()return FALSE;/源图像参数BYTE* srcPtr = (BYTE*)srcImage.GetBits();int srcBitsCount = srcImage.GetBPP();int srcWidth = srcImage.GetWidth();int srcHeight =

17、srcImage.GetHeight();int srcPitch = srcImage.GetPitch();/销毁原有图像if (!destImage.IsNull()destImage.Destroy();/创建新图像if (srcBitsCount = 32) /支持alpha通道destImage.Create(srcWidth, srcHeight, srcBitsCount, 1);elsedestImage.Create(srcWidth, srcHeight, srcBitsCount, 0);BYTE *destPtr = (BYTE*)destImage.GetBits(

18、);int destPitch = destImage.GetPitch();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 &destImag

19、e)int i, j;/循环变量if (srcImage.IsNull()return FALSE;/源图像参数BYTE* srcPtr = (BYTE*)srcImage.GetBits();int srcBitsCount = srcImage.GetBPP();int srcWidth = srcImage.GetWidth();int srcHeight = srcImage.GetHeight();int srcPitch = srcImage.GetPitch();/销毁原有图像if (!destImage.IsNull()destImage.Destroy();/创建新图像if

20、(srcBitsCount = 32) /支持alpha通道destImage.Create(srcWidth, srcHeight, srcBitsCount, 1);elsedestImage.Create(srcWidth, srcHeight, srcBitsCount, 0);BYTE *destPtr = (BYTE*)destImage.GetBits();int destPitch = destImage.GetPitch();len = abs(srcPitch);for (int i = 0; i<srcHeight; i+)inCipher(srcPtr + i*s

21、rcPitch);/复制图像数据for (i = 0; i<srcHeight; i+)memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch);return TRUE;int main()unsigned char key16 = /固定密钥0x77, 0x59, 0xc5, 0xa4,0x55, 0x90, 0xa4, 0xa3,0xb2, 0xcc, 0x01, 0xa9,0xcb, 0xac, 0x77, 0x23 ;plaintext:KeyExpansion(key, w);TCHAR szBufferMAX_PATH = 0 ;/使用文件选取功能OPENFILENAME ofn = 0 ;ofn.lStructSize = sizeof(ofn);/ofn.hwndOwner = m_hWnd;ofn.lpstrFilter = _T("");/要选择的文件后缀 ofn.lpstrInitialDir = _T("D:");/默认的文件路径 ofn.lpstrFile = szBuffer;/存放文件的缓冲区

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论