凯撒密码和playfair密码-实验报告(共11页).doc
精选优质文档-倾情为你奉上一预习准备1. 实验目的 (1). 熟记古典对称密码的概念和特点;(2). 理解若干种古典密码体制的原理; (3). 掌握维吉尼亚及Playfair密码体制的编程实现。 2. 实验环境Widows7操作系统、Microsoft Visual Studio 2010 (选择自己熟悉的编程语言和环境)3. 实验内容和要求(1)实验内容1. 实现维吉尼亚密码体制;2. 实现Playfair密码体制。 (2) 实验要求1复习课本/课件相关内容。 2程序中不能固定密钥词,即用户可自行输入密钥词,然后对输入的明文进行加密,或对输入的密文进行解密二. 编程思路(实验原理)维吉尼亚密码原理:引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。Playfair原理:根据下列规则一次对明文的两个字母加密: (1)、属于相同对中的重复的明文字母将用一个填充字母进行分隔,因此,词balloon将被加密为ba lx lo on。 (2)、属于该矩阵相同行的明文字母将由其右边的字母替代,而行的最后一个字母由行的第一个字母代替。例如,ar被加密为RM。 (3)、属于相同列的明文字母将由它下面的字母代替,而列的最后一个字母由列的第一个字母代替。例如,mu被加密为CM。 (4)、否则,明文的其他字母将由与其同行,且与下一个同列的字母代替。因此,hs成为BP,ea成为IM(或JM,这可根据加密者的意愿而定)。 三. 实验总结 1. 实验程序(详细设计)维吉尼亚代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 80int main(void)char messageN; int n,i; int length;printf("明文:");gets(message); printf("密钥:");scanf("%d",&n);printf("明文:"); puts(message); printf("n");length=strlen(message);for(i=0;i<length;i+)if(messagei>='A' && messagei<='Z')messagei=(messagei-'A')+n)%26+'A'else if(messagei>='a' && messagei<='z')messagei=(messagei-'a')+n)%26+'a'else continue;puts("密文:"); puts(message);printf("n");return 0;Playfair代码:void encrypt() int i,k;const int N=100;char letters26="ABCDEFGHIKLMNOPQRSTUVWXYZ"/用于填充矩阵int flag25=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/字母是否已在矩阵中,与letters数组对应char ch55;/5X5矩阵char ch1N;/密钥char ch2N;/明文char ch4;/无关字符int len='a'-'A'cout<<"输入密钥:"cin>>ch1;int flg=1;while(flg=1)for(int i=0;i<strlen(ch1);i+)/把所输入的密钥转化为大写字母if(ch1i>'z'|ch1i<'a')cout<<"请重新选择操作:"<<endl;flg=0;break;elsech1i=ch1i-len; if(flg=1)for(i=0;i<strlen(ch1);i+)if(ch1i='J')ch1i='I'i=0;int j=0;for(int k=0;k<strlen(ch1);k+)for(int t=0;t<25;t+)if(ch1k=letterst&&flagt=0)chij=letterst;flagt=1;if(j<4)j+;else i+;j=0;for( k=0;k<25;k+)if(flagk=0)chij=lettersk;flagk=1;if(j<4)j+;elsei+;j=0;cout<<"密钥填充后的矩阵为: "<<endl;for(i=0;i<5;i+) for(j=0;j<5;j+)cout<<chij;cout<<" "if(j=4)cout<<endl;cout<<endl;cout<<"请输入明文(请输入英文字符):"cin>>ch2;cout<<"输入一个无关字符:"cin>>ch4;if(ch4>='a')ch4=ch4-len;for(k=0;k<strlen(ch2);k+)/把所输入的明文转化为大写字母if(ch2k>='a')ch2k=ch2k-len;for(k=0;k<strlen(ch2);k+)/把明文中的J都变为Iif(ch2k='J')ch2k='I'/为明文添加必要的无关字符以防止同一组的两个字符相同for( k=0;k<strlen(ch2);k+=2)if(ch2k=ch2k+1)for(int t=strlen(ch2);t>k;t-)ch2t+1=ch2t;ch2k+1=ch4;/若明文有奇数个字符,则添加一个无关字符以凑够偶数个if(strlen(ch2)%2!=0)ch2strlen(ch2)+1=ch2strlen(ch2);/字符串结尾赋'0'ch2strlen(ch2)=ch4;/明文串尾插入无关字符cout<<"经过处理后的明文为:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1<<" "cout<<endl;cout<<"其最终长度为:"<<strlen(ch2)<<endl;/明文输入并整理完毕/for(k=0;k<strlen(ch2);k+=2)int m1,m2,n1,n2;for(m1=0;m1<=4;m1+)for(n1=0;n1<=4;n1+)if(ch2k=chm1n1)break;if(ch2k=chm1n1)break;for(m2=0;m2<=4;m2+)for(n2=0;n2<=4;n2+)if(ch2k+1=chm2n2)break;if(ch2k+1=chm2n2)break;m1=m1%5;m2=m2%5;if(n1>4)n1=n1%5;m1=m1+1;if(n2>4)n2=n2%5;m2=m2+1;if(m1=m2)ch2k=chm1(n1+1)%5;ch2k+1=chm2(n2+1)%5;elseif(n1=n2)ch2k=ch(m1+1)%5n1;ch2k+1=ch(m2+1)%5n2;elsech2k=chm1n2;ch2k+1=chm2n1;cout<<"加密后所得到的密文是:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1<<" "cout<<endl;else break;/解密算法void decrypt() int i,k;const int N=100;char letters26="ABCDEFGHIKLMNOPQRSTUVWXYZ"/用于填充矩阵int flag25=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/标记字母是否已在矩阵中,与letters数组对应char ch55;/5X5矩阵char ch1N;/密钥char ch2N;/密文int len='a'-'A'int flg=1;cout<<"输入密钥:"cin>>ch1;while(flg=1)for(int i=0;i<strlen(ch1);i+)/把所输入的密钥转化为大写字母if(ch1i>'z'|ch1i<'a')cout<<"请重新选择操作:"<<endl;flg=0;break;elsech1i=ch1i-len; if(flg=1)for(i=0;i<strlen(ch1);i+)/把密钥中的J都变为Iif(ch1i='J')ch1i='I'i=0;int j=0;/把密钥中的字母填入到矩阵中,并把该字母标记为已用for(int k=0;k<strlen(ch1);k+)for( int t=0;t<25;t+)if(ch1k=letterst&&flagt=0)chij=letterst;flagt=1;if(j<4)j+;else i+;j=0;for( k=0;k<25;k+)/按字母表顺序把未用字母依次填入到矩阵中if(flagk=0)chij=lettersk;flagk=1;if(j<4)j+;elsei+;j=0;cout<<"密钥填充后的矩阵为: "<<endl;for(i=0;i<5;i+)for(j=0;j<5;j+)cout<<chij;cout<<" "if(j=4)cout<<endl;cout<<endl;/矩阵生成完毕/int f=0;docout<<"请输入密文(英文字符):"cin>>ch2;for(int k=0;k<strlen(ch2);k+)/把所输入的密文转化为大写字母if(ch2k>='a')ch2k=ch2k-len;for( k=0;k<strlen(ch2);k+)/把密文中的J都变为Iif(ch2k='J')ch2k='I'for( k=0;k<strlen(ch2);k+=2)if(ch2k=ch2k+1)cout<<"同一分组中不能出现相同字符!请重新输入。"<<endl;f=1;break;else f=2;if(f=1)continue;if(strlen(ch2)%2!=0)cout<<"字符串不能为奇数个!请重新输入。"<<endl;f=1;else f=2;while(f=1);/解密开始for( k=0;k<strlen(ch2);k+=2)int m1,m2,n1,n2;for(m1=0;m1<=4;m1+)for(n1=0;n1<=4;n1+)if(ch2k=chm1n1)break;if(ch2k=chm1n1)break;for(m2=0;m2<=4;m2+)for(n2=0;n2<=4;n2+)if(ch2k+1=chm2n2)break;if(ch2k+1=chm2n2)break;m1=m1%5;m2=m2%5;if(n1>4)n1=n1%5;m1=m1+1;if(n2>4)n2=n2%5;m2=m2+1;if(m1=m2)ch2k=chm1(n1+4)%5;ch2k+1=chm2(n2+4)%5;elseif(n1=n2)ch2k=ch(m1+4)%5n1;ch2k+1=ch(m2+4)%5n2;elsech2k=chm1n2;ch2k+1=chm2n1;cout<<"解密后所得到的明文是:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1<<" "cout<<endl; else break;2. 实验结果运行程序,通过调用函数执行一系列所需要的操作,程序运行正常,截图如下:专心-专注-专业