簡單移位密碼——凱撒加密、解密算法

簡單移位密碼——凱撒加密、解密算法

移位密碼是簡單的替換密碼(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;
}

在這裏插入圖片描述

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