密码学实验报告1.docx

上传人:b****2 文档编号:2065350 上传时间:2023-05-02 格式:DOCX 页数:17 大小:91.17KB
下载 相关 举报
密码学实验报告1.docx_第1页
第1页 / 共17页
密码学实验报告1.docx_第2页
第2页 / 共17页
密码学实验报告1.docx_第3页
第3页 / 共17页
密码学实验报告1.docx_第4页
第4页 / 共17页
密码学实验报告1.docx_第5页
第5页 / 共17页
密码学实验报告1.docx_第6页
第6页 / 共17页
密码学实验报告1.docx_第7页
第7页 / 共17页
密码学实验报告1.docx_第8页
第8页 / 共17页
密码学实验报告1.docx_第9页
第9页 / 共17页
密码学实验报告1.docx_第10页
第10页 / 共17页
密码学实验报告1.docx_第11页
第11页 / 共17页
密码学实验报告1.docx_第12页
第12页 / 共17页
密码学实验报告1.docx_第13页
第13页 / 共17页
密码学实验报告1.docx_第14页
第14页 / 共17页
密码学实验报告1.docx_第15页
第15页 / 共17页
密码学实验报告1.docx_第16页
第16页 / 共17页
密码学实验报告1.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

密码学实验报告1.docx

《密码学实验报告1.docx》由会员分享,可在线阅读,更多相关《密码学实验报告1.docx(17页珍藏版)》请在冰点文库上搜索。

密码学实验报告1.docx

密码学实验报告1

哈尔滨工程大学

实验报告

 

实验名称:

古典密码

班级:

学号:

姓名:

实验时间:

2015.6.15

成绩:

指导教师:

 

实验室名称:

哈尔滨工程大学实验室与资产管理处制

一、实验名称

古典密码算法

二、实验目的

通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。

三、实验环境(实验所使用的器件、仪器设备名称及规格)

WindowXP系统计算机,DevC++

四、实验任务及其要求

(1)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥,编写维吉尼亚密码的实现程序,实现加密和解密操作。

(2)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥,编写列置换密码的实现程序,实现加密和解密操作。

(3)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编写移位密码的实现程序,实现加密和解密操作。

(4)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥,编写周期置换密码的实现程序,实现加密和解密操作。

五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等)

1.维吉尼亚密码

#include

#include

#include

#defineMAX100

voidjiami(charm[],charc[],charkey[]){

inti,k;

k=strlen(m);

for(i=0;i

c[i]=(m[i]-'a'+key[i]-'a')%26+'a';

}

c[k]='\0';

puts(c);

}

voidjiemi(charc[],charm[],charkey[]){

inti,k;

k=strlen(c);

for(i=0;i

m[i]=(c[i]-key[i]+26)%26+'a';

}

c[k]='\0';

puts(m);

}

main(){

inti,j,k;

charm[MAX],c[MAX],key[MAX];

printf("请输入明文:

");

gets(m);

printf("请输入密钥:

");

gets(key);

i=strlen(m);

j=strlen(key);

for(k=j;k

if(i>j)

key[k]=key[k%j];

}

key[i]='\0';

puts(key);

system("PAUSE");

printf("加密后密文为:

");

jiami(m,c,key);

printf("解密后明文为:

");

jiemi(c,m,key);

system("PAUSE");

}

2.列置换密码

#include

#include

#include

#defineMAX100

charM[MAX][MAX],C[MAX][MAX];

intmain()

{

charm[MAX],c[MAX];

intkey[MAX],b[MAX],i,j,k,p,q,r,s,t;

printf("加密请输入1,解密请输入2:

");

scanf("%d",&t);

if(t==1)

{

printf("请输入明文:

");

//gets(m);

scanf("%s",m);//输入明文

p=strlen(m);//明文长度

printf("请输入矩阵阶数:

");

scanf("%d",&k);//输入矩阵的阶数

for(i=0;i

{

scanf("%d",&key[i]);//输入置换密码

}

r=0;

s=0;

i=0;

while(i

{

M[r][s]=m[i];//将明文放入置换矩阵中

s=(s+1)%k;

if(!

s)//每放入k个元素就转入下一行

{

M[r][k]='\0';

r=r+1;

}

i++;

}

M[r][s]='\0';

printf("明文矩阵为:

\n");

for(i=0;i

{

printf("%s",M[i]);

printf("\n");

}

printf("密文为:

\n");

for(i=0;i

{

for(j=0;j

{

if(M[j][key[i]-1]!

='\0')

{

printf("%c",M[j][key[i]-1]);

}

}

printf("\n");

}

}

else

{

printf("请输入置换周期:

");

scanf("%d",&k);

printf("请输入密钥:

");

for(i=0;i

{

scanf("%d",&key[i]);

}

printf("解密密钥为:

");

for(i=0;i

{

b[key[i]-1]=i+1;

}

for(i=0;i

{

printf("%d",b[i]);

}

printf("\n");

printf("请输入密文:

");

//gets(c);

j=r=s=0;

for(i=0;i

{

scanf("%s",c);

q=strlen(c);

while(i

{

C[r][s]=c[i];

r=r+1;

}

C[r][s]='\0';

s=s+1;

r=0;

}

printf("密文矩阵为:

\n");

for(i=0;i

{

printf("%s",C[i]);

printf("\n");

}

for(i=0;i

{

for(j=0;j

{

printf("%d",C[b[j]-1][i]);

}

}

}

}

3.移位密码

#include

#include

#include

#defineMAX100

charM[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

voidjiami(charm[],charc[]){

inti,k;

k=strlen(m);

for(i=0;i

if(m[i]!

='')

c[i]=M[((m[i]-'a')+3)%26];

else

c[i]=m[i];

}

c[k]='\0';

puts(c);

}

voidjiemi(charm[],charc[]){

inti,k;

k=strlen(c);

for(i=0;i

if(c[i]!

='')

m[i]=M[((m[i]-'a')-3)%26];

else

m[i]=c[i];

}

puts(m);

}

intmain(){

charm[MAX],c[MAX];

chara,b;

inti,j,k;

printf("请输入明文:

");

gets(m);

printf("加密后密文:

");

jiami(m,c);

printf("解密后密文:

");

jiemi(c,m);

system("PAUSE");

return0;

}

4.周期置换密码

#include

#include

#defineMAX100

voidmain(){

charm[MAX],c[MAX],a[MAX];

inti,j,k,n,flag,key[MAX],b[MAX];

printf("请输入明文:

");

gets(m);//输入明文

printf("请输入置换周期:

");

scanf("%d",&k);//输入置换周期

printf("请输入秘钥:

");

for(i=0;i

scanf("%d",&key[i]);//输入密钥

}

printf("加密后密文为:

");

flag=0;n=0;//初始化标记位flag和数组下标m

for(i=0;i

{

//if(m[i]!

=''){

a[flag]=m[i];//将四位明文放入数组a【4】中

flag++;

//}

if(flag==k)

{

for(j=0;j

{//周期置换

c[n+j]=a[key[j]-1];

}

n=n+k;

flag=0;

}

}

c[strlen(m)]='\0';

puts(c);

printf("解密密钥为:

");

for(i=0;i

b[key[i]-1]=i+1;

}

for(i=0;i

printf("%d",b[i]);

}

printf("\n");

for(i=0;i

{

a[flag]=c[i];//将四位密文放入数组a【4】中

flag++;

if(flag==k)

{

for(j=0;j

{//周期置换

m[n+j]=a[key[j]-1];

}

n=n+k;

flag=0;

}

}

m[strlen(c)]='\0';

puts(m);

system("PAUSE");

}

六、实验步骤

1.维吉尼亚密码

维吉尼亚密码(VigenereCipher)是一种多表代替密码,其本质是周期移位密码。

维吉尼亚密码的(用户)密钥为一含有d个字母的有限字母序列k=k0k1…kd-1

加密时,首先将用户密钥进行周期扩展(周期为d),扩展后的无限字母序列称为工作密钥,记为K=K0K1…Ki…其中Ki=Kimodd,i=0,1,…

当d=1时,维吉尼亚密码就是移位密码。

对于含有l个字母的明文,维吉尼亚加密过程可以表示为:

ci=(mi+Ki)modn其中,M=m0m1…mi…ml-1为明文,C=c0c1…ci…cl-1为密文,K=K0K1…Ki…Kl-1为工作钥,n为明文字母表的长度,l为明文长度(含有字母的数目)。

例如,使用用户钥cat,对明文“vigenerecipher”进行维吉尼亚加密。

此时,n=26(对应英文字母表),用户钥c=3、a=0、t=19,得到的密文为“xizgnxtevkpagr”。

置换(Permutation)是古典密码中另一种基本的处理技巧,就是将明文中的字母重新排列,字母本身不变,只是改变其位置。

置换密码(SubstitutionCipher)就是使用置换法进行加解密的密码算法,也称为换位密码。

置换密码的密钥是一个置换,它表示了明文字母在密文中出现的位置。

例如,使用密钥π=(3421),对明文“ming”进行加密,得到的密文为“ngim”。

2.列置换密码

列置换密码也称为矩阵置换密码。

其加解密方法如下:

把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,…,m的一个置换π交换列的位置次序,再按垂直方向(即按列)读出即得密文。

解密就是将密文按相同的宽度m垂直在写在纸上,按置换π

的逆置换π−1交换列的位置次序,然后水平地读出得到明文。

置换π就是密钥。

例如,

明文:

mingchenjiudianfadongfangong

密钥:

yulanhua

加密:

去掉密钥重复字母得yulanh,得到密钥字母顺序653142

得出距阵列数为6,将明文按行填充距阵

按列(依顺序)写出距阵中的字母。

密文:

giffghddn0njngncuaa0inanomeiog(其中0为无效字符)

解密:

加密的逆过程

3.移位密码

移位密码(ShiftCipher)是一种典型的单表替代密码,也称为加法密码。

移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第k个字母替代,它的加密过程可以表示为:

c=(m+k)modn

其中,m为明文字母在字母表中的位置数;n为字母表中的字母总数;k为密钥;c为密文字母在字母表中对应的位置数。

相应的,移位密码的解密过程可以表示为:

m=(c-k)modn

移位密码的一个典型代表就是凯撒密码(CeaserCipher),它是k=3时的移位密码。

使用英文字母表的撒密码的加(解)密可以表示为:

m=(c+3)mod26m=(c-3)mod26,例如,

明文:

attacksatnineam

密钥:

3

加密:

将明文分组对每一个密文字母,依英文字母表,用其右的第3个字母代替

密文:

dwwdfnvdwqlqhdp

另外,使用凯撒密码加密后的密文“dwwdfnvdwilyhsp”,其明文为“attacksatfivepm”。

4.周期置换密码

周期置换密码是将明文字母按一定长度m进行分组,把每个分组中的字母按1,2,…,m的一个置换π重排位置次序来得到密文的一种加密方法。

其中的密钥就是置换π,在π的描述中包含了分组长度的信息。

解密时,对密文字符按长度m进行分组,并按π的逆置换π−1

把每组字符重排位置次序来得到明文。

例如,

明文:

mingchenjiudianfadongfangong

加密密钥:

3421(i=1,2,3,4的一个置换π(i)=3,4,2,1)

加密:

将明文分组(4个字母一组),然后根据加密密钥给定的置换,对每个明文分组进行置换

mingchenjiudianfadongfangong

ngimenhcudijnfaiondaanfgngog

密文:

ngimenhcudijnfaiondaanfgngog

解密密钥:

4312(3412的逆置换)

七、实验过程与分析

1.维吉尼亚密码

2.列置换密码

3.移位密码

4.周期置换密码

八、实验结果总结

代替(Substitution)是古典密码中最基本的处理技巧,就是将明文字母由其他字母表中的字母替换的一种方法。

代替密码(SubstitutionCipher)就是使用代替法进行加解密的密码算法。

代替密码的密钥是一个替换表,它表示了明文字母与密文字母的对应关系。

加密时,通过查表,明文字母被逐个替换后,生成看似无任何意义的字母串,即密文。

解密时,逆向使用替换表,将密文字母逐个替换为明文字母。

按照一个明文字母是否总是被一个固定的字母代替进行划分,代替密码可分为两类:

(1)单表代替密码(MonoalphabeticSubstitutionCipher):

明文中出现的同一个字母,不管它出现在什么位置,在加密时都用相同的字母来代替。

移位密码就是单表代替密码。

(2)多表代替密码(PolyalphabeticSubstitutionCipher):

明文中出现的同一个字母,在加密时不是完全被相同的字母代替,而会根据其出现的位置次序用不同的字母代替。

维吉利亚密码就是多表代替密码。

九、心得体会

通过本次实验,我了解了古典密码的编译以及对于古典密码的明文加密和密文解密的流程,并为以后的密码算法编程打好基础。

更加熟悉的了解c语言环境的编程方式。

学生自评

项目

评定内容

评定结果

1、实验准备情况

2、预习报告完整性

()优秀

()良好

()中等

()及格

()不及格

1、实验规范性

2、实验原理掌握

3、调试排错能力

4、操作熟练程度

5、演示与答辩

6、设计创新能力

()优秀

()良好

()中等

()及格

()不及格

1、报告内容完整性

2、报告内容组织结构

3、报告文字表达

4、实验过程与分析

5、图表规范性

6、字迹与版面

()优秀

()良好

()中等

()及格

()不及格

实验成绩

()优秀()良好()中等

()及格()不及格

学生签字:

日期:

注:

根据自己所做实验情况,实事求是的给出“评定结果”和“实验成绩”,在相应等级的()内填入■。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2