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

1 篇文章 0 订阅
 

置换密码

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

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


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


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


从而得到密文:abatgftetcnvaiikse

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

#include <iostream>
#include <cstring>
using namespace std;
void jiami()
{
     char str[100];
     char str1[100];
     char a[100];
    cout<<"请输入您的密钥:"<<endl;
    cin.get();//每次在重新输入前必须加这个!
    cin.get(str,100);
    cout<<"请输入您的明文:"<<endl;
    cin.get();
    cin.get(a,100);
    int len=strlen(str);
    char b[100][100];
    char c[100][100];
    char d[100][100];
    int j=0;
    int t=0;
    int j1;
    int t1;
    for(int i=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(int i=0;i<len;i++)
    {
        for(int j=0;j<len-i-1;j++)
        {
            if(str1[j]>str1[j+1])
            {
                char ch=str1[j];
                str1[j]=str1[j+1];
                str1[j+1]=ch;
            }
        }
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len;j++)
        {
            if(str[i]==str1[j])
            {
               for(int x=0;x<j1;x++)
               {
                   c[x][i]=b[x][j];
               }
        }
    }
    }
    for(int i=0;i<j1;i++)
    {
        strcpy(d[i],c[i]);
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len;j++)
        {
            if(str[i]==str1[j])
            {
               for(int x=0;x<j1;x++)
               {
                   d[x][i]=c[x][j];
               }
        }
    }
    }
    cout<<"经置换算法后的密文为:"<<endl;
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<j1;j++)
        cout<<d[j][i]<<" ";
    }
}
void jiemi()

{
    char str[100];
    char str1[100];
    char a[100];
    cout<<"请输入您的密钥:"<<endl;
    cin.get();
    cin.get(str,100);
    cout<<"请输入您的密文:"<<endl;
    cin.get();
    cin.get(a,100);
    int len=strlen(str);
    int len1=strlen(a);
    int le=len1/len;
    char b[100][100];
    char c[100][100];
    char d[100][100];
    int j=0;
    int t=0;
    for(int i=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(int i=0;i<len;i++)
    {
        for(int j=0;j<len-i-1;j++)
        {
            if(str1[j]>str1[j+1])
            {
                char ch=str1[j];
                str1[j]=str1[j+1];
                str1[j+1]=ch;
            }
        }
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len;j++)
        {
            if(str[i]==str1[j])
            {
               for(int x=0;x<le;x++)
               {
                   c[x][i]=b[x][j];
               }
        }
    }
    }
    for(int i=0;i<le;i++)
    {
        strcpy(d[i],c[i]);
    }
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len;j++)
        {
            if(str[i]==str1[j])
            {
               for(int x=0;x<le;x++)
               {
                   d[x][i]=c[x][j];
               }
        }
    }
    }
    cout<<"经置换算法解密后的明文为:"<<endl;
    for(int i=0;i<le;i++)
    {
        for(int j=0;j<len;j++)
        cout<<d[i][j]<<" ";
    }
}
int main()
{

    int choice;
    cout<<"请输入您的选择:"<<endl;
    cout<<"1.加密;2.解密;"<<endl;
    cin>>choice;
    switch (choice)
    {
        case 1:
            jiami();
            break;
        case 2:
            jiemi();
            break;
        default:
            break;
    }
       // cout << searchnum(s)<< endl;
    return 0;
}


执行结果为:

 


  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值