替换加密c++

一.简介:

替换加密是简单对称加密,其思路是将明文中的的一个字符用字母表中该字符对应的对应的字符替换。

对于纯英文字母表的替换,共有26!种替换表。

其中特殊的列子有仿射加密(特殊:移位加密),相比用替换表减小了密钥的大小。

仿射加密:y=ax+b mod26

a共有12种,满足gcd(a,26)=1;0<=b<=25.

当a=1,为移位加密:y=x+b mod26.

二.替换表算法思路:

1.加密:

        替换表加密,密钥为整个替换表,加密为查表替换。密钥可以分两次输入一维字符数组,也可以直接输入一个二维字符数组(亦或者是只输入替换表密文部分,因为明文部分通常是abcdefghijklmnopqrstuvwxyz)。

       进行替换时先要判断是否为字母,是字母再对进行替换(如果密钥只有大写或小写,则还要对大小写字母进行不同的操作)

2.解密:

       替换表解密有两种方法,一是穷尽密钥,而是字母频率分析。

      一般采用字母频率分析,因为较为简单,但要求有足够的密文,否则无法对密文字母频率进行排序,从而无法得到正确的替换表。

二.源代码:

1.替换表加密:

#include <iostream>  using namespace std; // 按表替换,key(替换表)分两次输入不同的字符串 int main() {     char plaintext[50]=" I love cryptography.";          char key1[26],key2[26];         cout<<"依次输入密码表明文部分(小写)"<<endl;//abcdefghijklmnopqrstuvwxyz         cin>>key1;//key中明文         cout<<"依次输入密码表密文部分(小写)"<<endl;//etaoinshrdlcumwfgypbvkjxqz         cin>>key2;//key密文         int a,b;         for( a=0;plaintext[a]!='';a++)         {             if(64<plaintext[a]&&plaintext[a]<91)//判断是否为字母:字母进行替换,不是则不做处理             {                 b=0;                 while(plaintext[a]!=key1[b]-32)//找到替换表中对应的明文字母                     b++;                 plaintext[a]=key2[b]-32; //替换             }              if(96<plaintext[a]&&plaintext[a]<123)//判断是否为字母:字母进行替换,不是则不做处理             {                 b=0;                 while(plaintext[a]!=key1[b])//找到替换表中对应的明文字母                     b++;                 plaintext[a]=key2[b]; //替换             }         }         cout<<"密文:"<<endl;     //for( a=0;plaintext[a]!='';a++)     cout<<plaintext;     return 0;  }

2.替换表加密:

#include <iostream>  using namespace std; //利用已知明文对暴力破解替换加密 void decrypt(char d[],char f[],char ciphertext[]){//解密     for (int j=0;j<26;j++)     for (int i=0;ciphertext[i]!='';i++)         {             if(ciphertext[i]==d[j])             ciphertext[i]=f[j];             else if (ciphertext[i]==d[j]+32)                 ciphertext[i]=f[j]+32;         }         cout<<"明文"<<ciphertext<<endl; } int main() {     char ciphertext[5000];     char letter1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};      //存储原始字母序列     char letter2[26]={'e','t','a','o','i','n','s','h','r','d','l','c','u','m','w','f','g','y','p','b','v','k','j','x','q','z'};     //存储出现频率由高到低的字母序列     int num[26];//num【0】存储a的次数,num【1】存储b的........     int a;     for(a=0;a<26;a++)         num[a]=0;     cin.getline(ciphertext,5000);//读入密文      //for (int j=0;j<26;j++) //统计字母频数     //{         a=0;         for (int i=0;ciphertext[i]!='';i++)         {             if(ciphertext[i]>=65&&ciphertext[i]<=90)                 num[ciphertext[i]-'A']++;             if(ciphertext[i]>=97&&ciphertext[i]<=122)                 num[ciphertext[i]-'a']++;         }        // num[j]=a;     //}     int b;     for(a=0;a<26;a++)         cout<<letter1[a]<<"  ";     cout<<endl;     for(a=0;a<26;a++)     cout<<num[a]<<" ";     cout<<endl;     char c;     for(int m=0;m<26;m++)//按频数排序(大到小):利用频数,将字母出现次数由高到低排列         for(int n=1;n<26-m;n++)     {         b=num[m],c=letter1[m];         if(b<num[m+n])         {             num[m]=num[m+n],letter1[m]=letter1[m+n];             num[m+n]=b,letter1[m+n]=c;         }     }     for(a=0;a<26;a++)     cout<<num[a]<<" ";     cout<<"解密密钥为:"<<endl;     for(b=0;b<26;b++)     {         cout<<letter1[b]<<"->"<<letter2[b]<<endl;     }     decrypt(letter1,letter2,ciphertext);     //cout << "Hello world!" << endl;     return 0; }

版权声明:玥玥 发表于 2021-07-26 17:08:11。
转载请注明:替换加密c++ | 女黑客导航