【问题标题】:Ascii strings in PythonPython中的ASCII字符串
【发布时间】:2021-11-01 19:16:17
【问题描述】:

我目前正在为我的大学举办 CTF 比赛。我们的挑战之一将使用凯撒密码来解决基本标志之一。在创建将创建我们的密文的代码时,我注意到创建凯撒密码程序的一种非常常见的方法是利用字符串库。

更具体地说,他们将首先检查字母是大写还是小写,或者定义一个可接受的“字母表”列表

例如。这将是

import string

def caesar(text, shift, alphabets):

    def shift_alphabet(alphabet):
        return alphabet[shift:] + alphabet[:shift]

    shifted_alphabet = tuple(map(shift_alphabet, alphabets))
    final_alphabet = ''.join(alphabets)
    final_shifted_alphabet = ''.join(shifted_alphabet)
    table = str.maketrans(final_alphabet, final_shifted_alphabet)
    return text.translate(table)

message = "This is a message."
print(caesar(message, 7, [string.ascii_uppercase, string.ascii_lowercase, string.punctuation]))

我对字符串的了解(并且我已经使用string.ascii_letters 测试过它)是我可以使用上述string.ascii_letters 归档相同的结果,而不是检查是大写还是小写。

我找不到答案是为什么人们会决定这样做而不是使用全部捕获.ascii_letters

有性能损失吗?或者只是单独检查的好习惯?

【问题讨论】:

  • potayto/potahto,最后你用maketrans 喂的完全一样
  • 欢迎来到 Stack Overflow!请拨打tour。请edit这个问题有一个更具描述性的标题。有关更多提示,请参阅How to Ask
  • 好的!非常感谢@diggusbiccus

标签: python python-3.x string


【解决方案1】:

我认为很多人就是这样做的,因为这就是你在其他编程语言中的做法。

在 python 中,您可以使用很多内置函数。 一个干净的解决方案(在我看来)是这样做的

def shift_cipher(text: str, shift: int) -> str:
    """
    1. normalize the shift
    2.  shift the ASCII-alphabet:
        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
        -> 'defghijklmnopqrstuvwxyzabcDEFGHIJKLMNOPQRSTUVWXYZABC'
    3.  make a translation table and then translate the String
    """
    shift = shift % 26  # normalize shift
    alpha = string.ascii_letters
    alpha_shifted = alpha[shift:26] + alpha[:shift] + alpha[26 + shift:] + alpha[26:26 + shift]
    shift_table = text.maketrans(alpha, alpha_shifted)
    return text.translate(shift_table)

【讨论】:

  • 有趣。除了 Python,我对其他任何东西都没有太多经验。所以我只熟悉如何使用 Python 来做到这一点。我喜欢你的解决方案。真的很整洁。
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2013-06-20
  • 1970-01-01
相关资源
最近更新 更多