没错啦,又是我哈哈!!!
考试瞅着一个奇奇怪怪的题目,来给大伙们讲讲咋解决
一瞅,嘶~头大,但是细细尝一下,好像还行哈,不是那么太难,只要找到规律
直接掏他裆间!!!!(傲娇)
首先,咱来分析一下题目,直接抓主干,多一个字不看,但凡多一个字,直接掏他裆间!!!
对咱有用的信息:
有三个密钥“ABC”
以及一个转换表
明文 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
密钥A | BCDEFGHIJKLMNOPQRSTUVWXYZA |
密钥B | CDEFGHIJKLMNOPQRSTUVWXYZAB |
密钥C | DEFGHIJKLMNOPQRSTUVWXYZABC |
到这里了,咱能发现,它的密钥很简单
基本上就是一起丢到最后
第二个信息,这是关键,转换规则,难点和重点来了嗷,这里为随机选择加密密钥
当选择密钥A时,输入“HELLO",输出是"IFMMP"
当选择密钥B时,输入“HELLO",输出是"JGNNQ"
好,这时候咱来分析一下,输进去东西的跟输出来的东西有没有啥关系
咱来仔细比对一下,就会发现,他们的位置竟然是一一对应的!
这可是个大发现,同时,这也是这题的解题思路,当然,还有第二种方法(有点小难但不多)
'''
已知
HELLO -- IFMMP
HELLO -- JGNNQ
输入 : E H L O
明文 :ABCDEFGHIJKLMNOPQRSTUVWXYZ
密钥A:BCDEFGHIJKLMNOPQRSTUVWXYZA
输出 : F I M P
'''
思路‘chua’的一下就清晰起来了,既然他们的位置,那就可以从他们的下标(索引值入手)
获取下标(索引值)可以使用find()方法实现,具体咋实现捏
简单来说就是,利用循环,将输入的每个字符在明文里找到对应的下标(索引值),然后再去对印的密钥里用下标(索引值)将需要的字符提取出来
ps:这个下标(索引值)怎么正确提取出来,是这个思路的关键点
OK!理论正确,开始实践!
首先,需要导入random库实现随机选择密钥,我想这个大佬们应该都会,方法不唯一
import random #导入random库
my = random.choice('ABC') #随机选择‘ABC’三个密钥,所以使用choice直接选
#把密钥的值给my,后面判断需要
print('密钥为:', my) #输出密钥,
然后就是关键代码部分,如何提取以及在随机选择的密钥部分找到字符并输出
如果 选择了密钥A,那么代码部分应该这样(方法不唯一,大佬们轻点喷)
s='' #建立一个字符空串,用于添加转换后的字符
if my == 'A': #判断条件
for i in mw: #将输入的字符进行循环
a = Mingwen.find(i) # 在明文内找到循环字符的下标(索引值)
s = s+A[a] #在对应的密文找到对应的字符,添加进s
所以,剩下的B和C应该就很简单了吧~,直接上代码
if my == 'B':
for i in mw:
a = Mingwen.find(i)
s = s+B[a]
if my == 'C':
for i in mw:
a = Mingwen.find(i)
s = s+C[a]
最后输出直接一个print(s)直接完事!嘎嘎简单,直接拿捏
所以,完整代码给各位大佬奉上
"""
HELLO -- IFMMP
HELLO -- JGNNQ
明文 :'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
密钥A:'BCDEFGHIJKLMNOPQRSTUVWXYZA'
密钥B:'CDEFGHIJKLMNOPQRSTUVWXYZAB'
"""
import random
s = ''
my = random.choice('ABC')
print('密钥为:', my)
Mingwen = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
A = list('BCDEFGHIJKLMNOPQRSTUVWXYZA')# 把他变成列表好找一点,不是我闲的没事干
B = list('CDEFGHIJKLMNOPQRSTUVWXYZAB')
C = list('DEFGHIJKLMNOPQRSTUVWXYZABC')
mw = list(input('请输入明文:'))
if my == 'A':
for i in mw:
a = Mingwen.find(i)
s = s+A[a]
if my == 'B':
for i in mw:
a = Mingwen.find(i)
s = s+B[a]
if my == 'C':
for i in mw:
a = Mingwen.find(i)
s = s+C[a]
for j in s:
print(j, end='') #不嫌麻烦就多个循环,直接print(s)效果一样的
欧克啦!第一种方法讲完啦,接下来瞅瞅第二种方法(这是这道题的答案)
直接上代码!
import random
s=input('请输入一个明文字符串(大写字母):')
key=random.chioce('ABC')
if key=='A':
n=1 #直接赋值一个变量
elif key=='B':
n=2
elif key=='C':
n=3
ls=[]
for i in s:
t=ord(i)+n #先给字符转成ASCII码,加上n,因为密钥是比明文少一位的,密钥A的‘A’去最后了嘛
if t>ord('Z'): #判断t的值有没有大于Z的ASCII的值
t=t-26 #有就减去26之后再从头开始找
ls.append(chr(t)) #添加进ls里面
st=''.join(ls)# 填充‘’变成一个字符串
print(key,st)
这个捏,有点麻烦,通过ASCII值来找,虽然更快,更准,但是基础不好的大佬不能轻易尝试
容易出错(我就错了呜呜呜~白丢10分)
好啦好啦好啦!感谢大佬能看到这里,比心~~~~~
太晚了,已经12点多了,困死啊~转换回来就明天再写吧