鱼C-小师妹 发表于 2021-5-16 19:48:02

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 *****

流程图有了,直接写代码:



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

好了,下课!

yayc_zcyd 发表于 2021-5-18 21:29:45

认真学算法{:10_257:}

Minecraft程序猿 发表于 2021-5-19 12:07:14

look

bool想学C 发表于 2021-5-24 08:53:55

学习

fish_nian 发表于 2021-5-24 09:37:23

学习一下{:10_257:}

ilovepython! 发表于 2021-5-29 11:13:09

kk

calrai11 发表于 2021-6-8 16:24:41

1

zhangyuesd 发表于 2021-6-23 12:39:08

解密:
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)

Computer-Lab 发表于 2021-8-12 14:40:19

kankan

nail5484648464 发表于 2021-8-20 18:04:43

{:5_108:}

旗鱼骑士的旗鱼 发表于 2021-8-31 16:49:41

又来学习啦

深邃海绵 发表于 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))'''




私が 发表于 2021-10-4 20:15:54

看看

傻眼貓咪 发表于 2021-10-4 20:29:59

{:5_105:}

傻眼貓咪 发表于 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

dameng23 发表于 2021-10-13 20:02:58

rower

LyyLD 发表于 2021-11-2 22:05:47

M Oryh ImvlF

游刃鱿鱼 发表于 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
空格和点怎么不见鸟~

纯水货 发表于 2021-11-29 16:08:46

.

aironeng 发表于 2021-12-2 15:49:28

谢谢
页: [1] 2 3
查看完整版本: 10 - 凯撒加密的奥义