置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。
例如:明文:asdfghjklmnbvc
密钥:31524
首先把弄清密钥长度,然后将密文分组即
明文矩阵:
a s d f g
h j k l m
n b v c
不足的用空格代替
得到密文:dkvahngm sjbflc;
其中解密密钥得到方式为用密钥的顺序(12345)写出下方正常排序的(12345)例1-2,2-4,3-1····
3 1 5 2 4
1 2 3 4 5
解密密钥:2 4 1 5 3
解密的时候也是一样,先求出转换为矩阵有多少行,然后先将列排满然后再将行排满;
例如上面的密文 dkvahngm sjbflc,加上空格共有15个字符所以分为3行5列,得到矩阵:
d a g s f
k h m j l
v n b c ;
然后用解密密钥逐行输出:第一行:asdfg
第二行:hjklm
第三行:nbvc ;
若有空格则跳过输出。
代码:
/*日期:2018.3.29*/
/*编译:李威鹏*/
/*作用:置换密码的实现*/
/*使用函数:头文件:<conio.h><stdio.h><string.h><stdlib.h><algorithm>函数名:加密函数,解密函数*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char mingwen[10000],miwen[10000],mingwenjuzhen[1000][1000],miwenjuzhen[1000][1000],miyao[10000];
void shouye()
{system("cls");printf("欢迎使用置换密码转换程序!\n");printf("请选择使用功能:\n");printf("1:加密 2:解密\n");printf(" 0:终止程序\n");
}
void jiemi();
void jiami()
{system("cls");printf("请输入明文\n");scanf("%s",mingwen);printf("请输入数字密钥n(0<n<10)\n");int n,l,k=0,l1=0,i,j,q=1,w=0,aa=0,bb=0,a[10000]= {0};scanf("%d",&n);while(n){k++;miyao[k]=n%10;n/=10;}printf("密钥为:\n");for(i=k; i>=1; i--){a[k-i+1]=miyao[i];printf("%d ",miyao[i]);}printf("\n");l=strlen(mingwen);if(l%k!=0)//计算矩阵行数aa=l/k+1;elseaa=l/k;if(aa==1){printf("密文为:\n\n");for(i=1; i<=k; i++){for(j=0; j<l; j++){if(a[i]==j+1){printf("%c",mingwen[j]);}}}}else{for(i=0; i<aa;){if(i==aa-1)break;for(j=0; j<l; j++){mingwenjuzhen[i+1][q++]=mingwen[j];w++;if(w==k){i++;w=0;q=1;}}}printf("密文为:\n\n");for(i=k; i>=1; i--){for(j=1; j<=aa; j++){printf("%c",mingwenjuzhen[j][miyao[i]]);}}}printf("\n\n");printf("解密密钥为:\n");for(i=1; i<=k; i++){for(j=1; j<=k; j++){if(i==a[j]){printf("%d ",j);}}}printf("\n");printf("是否继续?\n");printf("1:继续 2:解密 3:返回主菜单\n");int mm;scanf("%d",&mm);if(mm==1)jiami();if(mm==2)jiemi();if(mm==3)shouye();
}
void jiemi()
{system("cls");printf("请输入密文:\n");getchar();gets(miwen);int i,j,m,l,k=0,b[1000]= {0},aa=0,q=1,w=0,bb=0;char s1[1000]= {0};l=strlen(miwen);//密文长度printf("请输入解密密钥m(0<m<10)\n");scanf("%d",&m);while(m){k++;miyao[k]=m%10;m/=10;}printf("解密密钥为:\n");for(i=k; i>=1; i--){b[k-i+1]=miyao[i];printf("%d ",miyao[i]);}printf("\n");if(l%k==0)//计算矩阵行数aa=l/k;elseaa=l/k+1;if(aa==1){for(i=0; i<l; i++){if(miwen[i]==' ')continue;elses1[bb++]=miwen[i];}printf("明文为:\n\n");for(i=1; i<=k; i++){for(j=0; j<l; j++){if(b[i]==j+1)printf("%c",s1[j]);}}}else{for(i=0; i<l;){for(j=0; j<k; j++){for(int r=0; r<aa; r++){miwenjuzhen[r+1][j+1]=miwen[i];i++;}}}printf("明文是:\n\n");for(i=1; i<=aa; i++){for(j=1; j<=k; j++){if(miwenjuzhen[i][b[j]]==' ')continue;elseprintf("%c",miwenjuzhen[i][b[j]]);}}printf("\n\n");}printf("密钥为:\n");for(i=1; i<=k; i++){for(j=1; j<=k; j++){if(i==b[j]){printf("%d ",j);}}}printf("\n是否继续?\n");printf("1:继续 2:加密 3:返回主菜单\n");int mm;scanf("%d",&mm);if(mm==1)jiemi();if(mm==2)jiami();if(mm==3)shouye();
}
void choose()
{int test=1;while(test)//对于菜单的选择{printf("请输入选择:\n");int n;scanf("%d",&n);if(n==1){jiami();}else if(n==2){jiemi();}else if(n==0){printf("欢迎使用!!\n");test=0;return;}else{printf("输入错误!\n请重新输入!");choose();}}
}
int main()
{shouye();choose();return 0;
}