5.2凯撒密码-解密python

本关任务:请编程计算偏移量,并用得到的偏移量解密读到的密文。

代码如下:

import string

def caesar_decrypt(text, offset):
    """接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符
    代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。"""
    ###############################Begin#############################################
    lower = string.ascii_lowercase          # 小写字母
    upper = string.ascii_uppercase          # 大写字母
    digit = string.digits                # 数字
    before = string.ascii_letters + digit
    after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset]
    table = ''.maketrans(after, before)
    decrypt_text = text.translate(table)
    return decrypt_text  


    ################################End##############################################

def find_offset(key_text, ciphertext):
    """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。
        如果key_text 在解密后的明文里,则说明解密成功。
    找出偏移量数值并返回这个整数偏移量。"""
    ###############################Begin#############################################
    for i in range(26):
        plain_text = caesar_decrypt(ciphertext, i) #使用i作为偏移量,尝试解密得到明文
        if key_text in plain_text : # 如果key_text在明文里,说明偏移值为i时能成功解密
            return i
    ################################End##############################################


if __name__ == '__main__':
    key_message = 'question'                                   #密文中的已知单词
    cipher_text = 'Yt gj,tw sty yt gj,ymfy nx f vzjxynts.'      #截获的密文
    secret_key = find_offset(key_message, cipher_text)   #破解密码,得到密匙
    print(f'密钥是{secret_key}')
    
    target_text = input() #读入新密文,进行解密
    #'Fyyfhp ts Ujfwq Mfwgtw ts Ijhjrgjw 2, 6496'   #新密文,需要解密
    print(caesar_decrypt(target_text, secret_key))  #解密,打印明文
    

凯撒密码

凯撒加密方法可以依据移位的不同产生新的变化,如将每个字母左 19 位,就产生这样一个明密对照表(以大写字母为例):

明: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

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

在这个加密表下,明文与密文的对照关系就变成:

明文:THE FAULT, DEAR BRUTUS, LIES NOT IN OUR STARS BUT IN OURSELVES.

密文:MAX YTNEM, WXTK UKNMNL, EBXL GHM BG HNK LMTKL UNM BG HNKLXEOXL.

这样,每改变一个偏移量的数值,就可得到一种不同的加密结果,这种方法可以在一定程度上提升加密强度。

Python String 模块内置属性

  • string.ascii_lowercase 小写字母
  • string.ascii_uppercase 大写字母
  • string.digits 数字0-9
def caesar_decrypt(text, offset):
"""接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符
代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。"""
lower = string.ascii_lowercase # 小写字母
upper = string.ascii_uppercase # 大写字母
digit = string.digits # 数字
before = string.ascii_letters + digit
after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset]
table = ''.maketrans(after, before)
decrypt_text = text.translate(table)
return decrypt_text

Python 常用函数

(1)range

range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。

语法:

range(stop)
range(start, stop[, step])

参数说明

  • start: 计数从 start 开始。默认是从 0 开始。例如range(3)等价于range(0, 3);

  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 3) 是[0, 1, 2]没有3

  • step:步长,默认为1。例如:range(0, 3) 等价于 range(0, 3, 1)

    def find_offset(key_text, ciphertext):
    """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。
    如果key_text 在解密后的明文里,则说明解密成功。
    找出偏移量数值并返回这个整数偏移量。"""
    for i in range(26):
    plain_text = caesar_decrypt(ciphertext, i) #使用i作为偏移量,尝试解密得到明文
    if key_text in plain_text : # 如果key_text在明文里,说明偏移值为i时能成功解密
    return i

(2)maketrans

maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

语法:

str.maketrans(intab, outtab)

参数说明

  • intab -- 字符串中要替代的字符组成的字符串。
  • outtab -- 相应的映射字符的字符串。
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值