数据安全-利用各种经典算法破解密码

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}上的置换:

x12345678
π(x)41627385

(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。

在这里插入图片描述

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值