密码学实验1.docx
- 文档编号:30395293
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:13
- 大小:91.25KB
密码学实验1.docx
《密码学实验1.docx》由会员分享,可在线阅读,更多相关《密码学实验1.docx(13页珍藏版)》请在冰豆网上搜索。
密码学实验1
《现代密码学及其应用》实验报告
年级、专业、班级
2011级计科5班
姓名
杨朝慧
实验题目
Arnold变换
实验时间
2013.11.15
实验地点
A1410
实验成绩
实验性质
□验证性□设计性□综合性
教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;
□实验结果正确;□语法、语义正确;□报告规范;
其他:
评价教师签名:
一、实验目的
通过编程实现Arnold变换,加深对图像置乱的基本方法,并了解Arnold变换的周期性。
二、实验项目内容
自己创建明文信息(需正方形矩阵形式),并选择一个密钥,即迭代次数,编写Arnold变换实现程序,实现置乱和回复的操作;
三、实验过程或算法(源程序)
程序功能说明:
根据用户输入的行列数ROW_COL,程序随机生成一个矩阵[ROW_COL,ROW_COL],同时每个元素的值在[0,ROW_COL,ROW_COL]之间随机生成。
程序第一步可以选择的操作有:
置乱、退出,之后可以选择的操作有:
置乱、回复、退出。
当选择置乱操作时,程序会要求用户输入迭代次数,并根据这个迭代次数算出相对的置乱矩阵;当选择回复操作时,程序会给出这个矩阵的Arnold变换周期数以及当前的这个矩阵回复到原始矩阵需要的迭代次数;当选择退出操作时,程序将会退出。
源程序展示:
#include
#include
usingnamespacestd;
voidzhiLuan(int**I,intROW_COL)//置乱
{
int**I1=newint*[ROW_COL];
for(inti=0;i I1[i]=newint[ROW_COL]; for(inti=0;i for(intj=0;j I1[i][j]=0; intN=0; cout<<"请输入迭代次数: "; cin>>N; for(intk=0;k { for(inti=0;i for(intj=0;j { intx=(i*1+j*1)%ROW_COL; inty=(i*1+j*2)%ROW_COL; I1[x][y]=I[i][j]; } for(inti=0;i for(intj=0;j I[i][j]=I1[i][j]; } cout<<"置乱后的矩阵为: "< for(inti=0;i { for(intj=0;j cout< cout< } for(inti=0;i delete[]I1[i]; delete[]I1; } voidgetT(int**I,intROW_COL)//得到周期 { int**BeiI=newint*[ROW_COL];//备份比较 int**I1=newint*[ROW_COL]; for(inti=0;i { BeiI[i]=newint[ROW_COL]; I1[i]=newint[ROW_COL]; } for(inti=0;i for(intj=0;j { BeiI[i][j]=I[i][j]; I1[i][j]=0; } intN=1; for(intk=0;;k++) { for(inti=0;i for(intj=0;j { intx=(i*1+j*1)%ROW_COL; inty=(i*1+j*2)%ROW_COL; I1[x][y]=I[i][j]; } for(inti=0;i for(intj=0;j I[i][j]=I1[i][j]; boolisEqual=true; for(inti=0;i { for(intj=0;j { if(I[i][j]! =BeiI[i][j]) { isEqual=false; break; } } if(! isEqual) break; } if(! isEqual) N++; else break; } cout<<"该矩阵的周期为: "< for(inti=0;i { delete[]BeiI[i]; delete[]I1[i]; } delete[]BeiI; delete[]I1; } voidhuiFu(int**Source,int**I,intROW_COL) { int**BeiI=newint*[ROW_COL];//备份比较 int**I1=newint*[ROW_COL]; for(inti=0;i { BeiI[i]=newint[ROW_COL]; I1[i]=newint[ROW_COL]; } for(inti=0;i for(intj=0;j { BeiI[i][j]=Source[i][j]; I1[i][j]=0; } intN=1; for(intk=0;;k++) { for(inti=0;i for(intj=0;j { intx=(i*1+j*1)%ROW_COL; inty=(i*1+j*2)%ROW_COL; I1[x][y]=I[i][j]; } for(inti=0;i for(intj=0;j I[i][j]=I1[i][j]; boolisEqual=true; for(inti=0;i { for(intj=0;j { if(I[i][j]! =BeiI[i][j]) { isEqual=false; break; } } if(! isEqual) break; } if(! isEqual) N++; else break; } getT(Source,ROW_COL); cout<<"回复需要迭代的次数为: "< cout<<"矩阵复原为: "< for(inti=0;i { for(intj=0;j cout< cout< } for(inti=0;i { delete[]BeiI[i]; delete[]I1[i]; } delete[]BeiI; delete[]I1; } intmain() { srand((unsigned)time(NULL));//产生真正的随机数 intROW_COL=0; int**I; int**Source; boolcancle=false; while(true) { cout<<"请输入要创建的矩阵的长度(宽度): "; cin>>ROW_COL; I=newint*[ROW_COL]; Source=newint*[ROW_COL]; for(inti=0;i { I[i]=newint[ROW_COL]; Source[i]=newint[ROW_COL]; } for(inti=0;i for(intj=0;j { I[i][j]=rand()%(ROW_COL*ROW_COL); Source[i][j]=I[i][j]; } cout<<"初始矩阵为: "< for(inti=0;i { for(intj=0;j cout< cout< } intchoose=0; cout<<"请输入需要的操作(1: 置乱其他数字: 退出): "; cin>>choose; if(choose==1) { zhiLuan(I,ROW_COL); while(true) { intchoose=0; cout<<"请输入需要的操作(1: 置乱2: 回复其他数字: 退出): "; cin>>choose; if(choose==1) zhiLuan(I,ROW_COL); elseif(choose==2) huiFu(Source,I,ROW_COL); else { cancle=true; break; } } } else break; if(cancle) break; } for(inti=0;i { delete[]I[i]; delete[]Source[i]; } delete[]I; delete[]Source; system("pause"); return0; } 四、实验结果及分析和(或)源程序调试过程 可以看出,程序运行达到的效果符合预期,也实现了要求的功能。 总结: 通过这次实验,我了解到了Arnold变换的原理,并能有效的算出一些矩阵的Arnold变换的周期性,收获很大。 备注: 1、教师在布置需撰写实验报告的实验前,应先将报告书上的“实验题目”、“实验性质”、“实验目的”、“实验项目内容”等项目填写完成,然后再下发给学生。 2、教师在布置需撰写报告的实验项目时,应告知学生提交实验报告的最后期限。 3、学生应按照要求正确地撰写实验报告: 1)在实验报告上正确地填写“实验时间”、“实验地点”等栏目。 2)将实验所涉及的源程序文件内容(实验操作步骤或者算法)填写在“实验过程或算法(源程序)”栏目中。 3)将实验所涉及源程序调试过程(输入数据和输出结果)或者实验的分析内容填写在“实验结果及分析和(或)源程序调试过程”栏目中。 4)在实验报告页脚的“报告创建时间: ”处插入完成实验报告时的日期和时间。 5)学生将每个实验完成后,按实验要求的文件名通过网络提交(上载)到指定的服务器所规定的共享文件夹中。 每个实验一个电子文档,如果实验中有多个电子文档(如源程序或图形等),则用WinRAR压缩成一个压缩包文档提交,压缩包文件名同实验报告文件名(见下条)。 6)提交的实验报告电子文档命名为: “年级(两位数字不要“级”字)专业(缩写: 计算机科学与技术专业(计科)、网络工程专业(网络)、信息安全专业(信息)、物联网工程(物联网))班级(两位数字)学号(八位数字)姓名实验序号(一位数字).doc。 如学号为********、年级为2011级、专业为“计算机科学与技术”专业、班级为“02班”、姓名为“王宇”的学生,完成的第一次实验命名为: 11计科02班********王宇1.Doc,以后几次实验的报告名称以此类推。 4、教师(或助教)在评价学生实验时,应根据其提交的其他实验相关资料(例如源程序文件等)对实验报告进行仔细评价。 评价后应完成的项目有: 1)在“成绩”栏中填写实验成绩。 每个项目的实验成绩按照五级制(优、良、中、及格、不及格)方式评分,实验总成绩则通过计算每个项目得分的平均值获得(平均值计算时需将五级制转换为百分制优=95、良=85、中=75、及格=65、不及格=55)。 2)在“教师评价”栏中用符号标注评价项目结果(用√表示正确,用×表示错误,用≈表示半对半错)。 3)在“教师评价”栏中“评价教师签名”填写评价教师(或助教)姓名。 将评价后的实验报告转换为PDF格式文件归档。 4)课程实验环节结束后,任课教师将自己教学班的实验报告文件夹进行清理。 在提交文件夹中,文件总数为实验次数×教学班学生人数(如,教学班人数为90人,实验项目为5,其文件数为: 90×5=450)。 任课教师一定要认真清理,总数相符,否则学生该实验项目不能得分。 最后将学生提交的实验报告刻光盘连同实验成绩一起放入试卷袋存档。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 密码学 实验