python编写随机加密系统,密文加密以及转换回来

文章讲述了如何通过观察和分析一个涉及密钥和转换规则的加密问题,利用Python编程解决,主要涉及找到字符位置对应和使用ASCII值进行解密的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没错啦,又是我哈哈!!!

考试瞅着一个奇奇怪怪的题目,来给大伙们讲讲咋解决

 一瞅,嘶~头大,但是细细尝一下,好像还行哈,不是那么太难,只要找到规律

直接掏他裆间!!!!(傲娇)

首先,咱来分析一下题目,直接抓主干,多一个字不看,但凡多一个字,直接掏他裆间!!!

对咱有用的信息:

有三个密钥“ABC”

以及一个转换表

明文ABCDEFGHIJKLMNOPQRSTUVWXYZ
密钥ABCDEFGHIJKLMNOPQRSTUVWXYZA
密钥BCDEFGHIJKLMNOPQRSTUVWXYZAB
密钥CDEFGHIJKLMNOPQRSTUVWXYZABC

到这里了,咱能发现,它的密钥很简单

基本上就是一起丢到最后

第二个信息,这是关键,转换规则,难点和重点来了嗷,这里为随机选择加密密钥

当选择密钥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点多了,困死啊~转换回来就明天再写吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值