所谓“凯撒加密”,就是将一段明文(通常是英文)中的所有字母都向后移相同的位数。
以下是用C++语言实现的移位函数:
// 将英文各字母向后循环后移 k 位
// s 为字符串,k 为后移的位数
void shift(char *s, int k)
{
for(char *p = s; *p; p++)
{
if(is_uppercase(p))
{
*p = 'A' + (*p - 'A' + k % 26 ) % 26 ;
}
else if(is_lowercase(p))
{
*p = 'a' + (*p - 'a' + k % 26) % 26;
}
}
}
此种方法容易用频率分析法破译,所以后来有了“维吉尼亚密码”。它用一串英文字符作为密钥,使得明文中的字母向后移动并不相同的位数,当然这个密钥不可能很长,所以一般循环使用这个密钥。
以下是用C++实现的维吉尼亚加密函数:
// 向右循环移 K 位
void shift(char &s, int k)
{
if(is_uppercase(s))
{
s = 'A' + (s - 'A' + k % 26 ) % 26 ;
}
else if(is_lowercase(s))
{
s = 'a' + (s - 'a' + k % 26) % 26;
}
}
// 用 key 对 text 进行循环的维吉尼亚加密
// text: 明文 Key: 加密密钥
void Vigenere_code(string &text, string &key)
{
int i = 0, j = 0;
for(string::iterator it = text.begin(); it != text.end(); it++)
{
j = i % key.length(); // 循环利用密钥
if(is_uppercase(key[j]))
{
shift(*it, key[j] - 'A');
}
else if(is_lowercase(key[j]))
{
shift(*it, key[j] - 'a');
}
i++;
}
}