playfair加密算法
来源:互联网 发布:英语 荷兰语知乎 编辑:程序博客网 时间:2024/09/21 08:57
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream.h>#define NUM 1000 int main(){int i,j,k=0,m,n,temp=0,length,u1,v1,choice;char key[NUM],voa[26];char table[5][5];char word[NUM];//printf("%d",'z');cout<<"密钥: "<<endl;scanf("%s",key); //输入密钥并生成密钥矩阵length=strlen(key); for(i=0;i<length;i++){ if(key[i]=='j') key[i]='i';} for(i=0;i<length;i++){for(j=i+1;j<length;j++) if(key[i]==key[j]) { for(int t=j;t<length;t++) { key[t]=key[t+1]; } j--; length--; //找到key中的重复部分,删去,减少长度。 } if(j==1) { key[j]=0; break; }} // printf("%d\n",length);for(i=0;i<26;i++){ voa[i]=65+i; //输入是小写形式,转换成大写字母。}for(i=0;i<length;i++){ key[i]=key[i]-32;} char p;int count=0;for(i=0;i<26;i++){ p=voa[i]; for(j=0;j<length;j++) { if(p==key[j]) { key[i+length]=p; count+=1; break; } //printf("%d",count); } if(j==length) { key[i+length-count]=p; } }int u=0;for(i=0;i<26;i++){ if(key[i]=='J') { for(u=i;u<26;u++) { key[u]=key[u+1]; } } if(key[i]=='I') key[i]='I'; //printf("%c",word[i]); }temp=0;for(i=0;i<5;i++){ for(j=0;j<5;j++) { table[i][j]=key[j+temp]; printf("%c ",table[i][j]); if(j==4) { temp+=5; printf("\n"); } }} //以上部分用以得出置换表。 printf(“\n请选择操作\n1、已知明文求密文\n2、已知密文求明文\n”); scanf(“%d”,&choice);if(choice==1){ cout<<"明文(请省略空格): "<<endl;scanf("%s",word);length=strlen(word);//printf("%d\n",length); int counter=0;for(i=0;i<length;){ if(word[i]==word[i+1]) { i+=1; counter+=1; } else i+=2; } //printf("1:%d\n",length+counter);for(i=0;i<length+counter;i+=2){ if(word[i]==word[i+1]) //如果相邻字母相同,在中间加上q { for(j=length+counter-1;j>i+1;j--) { word[j]=word[j-1]; } word[i+1]='q'; }} length=length+counter; if(length%2!=0) //如果明文字母是奇数位,在末尾加上"q"{ word[length]='q'; length+=1;} for(k=0;k<length;k++){ word[k]=word[k]-32; }for(i=0;i<length;i++) //如果明文是i和j,显示I { if(word[i]=='I'||word[i]=='J') { word[i]='I'; }} for(k=0;k<length;k++) //查找明文中字母对应于置换表中的位置{ for(i=0;i<5;i++) for(j=0;j<5;j++) { if(word[k]==table[i][j]) {m=i; n=j; } if(word[k+1]==table[i][j]) {u1=i;v1=j; } } if((m==u1)&&(n!=v1)) //两字母同行不同列 {word[k]=table[m][(n+1)%5]; word[k+1]=table[u1][(v1+1)%5]; } else if((m!=u1)&&(n==v1)) //两字母同列不同行 {word[k]=table[(m+1)%5][n]; word[k+1]=table[(u1+1)%5][v1]; } else if((m!=u1)&&(n!=v1)) //两字母既不同行也不同列 { word[k]=table[m][v1]; word[k+1]=table[u1][n]; } k++;} cout<<"密文: "<<endl;for(k=0;k<length;k++){ if(k%6==0) printf("\n"); printf("% 4c ",word[k]);} } if(choice==2){ cout<<"密文(请省略空格): "<<endl;scanf("%s",word);length=strlen(word);//printf("%d\n",length); for(k=0;k<length;k++) //查找密文中字母对应于置换表中的位置{ for(i=0;i<5;i++) for(j=0;j<5;j++) { if(word[k]==table[i][j]) {m=i; n=j; } if(word[k+1]==table[i][j]) {u1=i;v1=j; } } if((m==u1)&&(n!=v1)) //两字母同行不同列 {word[k]=table[m][(n-1+5)%5]; word[k+1]=table[u1][(v1-1+5)%5]; } else if((m!=u1)&&(n==v1)) //两字母同列不同行 {word[k]=table[(m-1+5)%5][n]; word[k+1]=table[(u1-1+5)%5][v1]; } else if((m!=u1)&&(n!=v1)) //两字母既不同行也不同列 { word[k]=table[m][v1]; word[k+1]=table[u1][n]; } k++;} cout<<"明文: "<<endl;for(k=0;k<length;k++){ if(k%6==0) printf("\n"); printf("L ",word[k]);} } printf("\n"); system("pause");return 0;}
0 0
- playfair加密算法
- Playfair 加密算法
- Playfair Cipher
- playfair 加密
- Playfair密码
- Playfair密码
- Playfair密码
- 密码学---PlayFair
- playfair密码
- playfair加密
- Playfair密码
- playFair密码
- playfair密码
- Playfair密码
- [古典密码]:PlayFair cipher(Playfair密码)
- 密码学(playfair)
- C基础/PlayFair加密
- Playfair密码变种加密
- 笔记23 Fragment使用详解及心得--Fragment的生命周期
- Js对Date对象操作详解
- 【C++数据类型】C++中数组名的二义性
- Git配置用户名、邮件地址访问GitHub
- 数据存储2
- playfair加密算法
- java反射学习-以demo加理伦
- Java常用排序算法/程序员必须掌握的8大排序算法
- swift 阿拉伯数字转为汉字
- ZF_20160921_Topcoder
- 计算器事件
- jvm
- APP的六种loading加载样式,全在这
- 单链表逆序详解