仿射密碼加解密及暴力破解c++實現
阿新 • • 發佈:2019-01-31
#include <iostream> #include <string.h> using namespace std; char m[100]; char c[100]; int gcd(int a,int b) //輾轉相除法求a,b的最大公約數 { int k=0; do { k=a%b; a=b; b=k; }while(k!=0); return a; } int Ni(int a,int b) //求a相對b的逆元 { int i=0; while(a*(++i)%b!=1); //a*i=1 mod b return i; } void Jiami(char m[],int k1,int k2) //加密 { int len=strlen(m); for(int i=0;i<len;i++) { c[i]=(k1*(m[i]-97)+k2)%26+65; //加密公式 e(x)=k1*x+k2 (mod 26) } cout<<"加密後的密文為:"; for(int i=0;i<len;i++) cout<<c[i]; cout<<endl; } void Jiemi(char c[],int k1,int k2) //解密 { int len=strlen(c); char mm[100]; for(int i=0;i<len;i++) { int t=c[i]-65-k2; if(t<0) t+=26; mm[i]=k1*t%26+97; //解密公式 x=k1^-1*(e(x)-k2)(mod26) } cout<<"解密後的明文為:"; for(int i=0;i<len;i++) cout<<mm[i]; cout<<endl; } int main() { char m[100]; int k1,k2; cout<<"輸入明文:"; cin>>m; cout<<"金鑰k1和k2:"; cin>>k1>>k2; while(gcd(k1,26)!=1) //判斷輸入的金鑰是否合法 { cout<<"輸入的金鑰不合法,請重新輸入!"<<endl; cin>>k1>>k2; } Jiami(m,k1,k2); int k3=Ni(k1,26); cout<<"解密金鑰為:"; cout<<k3<<" "<<k2<<endl; Jiemi(c,k3,k2); return 0; }