仿射密码—加密、解密

#include<iostream>
#include<string>
using namespace std;
int GCD(int  x, int  y) {//求两个数的最大公因数;可改为bool类型函数,判断x,y是否为素数即可;
    return y == 0 ? x : GCD(y, x % y);
}
int find_ni(int a) {//求逆元,方法有三种;
    int i;
    for ( i = 1; (i * a - 1) % 26 != 0; i++);
    return i;
}
string encrypt(int k, int b, string message) {//加密
    for (int i = 0; i < message.size(); i++) {
        message[i] -= 'a';
        message[i] = (k * message[i] + b) % 26;
        message[i] = message[i] + 'a';
    }
    return message;
}
string decrpty(int a, int b, string cipher) {//解密
    int s = find_ni(a);
    for (int i = 0; i < cipher.size(); i++) {
        cipher[i] -= 'a';
        cipher[i] = (s*cipher[i]+(26-s)*b)%26;
        cipher[i] = cipher[i] + 'a';
    }
    return cipher;
}
int main() {
    string y, str;
    int k, b,n=6;
    cout << "请输入密钥k,b:";
    cin >> k >> b;
    while (GCD(k, b) != 1) {
            cout << endl << "请重新输入k,b:";
            cin >> k >> b;
    }
    while (n != 0) {
        cout << "请选择 1-加密  2-解密  0-退出" << endl;
        cin >> n;
        switch (n) {
        case 1:
            cout << "请输入明文";
            cin >> str;
            y = encrypt(k, b, str);
            cout << "This encrypt is " << y << endl;
            break;
        case 2:
            cout << "请输入密文";
            cin >> str;
            y = decrpty(k, b, str);
            cout << "This decrypt is " << y << endl;
            break;
        }
    }
    return 0;
}

文章推荐—求逆元三种方法仿射密码原理

上一篇:Linux从入门到精通(第8章--磁盘管理)


下一篇:linux pidof