#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;
}
文章推荐—求逆元三种方法、仿射密码原理