凯撒密码 ---Python

本文介绍了如何使用Python的String模块和maketrans,translate函数实现凯撒密码的加密与解密,涉及偏移量计算和字符串操作。

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

目录

第1关:凯撒密码-加密

相关知识

String 模块

maketrans() 和 translate()

代码实现

第2关:凯撒密码-解密

相关知识

凯撒密码

Python String 模块内置常量

推测偏移量

maketrans

代码实现


第1关:凯撒密码-加密

相关知识

为了完成本关任务,你需要掌握:1.string库,2.maketrans() 函数,3.translate()函数。

String 模块

要使用string模块,我们需要先导入: import string

下面介绍几个string的内置属性:

  • string.ascii_uppercase 所有大写字母
  • string.ascii_lowercase 所有小写字母
  • string.ascii_letters 所有字母
  • string.digits 所有数字

示例如下:

 
  1. import string
  2. lower = string.ascii_lowercase
  3. upper = string.ascii_uppercase
  4. digit = string.digits
  5. before = string.ascii_letters

输出:

 
  1. abcdefghijklmnopqrstuvwxyz
  2. ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. 0123456789
  4. abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
maketrans() 和 translate()

由于两个函数要结合使用,所以就一起介绍了。

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

注:两个字符串的长度必须相同,为一 一对应的关系。

maketrans()方法语法: str.maketrans(intab, outtab)

参数

  • intab -- 字符串中要替代的字符组成的字符串。
  • outtab -- 相应的映射字符的字符串。

返回值 返回字符串转换后生成的新字符串。


translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符, 要过滤掉的字符放到 del 参数中。

translate()方法语法: str.translate(table[, deletechars])

参数

  • table -- 翻译表,翻译表是通过maketrans方法转换而来。
  • deletechars -- 字符串中要过滤的字符列表。

返回值 返回翻译后的字符串。

示例如下: 示例一:

 
  1. intab = "aeiou" # 原字符
  2. outtab = "12345" # 用于替换的字符
  3. # 想要加密的字符串的明文
  4. txt = "this is string example....wow!!!"
  5. # 创建映射转换表
  6. # 将明文中字符"a、e、i、o、u"分别替换为"1、2、3、4、5",其他字符不变
  7. trantab = ''.maketrans(intab, outtab)
  8. # 输出加密后的结果
  9. print(txt.translate(trantab))

输出: th3s 3s str3ng 2x1mpl2....w4w!!!

示例二:

 
  1. intab = "abcdefghijklmnopqrstuvwxyz" # 原字符
  2. outtab = "defghijklmnopqrstuvwxyzabc" # 用于替换的字符
  3. # 想要加密的字符串的明文
  4. txt = "this is string example....wow!!!"
  5. # 创建映射转换表,用后面第3个字符替换
  6. trantab = ''.maketrans(intab, outtab)
  7. # 输出加密后的结果
  8. print(txt.translate(trantab))

输出: wklv lv vwulqj hadpsoh....zrz!!!

输入输出格式

输入格式

输入为一行,是一个字符串。

输出格式

输出为一行,对输入的字符串进行加密后的字符串。

编程要求

根据提示,在右侧编辑器补充代码,实现凯撒加密:输入一个字符串,对字符串中的字母和数字进行加密(规定加密偏移量为3,即后移三位),并输出加密后的字符串。

代码实现

import string

def caesar_cipher(text):
    """接收一个字符串为参数,采用字母表和数字中后面第n个字符代替当前字符的方法
    对字符串中的字母和数字进行替换,实现加密效果,返回值为加密的字符串。
    例如:2019 abc 替换为5342 def """
    lower = string.ascii_lowercase          # 小写字母
    upper = string.ascii_uppercase          # 大写字母
    digit = string.digits                   # 数字
    before = string.ascii_letters + digit   # 字母+数字
    after = lower[3:] + lower[:3] + upper[3:] + upper[:3] + digit[3:] +\
            digit[:3]  # 分别处理
    table = ''.maketrans(before, after)     # 创建字符映射表
    ciphertext = text.translate(table)      # 根据映射表进行字符转换
    return ciphertext

if __name__ == '__main__':
    plaintext = input()  # 输入欲加密的字符串
     # 输入整数偏移量
    print(caesar_cipher(plaintext))

测试说明

平台会对你编写的代码进行测试:

测试输入:Open Box PassWord:2021 预期输出:Rshq Era SdvvZrug:5354

第2关:凯撒密码-解密

任务描述

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

输入格式

输入为一行,一份新截获的密文字符串s1

输出格式

输出为两行: 第一行是敌方加密用偏移量 第二行是对s1进行解密后的明文

相关知识

凯撒密码

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

明:ABCDEFGHIJKLMNOPQRSTUVWXYZ

密:TUVWXYZABCDEFGHIJKLMNOPQRS

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

明文: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
 
  1. def caesar_decrypt(text, offset):
  2. """接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符
  3. 代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。"""
  4. lower = string.ascii_lowercase # 小写字母
  5. upper = string.ascii_uppercase # 大写字母
  6. digit = string.digits # 数字
  7. before = string.ascii_letters + digit
  8. after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset]
  9. table = ''.maketrans(after, before)
  10. decrypt_text = text.translate(table)
  11. return decrypt_text
推测偏移量
 
  1. def find_offset(key_text, ciphertext):
  2. """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。
  3. 如果key_text 在解密后的明文里,则说明解密成功。
  4. 找出偏移量数值并返回这个整数偏移量。"""
  5. for i in range(26):
  6. plain_text = caesar_decrypt(ciphertext, i) # 使用i作为偏移量,尝试解密得到明文
  7. if key_text in plain_text: # 如果key_text在明文里,说明偏移值为i时能成功解密
  8. return i
maketrans

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

语法
 
  1. str.maketrans(intab, outtab)
参数说明
  • intab - - 字符串中要替代的字符组成的字符串。
  • outtab - - 相应的映射字符的字符串。
编程要求

在右侧编辑器中代码。具体要求如下: 某国截获一份情报如下:Yt gj, tw sty yt gj, ymfy nx f vzjxynts. 。 根据潜伏的特工传回的消息,知道这份情报的明文中有一个单词是 question,且采用的是恺撒加密的方法,偏移量未知。 请编程计算偏移量,并用得到的偏移量解密读到的密文。

代码实现

import string

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


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

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))  #解密,打印明文
    
测试说明

平台会对你编写的代码进行测试:

测试输入: Fyyfhp ts Ujfwq Mfwgtw ts Ijhjrgjw 2, 6496

预期输出: 密钥是5 Attack on Pearl Harbor on December 7, 1941

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值