「信息安全-密码与隐藏技术」凯撒密码与仿射密码 (CPP 实现)

凯撒密码

凯撒密码就是简单移位,注意负数取模的情况就好了。

#include<bits/stdc++.h>
using namespace std;
const int mod = 26;
int k;
string str;
// 解密函数
string decryptionFunction(string eCode){
    string dCode = "";
    for(int i=0;i<eCode.length();i++){
        int n = eCode[i] - 'a';
        int m = (n-k+mod)%mod;
        dCode += ('a'+m);
    }
    return dCode;
}
int main(){
    cout<<"请输入明文和密钥:"<<endl;
    while(cin>>str>>k){
        string eCode = "";
        for(int i=0;i<str.length();i++){
            int n = str[i]-'a';
            int m = (n+k)%mod;
            eCode += ('a'+m);
        }
        cout<<"加密后的密文:"<<eCode<<endl;
        cout<<"调用解密函数:"<<decryptionFunction(eCode)<<endl;
    }
    return 0;
}
/*
测试用例
security 3
*/

仿射密码

仿射密码的话,加密过程和上述凯撒密码没多少区别,重在在于解密那一块。

首先,我们得到了密文编号 c ,怎么求得 m 呢?

m = ( c - 5 ) / 3(mod 26)

但是这里会有一种情况要考虑,如果 c-5 的结果小于 3 ,那么是不是 m 的值就为 0,所以我们采用如下解决方式,让 m = (c-5) * X (mod 26)这个 X3 的逆元。我们调用求逆元函数,就可以得到 X

#include<bits/stdc++.h>
using namespace std;
const int mod = 26;
int k;
string str;
typedef long long ll;
// 拓展gcd
void exgcd(ll a,ll b,ll& d,ll& x,ll& y){
    if(!b) { d = a; x = 1; y = 0; }
    else{ exgcd(b, a%b, d, y, x); y -= x*(a/b); }
}
// 求逆元
ll inv(ll a, ll p){
    ll d,x,y;
    exgcd(a,p,d,x,y);
    return d == 1 ? (x+p)%p : -1;
}
// 解密函数
string decryptionFunction(string eCode){
    string dCode = "";
    // 求逆元
    int rev = inv(3,mod);
    for(int i=0;i<eCode.length();i++){
        int c = eCode[i] - 'a';
        c = (c-5+mod)%mod;
        int m = (c*rev)%mod;
        dCode += ('a'+m);
    }
    return dCode;
}
int main(){
    cout<<"请输入明文:"<<endl;
    while(cin>>str){
        string eCode = "";
        for(int i=0;i<str.length();i++){
            int n = str[i]-'a';
            int m = (3*n+5)%mod;
            eCode += ('a'+m);
        }
        cout<<"加密后的密文:"<<eCode<<endl;
        cout<<"调用解密函数:"<<decryptionFunction(eCode)<<endl;
    }
    return 0;
}
/*
测试用例
security

hrlnedkz
*/
学如逆水行舟,不进则退
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一百个Chocolate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值