前言
本内容为博主学习凯撒密码的笔记,如有错误,烦请指正。
一、凯撒密码简介
凯撒密码是最早的代换密码,使用单表代换。其基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。位数就是凯撒密码加密和解密的密钥。
例子如下:
二、凯撒密码算法
1.加密算法
对于某一明文字母m来说,假设其ASCII码为x,往后移了i位,则新得到的密文c的ASCII码为x + i,考虑加密为26个字母周期性加密,则需将ASCII码对26取模,举例小写字母如下:
c = (m - 'a' + i) % 26 + 'a';
2.解密算法
同理,解密算法也是一个意思,对于某一密文字母m来说,假设其ASCII码为x,往前移了i位,则新得到的密文c的ASCII码为x - i,考虑加密为26个字母周期性加密,则需将ASCII码对26取模,再考虑到且(x-i)可能为负数,取’z’进行计算,举例小写字母如下:
m = (c - 'z' - i) % 26 + 'z';
三、代码实现
下面代码实现对移位为i的凯撒密码加密算法,只对字母有效,区分大小写。
#include <stdio.h>
void main(){
char plaintext[100],ciphertext[100];
char m;
int i,k,j=0;
while(1)
{
printf("请选择模式:1.加密 2.解密 0.退出\n");
scanf("%d", &k);
if(k == 0) break;
else if(k == 1)
{
printf("请输入加密位数:");
scanf("%d", &i);
getchar();
printf("请输入明文:\n");
gets(plaintext);
for(j = 0; plaintext[j] != '\0'; j++)
{
m = plaintext[j];
if(m <= 'Z' && m >='A')//往后移
ciphertext[j] = (m - 'A' + i) % 26 + 'A';
else if(m <= 'z' && m >='a')
ciphertext[j] = (m - 'a' + i) % 26 + 'a';
else ciphertext[j] = m;
}
ciphertext[j] = '\0';//添加结束符
printf("加密后的密文如下:\n");
for(j = 0; ciphertext[j] != '\0'; j++)
printf("%c", ciphertext[j]);
printf("\n");
}
else if(k == 2)
{
printf("请输入解密位数:");
scanf("%d", &i);
getchar();
printf("请输入密文:\n");
gets(ciphertext);
for(j = 0; ciphertext[j] != '\0'; j++)
{
m = ciphertext[j];
if(m <= 'Z' && m >='A')//往前移
plaintext[j] = (m - 'Z' - i) % 26 + 'Z';
else if(m <= 'z' && m >='a')
plaintext[j] = (m - 'z' - i) % 26 + 'z';
else plaintext[j] = m;
}
plaintext[j] = '\0';
printf("加密后的密文如下:\n");
for(j = 0; plaintext[j] != '\0'; j++)
printf("%c", plaintext[j]);
printf("\n");
}
else
printf("输入错误!\n");
memset(plaintext, 0, 100);//清空字符数组
memset(ciphertext, 0, 100);
}
}
示例结果如下
总结
凯撒密码是比较简单的,只是进行单表代换,实现起来也比较容易,破解起来也不难,是很不安全的密码。
凯撒密码是没有密匙的,即使没有密匙也能将它破解出来,因为凯撒移位密码只有25种密匙,最多就是将这25种可能性挨个检测一下可以了,这就是我们所说的暴力破解法。
当然,还可以使用频度分析法分析每个字母出现的频率,从而知道凯撒密码的移位数。
“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。”——(360百科)