介绍
凯撒密码,或称恺撒加密、恺撒变换、变换加密。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
python方法
当前使用python3实现简单的将字母进行替换,并传入偏移量,此时我们需要用到python3的内置函数ord()函数,而其配对的函数为chr() 函数【对于8位的ASCII字符串】或unichr() 函数【对于Unicode对象】;
ord函数:它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常;
chr函数:即将传入的ASCII 数值转化为字符,示例代码如下:
>>> ord(1)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
ord(1)
TypeError: ord() expected string of length 1, but int found
>>> ord(4)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
ord(4)
TypeError: ord() expected string of length 1, but int found
>>> ord("4")
52
>>> ord("0")
48
>>> ord("100")
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
ord("100")
TypeError: ord() expected a character, but string of length 3 found
>>> ord("10")
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
ord("10")
TypeError: ord() expected a character, but string of length 2 found
>>> ord("9")
57
>>> ord("a")
97
>>> chr(100)
'd'
>>> chr(58)
':'
实现代码
在下方代码中我们发现我们在chr内置函数之前没有使用ord内置函数来获取ASCII码,直接使用了相加;因为在循环字符串类型时item已经直接转为数字类型
>>> def caesar():
num = int(input('请输入偏移量(1-10):'))
wstr = input('请输入加密的字符串:').encode('utf-8')
rstr = ''
for item in wstr:
rstr += chr(item+num)
print("处理结果:",rstr)
return rstr
>>> caesar()
请输入偏移量(1-10):3
请输入加密的字符串:asa
处理结果: dvd
'dvd'
另一种写法可能会更容易理解一些
>>> def caesar():
num = int(input('请输入偏移量(1-10):'))
wstr = input('请输入加密的字符串:')
rstr = ''
for item in wstr:
rstr += chr(ord(item)+num)
print("处理结果:",rstr)
return rstr
>>> caesar()
请输入偏移量(1-10):3
请输入加密的字符串:asa
处理结果: dvd
'dvd'
因为在使用input输入时我们使用了encode(‘utf-8’)导致我们的字符串已经修改,在循环输出时已转为数字,b’a’ 即 b’\x61’ 实际内存中为 [0110 0001] ,因此在循环输出时输出为数字 示例如下:
>>> "asa".encode('utf-8')
b'asa'
>>> for item in b'asa':
print(item)
97
115
97
>>> for item in b'as圣诞节':
print(item)
SyntaxError: bytes can only contain ASCII literal characters.