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