一、原理
已知明文情况下,根据凯撒加密算法可知,密文只有26种可能;
将26种情况全部列出,正确的明文因为含有一定的信息,所以很容易辨认
#include<iostream>#include<string>using namespace std;int main(){string a;//密文 string b=a;//存放明文 cout<<"要破解的密文:"; getline(cin,a); int k; //未知密钥//根据凯撒加密算法知明文有26种可能性//暴力列出所有的26种情况cout<<"所有可能的明文:"<<endl;for(k=0;k<26;k++) {cout<<"密钥K="<<k<<"时:" ;for(int i=0;i<a.length();i++){if(a[i]!=' '){ //相减过程出会出现负数情况,因此需要先进行“+26”操作再取余 if(a[i]>='a' && a[i]<='z') cout<<char((a[i]-k-'a'+26)%26+'a');if(a[i]>='A' && a[i]<='Z') cout<<char((a[i]-k-'A'+26)%26+'A');}if(a[i]==' ') cout<<" ";}cout<<endl; }}
二、运行结果
三:由于破解算法只需要将所有情况列出,所以
if(a[i]>='a' && a[i]<='z') cout<<char((a[i]-k-'a'+26)%26+'a');if(a[i]>='A' && a[i]<='Z') cout<<char((a[i]-k-'A'+26)%26+'A');
可以简单的写成(加法更容易操作):
if(a[i]>='a' && a[i]<='z') a[i]=char((a[i]+K-'a')%26+'a'); if(a[i]>='A' && a[i]<='Z') a[i]=char((a[i]+K-'A')%26+'A');
用减法只是为了对应我的代码运行结果上的文字说明:“当密钥= 时”:
如果觉得《暴力破解凯撒加密(未知密钥时)》对你有帮助,请点赞、收藏,并留下你的观点哦!