换位密码返回错误的结果

时间:2018-03-14 18:30:40

标签: encryption vim python-2.6

这是我从https://inventwithpython.com/hacking

获得的源代码
import math, pyperclip

def main():
    myMessage = 'Cenoonommstmme oo snnio. s s c'
    myKey = 8

    plaintext = decryptMessage(myKey, myMessage)
    print(plaintext + '|')
    pyperclip.copy(plaintext)

def decryptMessage(key, message):
    numOfColumns = math.ceil(len(message) / key)
    numOfRows = key
    numOfShadedBoxes = (numOfColumns * numOfRows) - len(message)

    plaintext = [''] * int(numOfColumns)

    col = 0
    row = 0

    for symbol in message:
        plaintext[col] += symbol
        col += 1 


        if (col == numOfColumns) or (col == numOfColumns - 1 and row >= numOfRows - numOfShadedBoxes):
            col = 0
            row += 1

    return ''.join(plaintext)

if __name__ == '__main__':
    main()

这应该归还的是 Common sence is not so common.|

我回来的是什么 Coosmosi seomteonos nnmm n. c|

我无法弄清楚代码无法发回短语

的位置

1 个答案:

答案 0 :(得分:0)

代码没问题。问题是你使用的是错误版本的Python。正如该网站的“安装”章节所说:

  

重要提示!一定要安装Python 3,而不是Python 2   本书中的程序使用Python 3,如果你尝试,你会得到错误   用Python 2运行它。这非常重要,我正在添加一个卡通片   企鹅告诉你安装Python 3,这样你就不会错过这个   消息:

您正在使用Python 2来运行该程序。

结果不正确,因为程序依赖于Python 2中的行为与Python 3不同的特性。具体来说,在Python 3中划分两个整数会产生浮点结果,但在Python 2中它会生成一个向下舍入的整数结果。所以这个表达式:

  

(len(消息)/密钥)

在Python 3中产生3.75但在Python 2中产生3,因此表达式为:

  

math.ceil(len(message)/ key)

在Python 3中生成4(3.75向上舍入为4),但在Python 2中生成3(3向上舍入为3)。这意味着您的numOfColumns不正确,因此解密过程会产生不正确的结果。

您可以通过将(len(message) / key)更改为(float(len(message)) / key)来强制解决此问题,以强制Python 2将该计算视为可提供所需3.75结果的浮点除法。但真正的解决方案是切换到使用Python 3,因为Python 3和Python 2之间的行为差​​异只会在本书的其余部分继续造成麻烦。