#include<iostream>
#include<vector>
#define len ('a' -'A')
using namespace std;
class Affine
{
public:
void Encrytion();
void Decrytion();
void key();
int gcd();
void GetDecryKey();
private:
int key_EnMul;
int key_DeMul;
int key_Add;
};
int Affine::gcd()
{
int a = 26;
int b = key_EnMul,c;
do /*辗转相除法求a,b的最大公因数*/
{
c = a % b;
a = b;
b = c;
}while(c!=0);
return a;
}
void Affine::key()
{
cout << "请输入两个整数,第一个作为加密的乘数(要与26互素),第二个作为加密的加数(大于等于零,小于26): ";
cin >> key_EnMul >> key_Add;
if(gcd()!=1||key_Add<0||key_Add>=26)
{
// cout<<"您输入的乘数和26不是互素的,请重新输入: "<<endl;
cout<<"您输入的数不符合要求,请重新输入: "<<endl;
cout << "请输入两个整数,第一个作为加密的乘数,第二个作为加密的加数: ";
cin >> key_EnMul >> key_Add;
}
}
//用扩展的欧几里得算法求逆元
void Affine::GetDecryKey()
{
vector<int> ive ;
int a = 26 ;
int b = key_EnMul,c;
do
{
c = a % b;
ive.push_back(a/b);
a = b;
b = c;
}while(c!=0);
a = 0;
b = 1;
vector<int>::iterator iter = ive.begin();
while(iter!=ive.end()-1)
{ //扩展的欧几里得算法
c = -*iter*b + a ;
a = b; //当然也可以用,穷举法求逆元
b = c;
iter++;
}
key_DeMul = c;
}
// 下面是用穷举法求逆元
/*
void Affine::GetDecryKey()
{
int i =0;
while(key_EnMul * (++i) % 26 != 1);
key_DeMul = i;
}
*/
void Affine::Encrytion() //加密
{
vector<char> vec_En;
char ch;
cout<<"Please input the Plaintext(Crtl+d to stop): ";
while(cin>>ch)
{
if(ch>'z'||ch<'A'||(ch>'Z'&&ch<'a')) continue; //输入明文
if(ch>='a'&&ch<='z') ch-=len; //判断密文是否是字母,如果不是就果断的舍弃掉,如果是小写的
vec_En.push_back(ch); //就将其变成大写的
}
vector<char>::iterator iter = vec_En.begin();
while(iter!=vec_En.end())
{
int k;
if((k = ((*iter- 65) * key_EnMul + key_Add) % 26) < 0) k += 26;
*iter = k + 65;
iter++;
}
iter = vec_En.begin();
while(iter!=vec_En.end())
cout<<*iter++;
cout<<endl;
}
void Affine::Decrytion()
{
GetDecryKey();
vector<char> vec_De;
char ch;
cin.clear();
cout<<"Please input the Ciphertext(Crtl+d to stop): ";
while(cin>>ch)
{
if(ch>'z'||ch<'A'||(ch>'Z'&&ch<'a')) continue; //输入密文
if(ch>='a'&&ch<='z') ch-=len; //判断密文是否是字母,如果不是就果断的舍弃掉,如果是小写的
vec_De.push_back(ch); //就将其变成大写的
}
vector<char>::iterator iter = vec_De.begin();
while(iter!=vec_De.end())
{
int k;
if((k = ((*iter- 65 - key_Add) * key_DeMul ) % 26) < 0) k += 26;
*iter = k + 65;
iter++;
}
iter = vec_De.begin();
while(iter!=vec_De.end())
cout<<*iter++;
cout<<endl;
}
int main()
{
Affine *af = new Affine();
af->key();
af->Encrytion();
af->Decrytion();
return 0;
}
#include<vector>
#define len ('a' -'A')
using namespace std;
class Affine
{
public:
void Encrytion();
void Decrytion();
void key();
int gcd();
void GetDecryKey();
private:
int key_EnMul;
int key_DeMul;
int key_Add;
};
int Affine::gcd()
{
int a = 26;
int b = key_EnMul,c;
do /*辗转相除法求a,b的最大公因数*/
{
c = a % b;
a = b;
b = c;
}while(c!=0);
return a;
}
void Affine::key()
{
cout << "请输入两个整数,第一个作为加密的乘数(要与26互素),第二个作为加密的加数(大于等于零,小于26): ";
cin >> key_EnMul >> key_Add;
if(gcd()!=1||key_Add<0||key_Add>=26)
{
// cout<<"您输入的乘数和26不是互素的,请重新输入: "<<endl;
cout<<"您输入的数不符合要求,请重新输入: "<<endl;
cout << "请输入两个整数,第一个作为加密的乘数,第二个作为加密的加数: ";
cin >> key_EnMul >> key_Add;
}
}
//用扩展的欧几里得算法求逆元
void Affine::GetDecryKey()
{
vector<int> ive ;
int a = 26 ;
int b = key_EnMul,c;
do
{
c = a % b;
ive.push_back(a/b);
a = b;
b = c;
}while(c!=0);
a = 0;
b = 1;
vector<int>::iterator iter = ive.begin();
while(iter!=ive.end()-1)
{ //扩展的欧几里得算法
c = -*iter*b + a ;
a = b; //当然也可以用,穷举法求逆元
b = c;
iter++;
}
key_DeMul = c;
}
// 下面是用穷举法求逆元
/*
void Affine::GetDecryKey()
{
int i =0;
while(key_EnMul * (++i) % 26 != 1);
key_DeMul = i;
}
*/
void Affine::Encrytion() //加密
{
vector<char> vec_En;
char ch;
cout<<"Please input the Plaintext(Crtl+d to stop): ";
while(cin>>ch)
{
if(ch>'z'||ch<'A'||(ch>'Z'&&ch<'a')) continue; //输入明文
if(ch>='a'&&ch<='z') ch-=len; //判断密文是否是字母,如果不是就果断的舍弃掉,如果是小写的
vec_En.push_back(ch); //就将其变成大写的
}
vector<char>::iterator iter = vec_En.begin();
while(iter!=vec_En.end())
{
int k;
if((k = ((*iter- 65) * key_EnMul + key_Add) % 26) < 0) k += 26;
*iter = k + 65;
iter++;
}
iter = vec_En.begin();
while(iter!=vec_En.end())
cout<<*iter++;
cout<<endl;
}
void Affine::Decrytion()
{
GetDecryKey();
vector<char> vec_De;
char ch;
cin.clear();
cout<<"Please input the Ciphertext(Crtl+d to stop): ";
while(cin>>ch)
{
if(ch>'z'||ch<'A'||(ch>'Z'&&ch<'a')) continue; //输入密文
if(ch>='a'&&ch<='z') ch-=len; //判断密文是否是字母,如果不是就果断的舍弃掉,如果是小写的
vec_De.push_back(ch); //就将其变成大写的
}
vector<char>::iterator iter = vec_De.begin();
while(iter!=vec_De.end())
{
int k;
if((k = ((*iter- 65 - key_Add) * key_DeMul ) % 26) < 0) k += 26;
*iter = k + 65;
iter++;
}
iter = vec_De.begin();
while(iter!=vec_De.end())
cout<<*iter++;
cout<<endl;
}
int main()
{
Affine *af = new Affine();
af->key();
af->Encrytion();
af->Decrytion();
return 0;
}