鱼C论坛

 找回密码
 立即注册
查看: 10906|回复: 47

[技术交流] 10 - 凯撒加密的奥义

[复制链接]
发表于 2021-5-16 19:48:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-6-4 19:17 编辑

在线视频:



download.jpg

《罗马帝王传》中描述了古罗马恺撒大帝在公元 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 。

那么按照上面的映射规则,密文是:
游客,如果您要查看本帖隐藏内容请回复


我们人类是可以这样来用的,计算机怎么办呢?

最简单的方式就是利用 ASCII 码。

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

例如,大写字母 A 的 ASCII 码为 65,小写字母 a 的 ASCII 码为 97 。

利用 ord() 函数可以获取一个字符的 ASCII 码:

2021-05-23_17-24-28.jpg

如果知道一个字符的 ASCII 码,利用 chr() 函数可以将其转为对应的字符:

2021-05-23_17-25-51.jpg

补充一个知识点:

英文字母的大小写是分别连续的

大写字母 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 中。

程序设计就是这样啦,学到现在,应该已经具备独立画成流程的能力咯!

这里请暂停视频自己去画,假设你画好啦,来看和小师妹的一样吗:

游客,如果您要查看本帖隐藏内容请回复


流程图有了,直接写代码: P10.py.zip (704 Bytes, 下载次数: 38, 售价: 6 鱼币)

2021-05-23_19-25-36.jpg

看起来很难的加密,就这么被我们用几行代码攻破咯!

好了,下课!

评分

参与人数 3荣誉 +16 鱼币 +6 贡献 +12 收起 理由
睦ちゃん她爹 + 5 + 3 学会!
bool想学C + 5 + 3 催更
不二如是 + 6 + 6 + 6 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-18 21:29:45 | 显示全部楼层
认真学算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-19 12:07:14 From FishC Mobile | 显示全部楼层
look
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-24 08:53:55 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-24 09:37:23 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 11:13:09 | 显示全部楼层
kk
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-8 16:24:41 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-23 12:39:08 | 显示全部楼层
解密:
lowercase = [str(chr(i)) for i in range(97, 123)]
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-12 14:40:19 | 显示全部楼层
kankan
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 18:04:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-31 16:49:41 | 显示全部楼层
又来学习啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-15 22:31:41 | 显示全部楼层
本帖最后由 深邃海绵 于 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))'''




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-4 20:15:54 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-4 20:29:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-4 20:43:09 | 显示全部楼层
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-13 20:02:58 | 显示全部楼层
rower
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-2 22:05:47 | 显示全部楼层
M Oryh ImvlF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-6 20:47:32 | 显示全部楼层
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
空格和点怎么不见鸟~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-29 16:08:46 | 显示全部楼层
.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-2 15:49:28 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表