1.移位加密
使用穷尽密钥搜索方法破译如下利用移位密码加密的密文
BEEAKFYDJXUQYHYJIQRYHTYJIQFBQDUYJIIKFUHCQD
#include<iostream>
#include<string>
using namespace std;
void decrypt(string s){
//循环所有可能密匙
for(int k=0;k<26;k++){
for(int i=0;i<s.size();i++){
cout<<char((s[i]-'A'+k)%26+'A');
}
cout<<endl;
}
}
int main(){
string s;
cout<<"输入密文:";
cin>>s;
cout<<"明文:"<<endl;
decrypt(s);
return 0;
}
2.置换密码
(a)设下列的是集合{1,2,3,4,5,6,7,8}上的置换:
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
π(x) | 4 | 1 | 6 | 2 | 7 | 3 | 8 | 5 |
(1)求出逆置换 .
(2)解密下列使用置换密码加密的密文,密钥是(a)中的置换
TGEEMNELNNTDROEOAAHDOETCSHAEIRLM
#include<iostream>
#include<string>
using namespace std;
void decript(string s){
int display[8]={4,1,6,2,7,3,8,5}; //置换
int reDisplay[8]={0}; //逆置换
string ans[4];
int c=0;
//生成逆置换
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
if(display[j]-1==i) reDisplay[i]=j;
}
}
//按密文顺序形成 4 ×8 密文矩阵
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
ans[i][j]=s[c++];
}
}
//输出密文矩阵
cout<<"--密文矩阵--"<<endl;
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
//按逆置换顺序输出 (第一列:行序为逆置换、第二列:…)
cout<<"明文: ";
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
cout<<ans[i][reDisplay[j]];
}
}
cout<<endl;
}
int main(){
string s;
cout<<"输入密文: ";
cin>>s;
cout<<"解密:"<<endl;
decript(s);
return 0;
}
3.维吉尼亚密码
使用维吉尼亚密码进行加密,假设m=6, 密钥字为CIPHER,其对应于如下的数字串K=(2,8,15,7,4,17),要加密的明文为:Thiscryptosystemisnotsecure , 求密文
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> ckey;
void encripyt(string s){
cout<<"密文:";
for(int i=0;i<s.size();i++){
cout<<char((s[i]-'a'+ckey[i%6])%26+'a');
}
cout<<endl;
}
int main(){
cout<<"输入明文:";
string s;
cin>>s;
cout<<"输入密匙:";
int k;
for(int i=0;i<6;i++){
cin>>k;
ckey.push_back(k);
}
encripyt(s);
return 0;
}
4.特殊置换密码
我们给出一个特殊的置换密码。设m, n为正整数,将明文写成一个n 的矩阵形式,然后依次取矩阵的各列构成密文。例如,m=3, n=4,可将明文“cryptography”表示为以下形式:
cryp
togr
aphy
对应的密文就是“CTAROPYGHPRY”。
请根据上述方法,对下列密文进行解密: MYAMRARUYIQTENCTORAHROYWDSOYEOUARRGDERNOGW
#include<string>
#include<vector>
#include<iostream>
using namespace std;
vector<int> part; //存放密文长度的约数,好分组
vector<string> strs; //存放第一次分组后的字符串
#define ll long long
void decript(string s){
int len=s.size();
//找出密文长度的约数
for(int i=0;i<len;i++){
if (s.size()%(i+1)==0 && i>0) part.push_back(i+1);
}
//解密
for(int i=0;i<part.size();i++){
int p=part[i];
cout<<"-----先分成"<<len/p<<"组,"<<"每组"<<p<<"个-----"<<endl;
//分成每p一组
for(int j=0;j<len;j+=p){
strs.push_back(s.substr(j,p));
}
for(int j=0;j<p;j++){//j为0-p的遍历数
if(p%(j+1)==0){
cout<<"-每组再分成"<<p/(j+1)<<"x"<<j+1<<"-"<<endl;
for(int k=0;k<strs.size();k++){ //k为strs容器的下标
//按m*n矩阵先列后行输出
for(int m=0;m<j+1;m++){
for(int n=m;n<p;n+=j+1){
cout<<strs[k][n];
}
}
cout<<" ";
}
cout<<endl;
}
}
strs.clear(); //清空容器
cout<<endl;
}
part.clear(); //清空容器
}
int main(){
string s;
cout<<"输入密文: ";
cin>>s;
cout<<"解密:"<<endl;
decript(s);
return 0;
}
5.RSA加密
设通信双方使用 RSA 加密体制,接收方的公开钥是( e, n) = ( 5, 35 ) , 接收到的密文是 C = 10 ,求明文 M。