簡單移位密碼——凱撒加密、解密算法
移位密碼是簡單的替換密碼(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;
}