使用字母以外的字符停止ord() - caesar cypher

时间:2015-05-05 13:23:04

标签: python python-3.x caesar-cipher ord

我试图在python 3.2中创建一个非常简单的caesar密码,并获得了大部分代码。

aEnd = ""
        aOffset = int(input("What would you like the offset of your message to be?:\n"))
        aMessage = input("What message would you like to encrypt?:\n")
        for i in range(len(aMessage)):
            eAscii=ord(aMessage[i])
            aEnd = aEnd + chr(eAscii + aOffset)     
print(aEnd)    

然而,当它越过z时,它不会直接回到a,而是继续到符号等所以" xyz"偏移量为3,而不是" abc"它变成" {|}"。如何更改此选项以便仅使用字母表?

1 个答案:

答案 0 :(得分:1)

首先,调整ord()的返回值,使其代表字母表中的偏移量。我在这里将所有内容转换为小写以简化代码;如果你想保留它,可以为大写和小写创建单独的大小写。

index = ord(aMessage[i].lower())) - ord('a')

这会将一个从零开始的索引返回到字母表中。例如,字母a返回0b返回1等。

然后使用此值+您的偏移量作为字母数组的索引:

import string
letters = string.ascii_lowercase + string.ascii_lowercase
replacement = letters[index + offset]

通过创建包含字母表的数组letters - 两次 - 我们可以简单地添加任意偏移量,甚至可以添加到字母表末尾的字母,并获得正确的替换值。

这显然只适用于ASCII字符集,并且不保留大小写,但它应该足以让你开始。