10 - 凯撒加密的奥义
本帖最后由 鱼C-小师妹 于 2021-6-4 19:17 编辑在线视频:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=12
《罗马帝王传》中描述了古罗马恺撒大帝在公元 2 世纪使用的一种加密方法。
它通过将字母按字母表中的顺序后移 3 位起到加密作用,如将字母 A 换作字母 D,将字母 B 换作字母 E,以此类推。
假如有这样一道命令 RETURN TO ROME,在用恺撒的方法加密之后就成为 UHWXUQ WR URPH 这样的密文。
这样即使被敌军截获,也无法从字面上获得有用信息。
在《罗马帝王传》中还说到解密方法:
如果想知道它们的意思,得用第4个字母置换第1个字母,即以D代A,以此类推。
当恺撒的将领们收到密文后,会按此法将密文还原,然后执行恺撒的命令。
虽然没有史书记载恺撒加密术在当时的效果如何,但是从恺撒所取得的军事成就来看,相信它在当时是安全可靠的。
现在我们利用计算机程序破解恺撒密码是轻而易举的事情!
今天我们就编写一个程序实现恺撒加密算法。
用英文输入一句话,只加密字母,加密规则是:
将字母 A 换作字母 D,B 变成 E……以此类推 X 将变成 A,Y 变成 B,Z 成 C。
加密时区分字母的大小写。
听起来是不是很有趣的亚子!!
为方便使用,我们先按照恺撒加密法的规则制成明文和密文字母对照表,如下。
明文字母表: ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表: DEFGHIJKLMNOPQRSTUVWXYZABC
小写也是一样的哦。
这样通信时,利用对照表很容易实现明文和密文之间的转换了。
例如,明文是 I Love FishC 。
那么按照上面的映射规则,密文是:
**** Hidden Message *****
我们人类是可以这样来用的,计算机怎么办呢?
最简单的方式就是利用 ASCII 码。
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
例如,大写字母 A 的 ASCII 码为 65,小写字母 a 的 ASCII 码为 97 。
利用 ord() 函数可以获取一个字符的 ASCII 码:
如果知道一个字符的 ASCII 码,利用 chr() 函数可以将其转为对应的字符:
补充一个知识点:
英文字母的大小写是分别连续的
大写字母 A - Z 的 ASCII 码是 65 - 90 。
小写字母 a - z 的 ASCII 码 是 97 - 122 。
大家可以去网上搜 ASCII 码表,这里就不配图咯。
现在来说下如何利用 ASCII 码进行恺撒加密的方法:
[*]对于字母 A~W 或 a~w,将字母的 ASCII 码加上 3
[*]对于字母 X~Z 或 x~z,将字母的 ASCII 码减去 23
第二点是因为 ASCII 码加 3 就会变成其他字符而非我们要的字母。
例如,要将 F 替换 I,可以进行如下操作:
>>> chr(ord('F')+3)
'I'
先将 ASCII 码加 3,然后再转为对应字母。
同样当处理 XYZ 或 xyz 时,需要折回到字母序列的开头,替换为 ABC 或 abc 。
例如,将 X 替换为 A,可以进行如下操作:
>>> chr(ord('X')-23)
'A'
这两个核心转换有了,剩下的就好说了!
我们先将输入的明文字符串存放到变量 text 中,再创建一个计数型循环结构,以计数器i作为字符串的下标。
逐个读取明文字符串 text 中的字符,加密后存放到密文字符串 secret 中。
循环控制条件是 i<len(text),其中 len() 函数用于获取字符串的长度。
判断如果 i<len(text) 为真,就从明文字符串 text 中读取一个字符,存放到变量 c 中。
如果为假,就意味着可以输出结果咯。
接下来判断 c 中的值,然后依次进行上面两种转换。
转换后将加密字符连接到字符串 secret 中。
如果不是字符我们就不加密啦,该是什么就是什么,直接放到 secret 中。
程序设计就是这样啦,学到现在,应该已经具备独立画成流程的能力咯!
这里请暂停视频自己去画,假设你画好啦,来看和小师妹的一样吗:
**** Hidden Message *****
流程图有了,直接写代码:
看起来很难的加密,就这么被我们用几行代码攻破咯!
好了,下课!
认真学算法{:10_257:} look 学习 学习一下{:10_257:} kk
1 解密:
lowercase =
code = lowercase[:]
t = 3
while t:
code.insert(0, code.pop())
t -= 1
dictcode = dict(zip(lowercase, code))
temp = input('请输入密文:')
s = temp.translate(temp.maketrans(dictcode))
print('该密文的明文是:', s)
kankan {:5_108:} 又来学习啦 本帖最后由 深邃海绵 于 2021-9-15 22:58 编辑
t = input('输入需要加密的字符:')
'''k = []
for i in t:
if (ord(i) >= ord("A") and ord(i) <= ord('W')) or (ord(i) >= ord('a') and ord(i) <= ord('w')):
k.append(chr(ord(i)+3))
elif (ord(i) >= ord("X") and ord(i) <= ord('Z')) or (ord(i) >= ord('x') and ord(i) <= ord('z')):
k.append(chr(ord(i)-23))
else:
k.append(i)
print('源字符串是:{}\n解密后的字符串是{}'.format(t,k))'''
看看 {:5_105:} def CaesarCipher(plaintext: str) -> str:
"""此为凯撒加密函数"""
res = ''
for s in plaintext:
if s.islower():
res += chr(((ord(s)-94)%26)+97)
elif s.isupper():
res += chr(((ord(s)-62)%26)+65)
else:
res = res+s
return res
def Decrypt(password: str) -> str:
"""此为解密函数"""
res = ''
for s in password:
if s.islower():
res += chr(((ord(s)-100)%26)+97)
elif s.isupper():
res += chr(((ord(s)-68)%26)+65)
else:
res = res+s
return res
plaintext = "I Love FishC.com"
password = "L Oryh IlvkF.frp"
print(CaesarCipher(plaintext))
print(Decrypt(password))
L Oryh IlvkF.frp
I Love FishC.com rower M Oryh ImvlF unknown = input('请输入暗码:')
code = ()
for each in unknown:
if (65 <= ord(each) <= 87) or (97 <= ord(each) <= 119):
code = chr(ord(each)+3)
print(f"{code}",end='')
elif (88 <= ord(each) <= 90) or (120 <= ord(each) <= 122):
code = chr(ord(each)-23)
print(f"{code}",end='')
打印出来是这样:
请输入暗码:I Love FishC.com
LOryhIlvkFfrp
空格和点怎么不见鸟~ .
谢谢