鱼C论坛

 找回密码
 立即注册
查看: 1223|回复: 8

[已解决]【字符串--凯撒密码】看不懂代码,求大神帮忙分析

[复制链接]
发表于 2019-8-15 19:29:09 | 显示全部楼层 |阅读模式

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

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

x
描述
恺撒密码是古罗马恺撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬
原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

假设用户可能使用的输入包含大小写字母a~zA~Z、空格和特殊符号,请编写一个程序,对输入字符串进行恺撒密码加密,直接输出结果,其中空格不用进行加密处理。使用input()获得输入。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬


代码如下:
  1. s = input()
  2. t = ""
  3. for c in s:
  4.     if 'a' <= c <= 'z':
  5.         t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )
  6.     elif 'A' <= c <= 'Z':
  7.         t += chr( ord('A') + ((ord(c)-ord('A')) + 3 )%26 )
  8.     else:
  9.         t += c
  10. print(t)
复制代码


问题如下:
1:对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8235;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8235;&#8236;&#8238;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;

上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8235;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8235;&#8236;&#8238;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8234;&#8236;&#8238;&#8236;&#8234;&#8236;&#8237;&#8236;
  
为什么加密的时候要mod26呢    原因是什么呢

2: t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )

为什么要把加ord“a”,原因是什么
这一条表达式这样写  我看不明白
求大神帮忙分析一下
最佳答案
2019-8-15 23:28:00
mod 26 是因为一共26个字母吧,这样的话每个字母对应一个不同的值。ord的意思是把char 字母转换成 ASCII码值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-15 23:28:00 | 显示全部楼层    本楼为最佳答案   
mod 26 是因为一共26个字母吧,这样的话每个字母对应一个不同的值。ord的意思是把char 字母转换成 ASCII码值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 23:41:37 | 显示全部楼层
Seawolf 发表于 2019-8-15 23:28
mod 26 是因为一共26个字母吧,这样的话每个字母对应一个不同的值。ord的意思是把char 字母转换成 ASCII码 ...

打个比方
现在a的ASCII值是1
那按照要求来说  我(1+3)%26  就可以得到结果
但是答案代码是
ord('a') + ((ord(c)-ord('a')) + 3 )%26
相当于1+((x-1)+3)%26
这一部分没看懂  为什么要这样写呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 23:49:19 | 显示全部楼层
inver11 发表于 2019-8-15 23:41
打个比方
现在a的ASCII值是1
那按照要求来说  我(1+3)%26  就可以得到结果

你得到的结果还是数字呀,需要把数字再转回成ASCII值的,每个字母对应的ASCII值是不变的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-16 00:05:28 | 显示全部楼层
Seawolf 发表于 2019-8-15 23:49
你得到的结果还是数字呀,需要把数字再转回成ASCII值的,每个字母对应的ASCII值是不变的

我知道那个函数的用法   我的意思是
为什么要用公式去求解
(1+3)%26  就可以得到结果
为什么要用1+((x-1)+3)%26求结果呢
而且这条公式是为什么要这样用呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 00:52:34 | 显示全部楼层
inver11 发表于 2019-8-16 00:05
我知道那个函数的用法   我的意思是
为什么要用公式去求解
(1+3)%26  就可以得到结果

(1+3)%26 是可以得到结果,这是在你已知的情况下,如果一个未知的字母X作为input 你怎么计算它的值呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-16 15:02:19 | 显示全部楼层
本帖最后由 inver11 于 2019-8-16 15:03 编辑
Seawolf 发表于 2019-8-16 00:52
(1+3)%26 是可以得到结果,这是在你已知的情况下,如果一个未知的字母X作为input 你怎么计算它的值呢



假设
d的ascii值为4
g的ascii值为7
根据用户输入的字符串获取ascii表
比如我现在输入的数是d  ord“d”
那我只需要用公式(C=(P+3) mod 26)
也就是7  在用chr“7”  转换成“g”输出
那么
ord('a') + ((ord(c)-ord('a')) + 3 )%26   即   1+((x-1)+3)%26
的意义是什么呢
为什么要用这条公式去计算呢   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 17:22:10 | 显示全部楼层
英文字母的ANSII值是从字符a开始的,到Z结束,所以要加上ord('a')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-16 20:20:18 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-8-16 17:22
英文字母的ANSII值是从字符a开始的,到Z结束,所以要加上ord('a')

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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