1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| #include<iostream> #include<string> using namespace std; string Atoa(string x); string E(string x);
int gcd(int a,int b); int bianli(int a,int b); int ex_gcd(int a,int b,int &x,int &y); int gcd_1(int a,int b,int &x,int &y); string D(string x); int main() { string m,c; cout<<"请输入明文m:"; cin>>m; cout<<"E(m)="<<E(m)<<endl; cout<<"请输入密文c:"; cin>>c; cout<<"D(c)="<<D(c)<<endl; return 0; } string Atoa(string x) { string temp=""; int n = x.size(); for(int i=0;i<n;i++) { if(x[i]>'Z') temp += x[i]; else temp += x[i]-'A'+'a'; } return temp; } string E(string x) { x = Atoa(x); string temp=""; int k1=9,k2=2,m=26; int n = x.size(); for(int i=0;i<n;i++) { temp += (k1*(x[i]-'a')+k2)%m+'a'; } return temp; } int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int bianli(int a,int b) { int x; for(int i=1;i<=b;i++) { x = (a*i)%b; if(x==1)return i; } } string D(string x) { x = Atoa(x); string temp=""; int k1=9,k2=2,m=26,n,k1_1; int flag=gcd(k1,m); if(flag!=1) { cout<<"k1与m不互质,无法解密!"<<endl; return temp; } else { int x0=0,y0=0; k1_1 = gcd_1(k1,m,x0,y0); n = x.size(); for(int i=0;i<n;i++) { temp += k1_1*(x[i]-'a'-k2)%m +'a'; } return temp; } } int ex_gcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int res = ex_gcd(b,a%b,x,y); int temp=x; x = y; y = temp-(a/b)*y; return x; } int gcd_1(int a,int b,int &x,int &y) { int X1=1,X2=0,X3=b; int Y1=0,Y2=1,Y3=a; int T1,T2,T3; int Q; while(1) { if(Y3==0)return X2; if(Y3==1)return Y2; Q=X3/Y3; T1=X1-Q*Y1; T2=X2-Q*Y2; T3=X3-Q*Y3; X1=Y1;X2=Y2;X3=Y3; Y1=T1;Y2=T2;Y3=T3; } }
|