优质密码实验报告2 800字精选word文档 13页.docx
《优质密码实验报告2 800字精选word文档 13页.docx》由会员分享,可在线阅读,更多相关《优质密码实验报告2 800字精选word文档 13页.docx(10页珍藏版)》请在冰豆网上搜索。
优质密码实验报告2800字精选word文档13页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
密码实验报告2(800字)
该实验为验证性实验。
通过本实验,使学生对于两种基本的古典密码编码方法(“代替”与“移位”)产生深刻的感性认识,体验清楚二者之间的本质差异,为理解和掌握现代密码的相应知识打下良好基础。
二、实验内容
1.设计一个周期3的多表代替密码并予以实现,要求:
第1个表由密钥字法产生(密钥字自拟),第2个表由洗牌法产生(注意,字母a~z与数字0~25一一对应,洗牌法即相当于实验一的方法1(n=25)),第三个表由公式法产生(数学公式自拟,注意它须是Z26上的一个一一变换)。
2.设计一个周期5的16-置换移位密码并予以实现,要求:
5个16-置换至少有一个是由实验一(n=15)提供的两个方法以外、自行设计的其它方法产生。
三、实验要求
1.上述两个古典密码的编程实现,须能对下面一段明文进行正确加密(对代替密码,空格和标点符号保持不动;对移位密码,空格和标点符号也移位):
Qisasymmetricblockcipher.Itisdefinedforablocksizeof128bits.Itallowsarbitrarylengthpasswords.Thedesignisfairlyconservative.Itconsistsofasimplesubstitution-permutationnetwork.Inthispaperwepresentthecipher,itsdesigncriteriaandouranalysis.ThedesignisbasedonbothRjindaelandSerpent.Itusesan8-bits-boxfromRjindaelwiththelinearmixinglayersreplacedwithtwoSerpentstylebit-slices-boxesandalinear
permutation.ThecombinationofmethodseliminatesthehighlevelstructureinherentinRjindaelwhilehavingbetterspeedandavalanchecharacteristicsthanSerpent.SpeedisimprovedoverSerpent.Thisversion2.00containsbetteranalysis,editorialchanges,andanimprovedkeyschedulingalgorithm.Thenumberofrecommendedroundsisalsoincreased.
2.抓图显示密文(附页),不能出现明显错误。
四、实验步骤
1.通过预习和老师在实验课上的讲解,理解代替密码和移位密码的本质差别,对程序的作用有初步了解;
2.分析实验指导书上所列代码,搞清楚各个子函数的功能、理清程序的大体思路;
3.将主函数与各个子函数进行合并整合,处理编译上出现的语法问题,使编译可以顺利通过;
4.完善程序,输入数据对程序的逻辑功能进行验证,测试随机数结构调用是否完整,测试结果是否符合对应的加密要求,验证打开关闭文件是否顺利。
六、思考题
“代替表”与“置换”的不动点、逆等是否一致?
答:
不一致。
代替是约定明文集合到另一集合的关系,不一定是原来的集合,而移位是在明文集合中进行随机排列然后得到的密文。
两者的不动点、逆等只有在统一集合变换时才可能一致。
七、实验代码及运行结果
实验代码:
1.代替密码
#include
#include
#include
#include
#include
/*声明子函数*/
unsignedchar*full_array2(charn);/*fully_array函数产生随机数*/intletter_to_digit(charc);
chardigit_to_letter(intn);
unsignedchar*KeyGen_s();
voidEncrypt_s(unsignedchar*key);
/*主函数*/
intmain()
{
printf("---------代替密码加密算法---------\n");
Encrypt_s(KeyGen_s());
system("pause");
return0;
}
unsignedchar*full_array2(charn)/*fully_array函数产生随机数*/{
intm,i,j,k,l=0,flag;
staticunsignedcharP[256];
start:
printf("\n请输入不小于%d的所有随机数个数:
\n",n+1);
scanf("%d",&m);
if(m<=n)
{
printf("\n输入数%d比%d小,须重新输入!
\n",m,n+1);
gotostart;
}
srand((unsigned)time(NULL));/*初始化随机种子*/
for(i=0;i{
P[l++]=(unsignedchar)(rand()%(n+1));
for(j=0;j{
if(P[j]==P[l-1])
{
l--;
break;
}
}
}
k=l;
for(i=0;i<=n;i++)
{
flag=0;
for(j=0;jif(P[j]==i)
{
flag=l;
break;
}
if(!
flag)
{
P[l]=i;
l++;
}
}
return(P);
}
intletter_to_digit(charc)
{
inti;
charalphabet[27]={"abcdefghijklmnopqrstuvwxyz"};for(i=0;i<26;i++)if(tolower(c)==alphabet[i])return(i);
return(-1);
}
chardigit_to_letter(intn)
{
charalphabet[27]={"abcdefghijklmnopqrstuvwxyz"};
if(n<0||n>25)return(0);
return(alphabet[n]);
}
unsignedchar*KeyGen_s()
{
charKeyWords[106];
charChoiceWords[26];
unsignedchar*p;
staticunsignedcharKeyTab[26*3];
inti,j,k,l;
printf("\n请输入密钥字:
\n");
gets(KeyWords);
strcat(KeyWords,"abcdefghijklmnopqrstuvwxyz");
k=0;
l=strlen(KeyWords);
ChoiceWords[k]=tolower(KeyWords[0]);
for(i=1;i{
if(letter_to_digit(KeyWords[i])==-1)continue;
ChoiceWords[++k]=tolower(KeyWords[i]);for(j=0;jif(ChoiceWords[j]==ChoiceWords[k])
{
k--;
break;
}
}
for(i=0;i<26;i++)
KeyTab[i]=(unsignedchar)letter_to_digit(ChoiceWords[i]);
p=full_array2(25);
for(i=0;i<26;i++)
KeyTab[26+i]=p[i];
for(i=0;i<26;i++)
KeyTab[52+i]=(unsignedchar)((7*i+3)%26);
return(KeyTab);
}
voidEncrypt_s(unsignedchar*key)
{
inti;
FILE*fp;
charfilename[20],c;
start:
printf("\n请输入待加密文本文件名:
\n");
scanf("%s",filename);
if((fp=fopen(filename,"rt"))==NULL)
{
printf("没有找到文件:
%s\n",filename);
gotostart;
}
printf("\n密文如下:
\n");
i=0;
while((c=fgetc(fp))!
=EOF)
{
if(letter_to_digit(c)==-1)
{
putchar(c);
continue;
}
//公式选为7*i+3(mod26)
isupper(c)?
putchar(toupper(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]))):
\
putchar(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]));i++;
if(i>=26*3)i=0;
}
fclose(fp);
}
2.移位密码
#include
#include
#include
#include
#include
/*声明子函数*/
unsignedchar*full_array2(charn);
intletter_to_digit(charc);
chardigit_to_letter(charn);
unsignedchar*KeyGen_p();
voidEncrypt_p(unsignedchar*key);
/*主函数*/
intmain()
{
printf("---------移位密码加密算法---------\n");
Encrypt_p(KeyGen_p());
system("pause");
return0;
}
unsignedchar*full_array2(charn)/*fully_array函数产生随机数*/{
intm,i,j,k,l=0,flag;
staticunsignedcharP[256];
start:
printf("\n请输入不小于%d的所有随机数个数:
(周期为5)\n",n+1);scanf("%d",&m);
if(m<=n)
{
printf("\n输入数%d比%d小,须重新输入!
\n",m,n+1);
gotostart;
}
srand((unsigned)time(NULL));/*初始化随机种子*/
for(i=0;i{
P[l++]=(unsignedchar)(rand()%(n+1));
for(j=0;j{
if(P[j]==P[l-1])
{
l--;
break;
}
}
}
k=l;
for(i=0;i<=n;i++)
{
flag=0;
for(j=0;jif(P[j]==i)
{
flag=l;
break;
}
if(!
flag)
{
P[l]=i;
l++;
}
}
return(P);
}
intletter_to_digit(charc)/*将字母转化为数字*/
{
inti;
charalphabet[27]={"abcdefghijklmnopqrstuvwxyz"};for(i=0;i<26;i++)if(tolower(c)==alphabet[i])return(i);
return(-1);
}
chardigit_to_letter(charn)/*将数字转化为字母*/
{
charalphabet[27]={"abcdefghijklmnopqrstuvwxyz"};
if(n<0||n>25)return(0);
return(alphabet[n]);
}
unsignedchar*KeyGen_p()/*产生密钥*/
{
unsignedchar*p;
staticunsignedcharKeyTab[16*5];
inti,j;
for(i=0;i<5;i++)
{
p=full_array2(15);
for(j=0;j<16;j++)
KeyTab[16*i+j]=p[j];
}
return(KeyTab);
}
voidEncrypt_p(unsignedchar*key)/*实现明文加密*/
{
inti,j;
FILE*fp;
charfilename[20],c;
chard[16];
start:
printf("\n请输入待加密文本文件名:
\n");
scanf("%s",filename);
if((fp=fopen(filename,"rt"))==NULL)
{
printf("没有找到文件:
%s\n",filename);gotostart;}
printf("\n密文如下:
\n");
i=0;
while((c=fgetc(fp))!
=EOF)
{
d[i%16]=c;
i++;
if(i%16!
=0)continue;
for(j=0;j<16;j++)
putchar(d[key[(int)(((i-1)/16)*16+j)]]);if(i>=16*5)i=0;}
if(i%16!
=0)
{
for(j=i%16;j<16;j++)d[j]='*';
for(j=0;j<16;j++)
putchar(d[key[(int)((i/16)*16+j)]]);
}
putchar('\n');
fclose(fp);
}
附录:
运行结果截图
∙荐计算机上机实验内容及实验报告要求
∙荐构建学校德育管理与评价体系的实验报告
∙荐化学实验报告格式
∙荐大学物理实验课程设计实验报告
∙荐电路实验报告要求