凯撒密码 与 维吉尼亚密码

所谓“凯撒加密”,就是将一段明文(通常是英文)中的所有字母都向后移相同的位数。
以下是用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++;
	}
}

 

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/helloword4217/article/details/8947123
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞