1. 程式人生 > >仿射密碼加解密及暴力破解c++實現

仿射密碼加解密及暴力破解c++實現

#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;
}