简单移位密码——凯撒加密、解密算法

简单移位密码——凯撒加密、解密算法

移位密码是简单的替换密码(simple substitution cipher),即将明文的一个字符用相应的一个密文字符替换。

  • 算法描述:设P=C=K=Z26,对k∈K,定义ek(x)=x+k(mod 26)=y∈C,同时dk(y)=y-k(mod 26)。
  • 编程实现:对输入的一串信息(不超过40个字符)进行加、解密,加密规则如下:将字母表看成首尾衔接的闭合环,遇大写字母用该字母后面的第3个小写字母替换,遇小写字母用该字母后面的第3个大写字母替换……
//凯撒加密算法
char CaesarCipher(char a)
{
    //当字母为大写字母时,用后面第三个小写字母替换
    if (a >= 'A'&& a < 'X')
         a = a + 32 + 3;
    //当大写字母属于"X,Y,Z"时,将其结果减去26,保证字母表首尾衔接
    else if (a >= 'X'&& a <= 'Z')
         a = a + 32 + 3 - 26;
    //当字母为小写字母时,用后面第三个大写字母替换
    else if (a >= 'a'&& a < 'x')
         a = a - 32 + 3;
    //当大写字母属于"x,y,z"时,将其结果减去26,保证字母表首尾衔接
    else if (a >= 'x'&& a <= 'z')
         a = a - 32 + 3 - 26;
    return a;
}
//凯撒解密算法
char CaesarDecryption(char a)
{
    //当字母为大写字母时,用前面第三个小写字母替换
                      //当大写字母属于"A,B,C"时,将其结果加上26,保证字母表首尾衔接
    if (a >= 'A'&& a <= 'C')
         a = a + 32 - 3 + 26;
    else if (a > 'C'&& a <= 'Z')
         a = a + 32 - 3;
    //当字母为小写字母时,用前面第三个大写字母替换
    //当大写字母属于"a,b,c"时,将其结果加上26,保证字母表首尾衔接
    else if (a >= 'a'&& a <= 'c')
         a = a - 32 - 3 + 26;
    else if (a > 'c'&& a <= 'z')
         a = a - 32 - 3;
    return a;
}
int main()
{    
	string a; //定义输入string类型的字符串
    	int index, i,size;  //定义输入的索引,循环变量,字符串大小
	while (1)
    {
         //制作选择菜单栏
         cout<< "=====================================" << endl;
         cout<< "凯撒加密——解密算法:" << endl;
         cout<< "1、凯撒加密算法" << endl;
         cout<< "2、凯撒解密算法" << endl;
         cout<< "3、退出程序" << endl;
         cout<< "请选择需要执行的操作:";
         cin>> index;
         //必须输入正确的索引才可继续
         if (index != 1 && index != 2 && index != 3)
             break;
         switch (index)
         {
         case 1:
             cout<< "请输入一串需要加密的信息(不超过40个字符,属于字母范畴A—Z,a—z):";
             cin>> a;
             size= a.size();
             //满足字符串的大小不能超过40个字符
             if (size > 40)
             {
                  cout<< "输入字符串不能超过40个字符,请重新输入!" << endl;
                  break;             
             }
             for (i = 0; i <size; i++)
             {
                  //满足输入的字符串全为字母类型
                  if (a[i] < 'A' || a[i] > 'z' || (a[i] > 'Z' && a[i] < 'a'))
                  {
                      cout<< "所输入字符串不满足字母范畴,请重新输入!" << endl;
                      break;
                  }
                  else
                  {
                      if (i == 0)
                          cout<< "经过凯撒加密后的信息为:";
                      a[i] = CaesarCipher(a[i]);
                      cout<< a[i];
                  }
             }
             cout<< endl;
             break; 
         case 2:
             cout<< "请输入一串需要解密的信息(不超过40个字符,属于字母范畴A—Z,a—z):";
             cin>> a;
             size= a.size();
             //满足字符串的大小不能超过40个字符
             if (size > 40)
             {
                  cout<< "输入字符串不能超过40个字符,请重新输入!" << endl;
                  break;
             }
             for (i = 0; i < size; i++)
             {
                  //满足输入的字符串全为字母类型
                  if (a[i] < 'A' || a[i] > 'z' || (a[i] > 'Z' && a[i] < 'a'))
                  {
                      cout<< "所输入字符串不满足字母范畴,请重新输入!" << endl;
                      break;
                  }
                  else
                  {
                      if (i == 0)
                          cout<< "经过凯撒解密后的为信息为:";
                      a[i] = CaesarDecryption(a[i]);
                      cout<< a[i];
                  }
             }
             cout<< endl;
             break;
         case 3:   return 0; break;
         } 
    }
    return 1;
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章