置换密码 古典加密算法 信息安全

置换密码

置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。置换密码有时又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attackbeginsatfive,密钥为cipher,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:

根据密钥cipher中各个字母在字母表中出现的先后顺序,给定一个置换:

根据上面的置换,将原有居住中的字母按照第1列、第4裂、第5裂、第3裂、第2列、第6列的顺序排列,则有下面的形式:

从而得到密文:abatgftetcnvaiikse

其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

#include<iostream>

#include<cstring>

usingnamespacestd;

voidjiami()

{

charstr[100];

charstr1[100];

chara[100];

cout<<"请输入您的密钥:"<<endl;

cin.get();//每次在重新输入前必须加这个!

cin.get(str,100);

cout<<"请输入您的明文:"<<endl;

cin.get();

cin.get(a,100);

intlen=strlen(str);

charb[100][100];

charc[100][100];

chard[100][100];

intj=0;

intt=0;

intj1;

intt1;

for(inti=0;a[i]!='\0';i++)

{

if(a[i]!=''){

b[j][t]=a[i];

c[j][t]=a[i];

t++;

if(t>=len)

{

t=0;

j++;

}

j1=j;

t1=t;

}

else{};

}

strcpy(str1,str);

for(inti=0;i<len;i++)

{

for(intj=0;j<len-i-1;j++)

{

if(str1[j]>str1[j+1])

{

charch=str1[j];

str1[j]=str1[j+1];

str1[j+1]=ch;

}

}

}

for(inti=0;i<len;i++)

{

for(intj=0;j<len;j++)

{

if(str[i]==str1[j])

{

for(intx=0;x<j1;x++)

{

c[x][i]=b[x][j];

}

}

}

}

for(inti=0;i<j1;i++)

{

strcpy(d[i],c[i]);

}

for(inti=0;i<len;i++)

{

for(intj=0;j<len;j++)

{

if(str[i]==str1[j])

{

for(intx=0;x<j1;x++)

{

d[x][i]=c[x][j];

}

}

}

}

cout<<"经置换算法后的密文为:"<<endl;

for(inti=0;i<len;i++)

{

for(intj=0;j<j1;j++)

cout<<d[j][i]<<"";

}

}

voidjiemi()

{

charstr[100];

charstr1[100];

chara[100];

cout<<"请输入您的密钥:"<<endl;

cin.get();

cin.get(str,100);

cout<<"请输入您的密文:"<<endl;

cin.get();

cin.get(a,100);

intlen=strlen(str);

intlen1=strlen(a);

intle=len1/len;

charb[100][100];

charc[100][100];

chard[100][100];

intj=0;

intt=0;

for(inti=0;a[i]!='\0';i++)

{

if(a[i]!=''){

b[j][t]=a[i];

c[j][t]=a[i];

j++;

if(j>=le)

{

j=0;

t++;

}

}

else{};

}

strcpy(str1,str);

for(inti=0;i<len;i++)

{

for(intj=0;j<len-i-1;j++)

{

if(str1[j]>str1[j+1])

{

charch=str1[j];

str1[j]=str1[j+1];

str1[j+1]=ch;

}

}

}

for(inti=0;i<len;i++)

{

for(intj=0;j<len;j++)

{

if(str[i]==str1[j])

{

for(intx=0;x<le;x++)

{

c[x][i]=b[x][j];

}

}

}

}

for(inti=0;i<le;i++)

{

strcpy(d[i],c[i]);

}

for(inti=0;i<len;i++)

{

for(intj=0;j<len;j++)

{

if(str[i]==str1[j])

{

for(intx=0;x<le;x++)

{

d[x][i]=c[x][j];

}

}

}

}

cout<<"经置换算法解密后的明文为:"<<endl;

for(inti=0;i<le;i++)

{

for(intj=0;j<len;j++)

cout<<d[i][j]<<"";

}

}

intmain()

{

intchoice;

cout<<"请输入您的选择:"<<endl;

cout<<"1.加密;2.解密;"<<endl;

cin>>choice;

switch(choice)

{

case1:

jiami();

break;

case2:

jiemi();

break;

default:

break;

}

//cout<<searchnum(s)<<endl;

return0;

}

执行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值