简单移位密码——凯撒加密、解密算法
移位密码是简单的替换密码(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;
}