2.1 替代密码
单表替代密码
一般单表替代密码
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | i | s | t | u | v | w | x | y | z |
q | w | e | r | t | y | u | i | o | p | a | s | d | f | g | h | j | k | l | z | x | c | v | b | n | m |
明文根据转化表将明文字母转换为密文字母(a -> q),密钥是键盘字母的排序
#include<iostream>
#include<string>
using namespace std;
string table_c = "qwertyuiopasdfghjklzxcvbnm";
string table_m = "abcdefghijklmnopqrstuvwxyz";
int N = 26;
int index(char x)
{
for(int i=0;i<N;i++)
{
if(table_c[i]==x)return i;
}
}
string pi_1(string c)
{
string temp_m = "";
int n;
for(int i=0;i<N;i++)
{
n = index(c[i]);
temp_m += table_m[n];
}
return temp_m;
}
string pi(string m)
{
string temp_c="";
int n;
for(int i=0;i<N;i++)
{
n = m[i]-'a';
temp_c += table_c[n];
}
return temp_c;
}
int main()
{
string m = "abcdefghijklmnopqrstuvwxyz";
string c = "qwertyuiopasdfghjklzxcvbnm";
cout<<pi(m)<<endl;
cout<<pi_1(c)<<endl;
return 0;
}
移位密码
最著名的是凯撒密码
#include<iostream>
#include<string>
using namespace std;
string c = "efghijklmnopqrstuvwxyzabcd";
string m = "abcdefghijklmnopqrstuvwxyz";
int n = 26;
string pi_1(string c)
{
string temp_m = "";
int k_1 = 4;
for(int i=0;i<n;i++)
{
temp_m += (c[i]-'a'-k_1+26)%26 + 'a';
}
return temp_m;
}
string pi(string m)
{
string temp_c = "";
int k = 4;
for(int i=0;i<n;i++)
{
temp_c += (m[i]-'a'+ k)%26 + 'a';
}
return temp_c;
}
int main()
{
cout<<pi(m)<<endl;
cout<<pi_1(c)<<endl;
return 0;
}
仿射密码
这边写错了,k1=7,取模的26不是k2,而且只有7,26互质(最大公因数为1)才能解密:ax-by=1
扩展欧几里德变换求a逆(递归思路):
欧几里得算法非递归求逆密钥
#include<iostream>
#include<string>
using namespace std;
string Atoa(string x);
string E(string x);
//a指进行乘法逆元的密钥,b指的模的那个数
int gcd(int a,int b);//欧几里德算法求公约数
int bianli(int a,int b);//暴力计算
int ex_gcd(int a,int b,int &x,int &y);//扩展欧几里德算法递归求逆密钥
int gcd_1(int a,int b,int &x,int &y);//欧几里得算法非递归求逆密钥
string D(string x);
int main()
{
string m,c;
cout<<"请输入明文m:";
cin>>m;
//m = "China";
//c = "UnwPc";
//cout<<Atoa(m)<<endl;
cout<<"E(m)="<<E(m)<<endl;
//cout<<gcd(9,26)<<endl;
cout<<"请输入密文c:";
cin>>c;
cout<<"D(c)="<<D(c)<<endl;
return 0;
}
string Atoa(string x)
{
string temp="";
int n