【问题标题】:Substitution Cipher Python替换密码 Python
【发布时间】:2016-03-23 20:36:43
【问题描述】:

我必须制作一个替换密码程序,我首先创建一个随机密钥,然后使用该密钥解密/加密一些用户输入(明文)。问题的约束如下:

  1. encryptMsg(明文、密钥、字母) 将明文字符串、字母字符串和密钥字符串作为参数并返回 加密的密码字符串。注意,在这个函数中,您必须首先将明文字符串转换为所有 小写并删除任何未出现在字母字符串中的标点符号/字符!

  2. decryptMsg(密文、密钥、字母) 将获取一个密文字符串、一个字母字符串和一个密钥字符串并返回明文 字符串。

  3. makeKey(字母) 通过随机打乱字母字符串中的字符生成并返回密钥字符串 争论。提示:这涉及使用 random.shuffle() 将字符串转换为列表 方法,然后将列表转回字符串

这是我所拥有的:

import random
alphabet = "'abcdefghijklmnopqrstuvwxyz.,!'"

def makeKey(alphabet):
   alphabet= list(alphabet)
   key= random.shuffle(alphabet)
   alphabet= str(alphabet)
   return key


def encrypt(plaintext, key, alphabet):
    """Encrypt the string and return the ciphertext"""
    return ''.join(key[l] for l in plaintext)
print (alphabet)

我知道我在 makeKey 函数上做错了,因为它不起作用。我需要一些关于如何启动其他功能的帮助。我们不能使用字典,只能列出方法。任何关于在我的任务中快速启动我的帮助或建议将不胜感激。谢谢大家!

更新:示例输出如下:

字母:'abcdefghijklmnopqrstuvwxyz.,! '

密钥:'nu.t!iyvxqfl,bcjrodhkaew spzgm'

输入明文:嘿嘿,真好玩!

密文:'v! zmhvxdmxdmo!nll mikbg'

解密文本:“嘿,这真的很有趣!”

【问题讨论】:

  • 你怎么知道它不起作用,你打电话了吗?此外,如果您想将其作为字符串取回,请使用 ''.join(alphabet) 而不是 str(alphabet)
  • 你打算如何解密?
  • 还没开始。这就是我的问题。我需要一些指导来解决这个问题? #NoviceProbs
  • @Joe 第二种方法对你有用吗?

标签: python


【解决方案1】:

原答案如下

请向我们展示一些示例输入和输出示例。根据您的代码,我可以提出以下内容 - random.shuffle 将所有内容打乱并返回 None,将您的 makeKey 更改为:

def makeKey(alphabet):
   alphabet = list(alphabet)
   random.shuffle(alphabet)
   return ''.join(alphabet)

编辑 2

对于在加密/解密中不使用dicts 的方法,请参见下文:

import random

alphabet = 'abcdefghijklmnopqrstuvwxyz.,! ' # Note the space at the end, which I kept missing.
# You could generate the key below using makeKey (i.e. key=makeKey(alphabet))
key = 'nu.t!iyvxqfl,bcjrodhkaew spzgm'
plaintext = "Hey, this is really fun!"
# v! zmhvxdmxdmo!nll mikbg


def makeKey(alphabet):
   alphabet = list(alphabet)
   random.shuffle(alphabet)
   return ''.join(alphabet)

def encrypt(plaintext, key, alphabet):
    keyIndices = [alphabet.index(k.lower()) for k in plaintext]
    return ''.join(key[keyIndex] for keyIndex in keyIndices)

def decrypt(cipher, key, alphabet):
    keyIndices = [key.index(k) for k in cipher]
    return ''.join(alphabet[keyIndex] for keyIndex in keyIndices)

cipher = encrypt(plaintext, key, alphabet)

print(plaintext)
print(cipher)
print(decrypt(cipher, key, alphabet))

打印

Hey, this is really fun!
v! zmhvxdmxdmo!nll mikbg
hey, this is really fun!

编辑

在一些间距问题和实验之后,我想出了这个相当简单的解决方案:

import random

alphabet = 'abcdefghijklmnopqrstuvwxyz.,! '
key = 'nu.t!iyvxqfl,bcjrodhkaew spzgm'
plaintext = "Hey, this is really fun!"


def makeKey(alphabet):
   alphabet = list(alphabet)
   random.shuffle(alphabet)
   return ''.join(alphabet)

def encrypt(plaintext, key, alphabet):
    keyMap = dict(zip(alphabet, key))
    return ''.join(keyMap.get(c.lower(), c) for c in plaintext)

def decrypt(cipher, key, alphabet):
    keyMap = dict(zip(key, alphabet))
    return ''.join(keyMap.get(c.lower(), c) for c in cipher)

cipher = encrypt(plaintext, key, alphabet)

print(plaintext)
print(cipher)
print(decrypt(cipher, key, alphabet))

打印出来

Hey, this is really fun!
v! zmhvxdmxdmo!nll mikbg
hey, this is really fun!

【讨论】:

  • 刚刚在上面添加了一个示例输出。我也很感激其他功能的一些帮助。谢谢!
  • 有没有使用 dict(zip(...)) 的替代方法。我们不允许使用字典。这也是我在网上发现的主要方法。这绝对是有效的,但遗憾的是我们的教授关心更多的蛮力。
  • 查看我的第二次编辑以了解不使用 dicts 的方法
  • @Reti43,说得有道理,我刚刚离开办公桌,一回到我的电脑就会这样做;在此期间随意编辑:)
  • @Reti43 根据您的反馈编辑了我的答案,谢谢!