仿射密码 c++实现

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






阅读更多
个人分类: 密码学——C++
想对作者说点什么? 我来说一句

仿射密码加密与解密C++源程序

2011年04月13日 37KB 下载

仿射密码对明文加密和解密

2009年11月03日 236KB 下载

仿射加密法

boke14122621 boke14122621

2017-04-11 23:44:35

阅读数:254

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭