凯撒加解密和破解

简单介绍
        古典密码学是最基础的密码学问题,在古典密码学中,最为经典的就是凯撒密码。我们在这里简单介绍一下凯撒密码。

        凯撒密码又称为凯撒加密,凯撒变换,变换加密,是一种最简单且为广为人知的加密技术。他就是一种替换加密。在明文中使用字母进行前移(或后退)的方法进行替换对应的字母。

 这个图展示了简单的凯撒密码加密。在这个图中,我们的凯撒加密是通过对字母进行循环后移3位。也就是A被替换成D,B替换成E,对于最后三位X,Y和Z,我们通过循环,即从头开始对应,得到X替换成A,Y替换成B,Z替换成C。

使用样例
编写代码回答下面问题:

1. 输入任意明文和秘钥K=10,对其进行凯撒加密。

2. 输入密文和秘钥K=10,对其进行凯撒解密。

3. 破译如下密文:Izqzm piyzmznodhvoz tjpm kjrzm oj xcvibz tjpmnzga!

解答:
问题1
我们可以通过计算公式进行计算。

 代码如下:

#include <bits/stdc++.h>
 
using namespace std;
 
int main(){
    string a;
    getline(cin, a);
    int K = 10;
    int n = a.length();
    for (int i = 0; i < n;i++){
        if(a[i]>'p'){
            a[i]=a[i] - 26+K;
        }else if(a[i] ==' '){
            a[i] = a[i];
        }else{
            a[i] += K;
        }
        cout << a[i];
    }
    cout << "\n";
    return 0;
}

问题2

我们通过公式x = (y-k) mod 26计算

#include <bits/stdc++.h>
 
using namespace std;
 
int main(){
    string a;
    getline(cin, a);
    int K = 10;
    int n = a.length();
    for (int i = 0; i < n;i++){
        if((a[i] < 'k' and a[i]>='a') or (a[i]<'K' and a[i]>='A')){
            a[i] = a[i] + 26-K;
        }else if(a[i] ==' '){
            a[i] = a[i];
        }else if(a[i]<'A' or (a[i]>'Z' and a[i]<'a') or a[i]>'z'){
            a[i] = a[i];
        }
        else{
            a[i] -= K;
        }
        cout << a[i];
    }
    cout << "\n";
    return 0;
}

问题3
在这里我们需要将所给的密文进行还原,但是我们又不知道秘钥K为多少,这里我们就不能简单的得到结果。使用问题2的办法进行解密,我们这里K的取值很多,可以是1,2,3······25,一共有25种可能。由于凯撒密码比较简单,计算也不复杂,将这25种可能都枚举一次对于计算机而言,还是很简单的,速度还是很快的,所以我们在这里可以使用暴力求解的方法,将K从1到25进行取值求取明文,最后使用肉眼进行区别真正的明文到底是25个明文中哪一个。
 代码如下:

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    string a;
    getline(cin, a);
    int n = a.length();
    for (int K = 1; K <= 25;K++){
        for (int i = 0; i < n;i++){
        if((a[i] < 'a'+K and a[i]>='a') or (a[i]<'A'+K and a[i]>='A')){
            a[i] = a[i] + 26-K;
        }else if(a[i] ==' '){
            a[i] = a[i];
        }else if(a[i]<'A' or (a[i]>'Z' and a[i]<'a') or a[i]>'z'){
            a[i] = a[i];
        }
        else{
            a[i] -= K;
        }
        cout << a[i];
    }
    cout << "\n";
    }
    
        return 0;
}

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值