目录
一、凯撒密码原理
在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
二、ASCII码表
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 。
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)
如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;
通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;
ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响 [1]。
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
三、python凯撒密码实现
主程序
if __name__ == '__main__':
while True:
choice = input("请选择加密或解密:\n1.加密\n2.解密\n3.退出\n")
if choice == '1':
str = input("请输入需要加密的字符串:")
k = int(input("请输入加密密钥:"))
print("加密后的字符串为:", encryption(str, k))
elif choice == '2':
str = input("请输入需要解密的字符串:")
k = int(input("请输入解密密钥:"))
print("解密后的字符串为:", decryption(str, k))
elif choice == '3':
break
加密程序
在python中通过使用ord()函数获取字符串中每个字符的ASCII,例如:
>>> ord('a')
97
>>> ord('A')
65
对ascii值使用凯撒密码的公式进行运算后,使用chr()函数返回其对应的ASCII符号,例如:
>>> chr(97)
'a'
>>> chr(65)
'A'
前面提到过凯撒密码的加密公式为:
明文+密钥=密文
这里以小写字母字符为例:
1、首先使用islower()函数判断字符是否为小写字母
2、然后使用ord()函数获取字符的ASCII值
3、加入密钥获得加密后的ASCII值
4、使用chr()函数返回加密后的字符
elif str[i].islower():
result += chr(ord(str[i]) - k ))
但是在ASCII码表中小写字母只有26位,需将ASCII码对26取模
所以我们需要采用取余的方式,以保证获取的字符类型正确:
result += chr((ord(str[i]) - k )%26)
ASCII码表中小写字母在97~122位
result += chr((ord(str[i]) - k-97 )%26+97)
具体代码:
def encryption(str, k):
result = ""
for i in range(len(str)):
if str[i].isdigit(): ##判断明文是否为数字
result += chr((ord(str[i]) + k - 48) % 10 + 48)
elif str[i].isupper(): ##判断明文是否为大写字母
result += chr((ord(str[i]) + k - 65) % 26 + 65)
elif str[i].islower(): ##判断明文是否为小写字母
result += chr((ord(str[i]) + k - 97) % 26 + 97)
elif str[i].isspace(): ##判断明文是否为空
result += " "
return result
解密程序
在加密程序的基础上对密钥进行反向运算即可
def decryption(str, k):
result = ""
for i in range(len(str)):
if str[i].isdigit(): ##判断密文是否为数字
result += chr((ord(str[i]) - k - 48) % 10 + 48)
elif str[i].isupper(): ##判断密文是否为大写字母
result += chr((ord(str[i]) - k - 65) % 26 + 65)
elif str[i].islower(): ##判断密文是否为小写字母
result += chr((ord(str[i]) - k - 97) % 26 + 97)
elif str[i].isspace(): ##判断密文是否为空
result += " "
return result
程序运行
四、总结
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。由于使用恺撒密码进行加密的语言一般都是字母文字系统,因此密码中可能是使用的偏移量也是有限的,例如使用26个字母的英语,它的偏移量最多就是25(偏移量26等同于偏移量0,即明文;偏移量超过26,等同于偏移量1-25)。因此可以通过穷举法,很轻易地进行破解。其中一种方法是在表格中写下密文中的某个小片段使用所有可能的偏移量解密后的内容——称为候选明文,然后分析表格中的候选明文是否具有实际含义,得出正确的偏移量,解密整个密文。