仿射密码 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 = (a x p + b) mod m,其中p是明文字符,c是密文字符,a和b是密钥参数,m是密码字符集的大小。 使用C语言编程实现仿射密码加解密需要掌握以下基本操作: 1. 字符串输入和输出:使用scanf和printf函数进行输入和输出字符串操作。 2. 字符串长度计算:使用strlen函数可以计算出字符串的长度,方便进行循环操作。 3. 字符串转换:C语言可以将字符类型转换为整型或者字符型,便于进行加法和乘法操作。 4. 循环结构:仿射密码加解密需要对每个明文字符进行加密或解密操作,需要使用循环结构进行遍历操作。 5. 条件结构:仿射密码加解密需要进行条件判断,例如在加密时需要判断是否为字母或其他非密码字符,需要使用if/else语句进行判断操作。 使用以上基本操作,我们可以按照以下步骤编写简单的仿射密码加解密程序: 1. 输入明文和密钥参数a和b。 2. 遍历明文中的每个字符,对其进行加密或解密操作。 3. 输出加密后的密文或解密后的明文。 4. 完成。 需要注意的是,在程序开发过程中需对输入的参数进行判断和异常处理,以保证程序的正确性和安全性。同时,需要在保证程序功能完整的同时,注重代码的可读性和可维护性,以方便后续的修改和扩展操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值