2017-03-01 129 views
0

我正在编写随机替换密码,并且在用于编写常规语句时效果很好。然而,当我尝试测试'abbcccddddeeeee'时,我会得到像'G H H I I I J J J K K K K'这样的东西。我如何更改我的代码,以便为周期中的每个字母更改“键”或“vari”,但仍保持不变,以使没有任何字母对应多个其他字母?随机替代密码(Python)

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) 
+1

你得到的结果有什么问题? –

+0

你有没有想过如何解密应该工作,无论是你的代码是现在的方式或你希望你的代码的方式? – user2357112

+0

mmm,就像[enigma机器](https://en.wikipedia.org/wiki/Enigma_machine)? – Copperfield

回答

0

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

+0

当我实施你的建议时,我得到了一个像“RTVJRDMWISWWRFP”这样的随机答案,但我需要的是一个解决方案,如果我用A代替G,A的所有实例都必须是G.此外,你是什么意思由“种子随机”? – DoNotPutMeInABox

+0

@DoNotPutMeInABox我的意思是“种子随机?” [文档是你的朋友](https://docs.python.org/2/library/random.html#random.seed)。运行程序时重新使用种子值的结果是结果会有所不同,但是完全可重现。出于加密的目的,这比在输出端具有所有'A的映射到字母的方式要好。一个好的密码学家会很快拿起英文的字母频率,但把字母'E'映射到'X','A','W',......这取决于你在消息中的位置会使它变得多更具挑战性。 – pjs