【问题标题】:Random Substitution Cipher (Python)随机替换密码(Python)
【发布时间】:2017-03-01 16:22:21
【问题描述】:

我正在编写一个随机替换密码,它在用于编写常规句子时效果很好。但是,当我尝试测试 'abbcccddddeeeee' 时,我会得到类似 'G H H I I I J J J J K K K K K K' 的结果。如何更改我的代码,以便循环中每个字母的“key”或“vari”都发生变化,但保持不变,以便没有一个字母对应多个其他字母?

import random
intext = raw_input("Enter a message to encrypt: ")
intext = intext.upper()
key = random.randint(0,27)
vari = random.randint(0,27)
def randomsub(intext):
    outtext = []
    intext = intext.upper()
    for c in intext:
        num = ord(c)
        if num >= ord('A') and num <= ord('Z'):
            num = num - ord('A')
            num = num + (key + vari) % 26
            num += ord('A')
            outtext.append(chr(num))
    return ' '.join(outtext)
print randomsub(intext)

【问题讨论】:

  • 你得到的结果有什么问题?
  • 您是否考虑过解密应该如何工作,无论是您的代码现在的方式还是您希望代码的方式?
  • 嗯,喜欢enigma machine?
  • @StefanPochmann 如果它像一个适当的 rsc 一样工作,结果将类似于 GOOZZZIIIIAAAAA;字母不应该是直接顺序
  • @DoNotPutMeInABox:那根本不是加密。加密必须是可解密的。如果它不可解密,你还不如完全忽略输入,只生成一堆随机字节作为输出。

标签: python encryption random substitution


【解决方案1】:

不知道为什么你同时拥有keyvari,但随机性应该在你的函数内部,并且至少对randint 的调用之一应该在循环内部。我建议将key 设为用户提供的输入,并使用它来播种random。这样,使用相同的文本和相同的键,您将获得相同的输出,但文本中的重复字母会在结果中有所不同。最后但并非最不重要的一点是,如果您希望输出为字母,则需要扩展添加keyvari 的括号以包含num,即num = (num + vari) % 26,如果您切换到使用key 作为我建议。

【讨论】:

  • 当我实施你的建议时,我得到了一个像“R T V J R D M W I S W W R F P”这样的答案,这是随机的,但我需要的是一个解决方案,如果我用 G 代替 A,A 的所有实例都需要是 G . 另外,“种子随机”是什么意思?
  • @DoNotPutMeInABox “随机种子”是什么意思? Documentation is your friend。运行程序时重复使用种子值的结果是结果会有所不同,但完全可以重现。出于加密目的,这比将所有“A”映射到输出端的字母要好得多。一个好的密码学家会很快掌握英语的字母频率,但是将字母“E”映射到“X”、“A”、“W”……这取决于你在消息中的位置更具挑战性。