凯撒密码:Python

Ceasar's Cipher: Python

我将首先发布目前为止的内容,然后告诉您发生了什么...

PasteBin

osalt = ".,!? ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def decode():
  int = 0
  counter = 0
  msg = requestString("What would you like Decoded?").upper()
  print "Now decoding, '"+msg+"'."
  print "==========Please Wait=========="
  while (int < len(osalt)):
    dmsg = ""
    nsalt = ""
    int += 1
    int2 = 0
    shift = int-1
    while int2 <= len(osalt):
      if int2+shift < len(osalt):
        nsalt += osalt[int2+shift]
      else:
        nsalt += osalt[int2+shift-len(osalt)-1]
      int2 += 1
    for letter in msg:
      index = nsalt.find(letter)
      dmsg += nsalt[index]
    print dmsg
    counter += 1
  print counter
decode()

这应该做的是编码消息在解码时可能的 31 种可能性的列表。你输入编码的消息然后它通过,一次移动 salt 1 个字符......所以第二个 salt 看起来像这样:“Z.,!? ABCDEFGHIJKLMNOPQRSTUVWXY”。

我遇到的问题是它根本没有移动盐,最终打印了 31 次输入。

我检查了我的代码很多次,但我不知道如何让它运行。

谢谢。

首先,在发布代码时确保它可以执行。当前您有一个未定义的函数 (requestString) 并且在 print counter.

行的缩进不一致

关于这个问题,你这里有两个错误。首先来看

index = nsalt.find(letter)
dmsg += nsalt[index]

您在 nsalt 中找到一个字母的位置,然后将完全相同的字母添加到 dmsg。这就是为什么你总是打印同样的东西。将其中之一更改为 osalt

其次,当你这样做时,你会得到一个 string index out of range 错误。这是因为您的 nsalt 字符串实际上比 osalt 长一个字符并且包含重复的字母。这是因为行

while int2 <= len(osalt):

你应该只使用 <int2从0开始,表示当前在nsalt中的位置,所以应该在len(osalt) - 1结束。