ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:895.40KB ,
资源ID:8813323      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8813323.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AES加密算法实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AES加密算法实验报告.docx

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

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

3、aintextpublic: 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(unsigned char e); static void MatrixToByte(unsigned char e); static void inMat

4、rixToByte(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();private:;#include using namespace std;static unsigned char sBox = ;/定

5、义加密S盒/unsigned char insBox256 =;/定义解密S盒plaintext:plaintext()void plaintext:createplaintext(unsigned char a)/创建明文 int i = 0; unsigned int p16; for (int j = 0; j200; j+) if (aj = 0) break; for (; i16; i+) pi = ai; ai = ai + 16; void plaintext:SubBytes(unsigned char p16)/字节变换函数 unsigned char b16; for (

6、int i = 0; i16; i+) bi = sBox(int)pi; void plaintext:inSubBytes(unsigned char p16)/逆字节变换函数 unsigned char b16; for (int i = 0; i16; i+) bi = insBox(int)pi; void plaintext:ShiftRows(unsigned char e)/行移位变换函数 unsigned char t4; for (int i = 1; i4; i+) for (int x = 0; x4; x+) tx = ex + i * 4; for (int y =

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

8、 int r, c; for (c = 0; c 4; c+) for (r = 0; r4; r+) tr = er * 4 + c; for (r = 0; r4; r+) er * 4 + c = FFmul(0x02, tr) 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 t4; int r, c; for (c = 0; c 4; c+

9、) for (r = 0; r4; r+) tr = er * 4 + c; for (r = 0; r4; 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 char plaintext:FFmul(unsigned char a, unsigned char b) unsigned char bw4; unsigned char res = 0; int i; bw0 = b; for (i = 1;

10、 i4; i+) bwi = bwi - 1 1; if (bwi - 1 & 0x80) bwi = 0x1b; for (i = 0; i i) & 0x01) res = bwi; return res;void plaintext:KeyAdding(unsigned char state16, unsigned char k4)/轮密钥加 int r, c; for (c = 0; c4; c+) for (r = 0; r4; r+) stater + c * 4 = krc; void plaintext:KeyExpansion(unsigned char* key, unsi

11、gned char w44)/密钥扩展 int i, j, r, c; unsigned char rc = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 ; for (r = 0; r4; r+) for (c = 0; c4; c+) w0rc = keyr + c * 4; for (i = 1; i = 10; i+) for (j = 0; j4; j+) unsigned char t4; for (r = 0; r4; r+) tr = j wirj - 1 : wi - 1r3; if (j = 0) un

12、signed char temp = t0; for (r = 0; r3; r+) tr = sBoxt(r + 1) % 4; t3 = sBoxtemp; t0 = rci - 1; for (r = 0; r4; r+) wirj = wi - 1rj tr; plaintext:plaintext()#include#include#include/使用文件选取功能#include using namespace std;unsigned char w1144 = 0 ;int len = 0;/图片每行需要加密的长度void Cipher();/加密图片void inCipher(

13、);/解密图片void Cipher(unsigned char a) unsigned char b16; for (int i = 0; i (len / 16); i+) for (int j = 0; j16; 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)

14、; for (int m = 0; m16; m+) am + i * 16 = bm; void inCipher(unsigned char a) unsigned char b16; for (int i = 0; i (len / 16) ; i+) for (int j = 0; j= 0; n-) plaintext:inShiftRows(b); plaintext:inSubBytes(b); plaintext:KeyAdding(b, wn); if (n)plaintext:inMatrixToByte(b); for (int m = 0; m16; m+) am +

15、i * 16 = bm; 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, srcHeigh

16、t, srcBitsCount, 1); else (srcWidth, srcHeight, srcBitsCount, 0); BYTE *destPtr = (BYTE*)(); int destPitch = (); len=abs(srcPitch); for (int i = 0; isrcHeight; i+) Cipher(srcPtr + i*srcPitch); /复制图像数据 for (i = 0; isrcHeight; i+) memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch); retur

17、n 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, s

18、rcBitsCount, 1); else (srcWidth, srcHeight, srcBitsCount, 0); BYTE *destPtr = (BYTE*)(); int destPitch = (); len = abs(srcPitch); for (int i = 0; isrcHeight; i+) inCipher(srcPtr + i*srcPitch); /复制图像数据 for (i = 0; isrcHeight; i+) memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch); retur

19、n 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 ; = sizeof(ofn); / = m_hWnd; = _T();/要选择的文件后缀 = _T(D:);/默认的文件路径 =

20、szBuffer;/存放文件的缓冲区 = sizeof(szBuffer) / sizeof(*szBuffer); = 0; = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;/标志如果是多选要加上OFN_ALLOWMULTISELECT BOOL bSel = GetOpenFileName(&ofn); CImage image, image2, image3;/读取图片 (szBuffer); ImageCopy(image, image2); (e:/); inImageCopy(image2, image3); (e:/); system(pause);本数据记录和计算 运行程序,出现选择图片界面加密结束原图片 加密图片 解密图片 结 论(结 果) 根据结果显示,程序成功的实现了对图片的加密,得到的加密后的结果仍然为图片,并成功地的解密得到了正确的解密后的图片。小 结 通过本次试验,成功的完成了对AES密码算法的初步编写,了解了AES算法的工作原理。对于图片加密方面,掌握了新的调用图片的方法 ,使用头文件大大简化了c+中对图片调用的难度。同时在文件读取方面使用了头文件,使得程序在使用上更加方便。指导老师评 议 成绩评定: 指导教师签名:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1