使用Python实现凯撒密码,需要一点帮助

2 投票
8 回答
14804 浏览
提问于 2025-04-15 14:55

我正在用Python制作一个“凯撒密码”,这是我目前的进展。有人能告诉我这样看起来怎么样吗?我是不是在正确的方向上?我还缺少什么?当我运行程序,比如输入(josh is cool),我发现加密后的结果没有在同一行显示。当我执行 main(3) 时,它的输出是这样的:

m
r
v
k
l
v
f
r
r
o

但是每个字母都在新的一行。有没有办法让它们显示在同一行呢?

def main(k):

    if k<0 or k>231:
        print "complaint"
        raise SystemExit

    Input = raw_input("Please enter Plaintext to Cipher")

    for x in range(len(Input)):
        letter=Input[x]
        if letter.islower():
            x=ord(letter)
            x=x+k
            if x>122:
                x=x-122+97
            print chr(x),
        if letter.isupper():
            x=ord(letter)
            x=x+k
            if x>90:
                x=x-90+65
            print chr(x),

8 个回答

1

这里有一种不同的方法,展示了我们如何以非常简单明了的方式来处理这个问题。我们先定义一个输入字母表和一个输出字母表,然后建立一个翻译表,最后使用 unicode.translate() 来进行实际的加密。

import string
# Blatantly steal Lennart's UI design
first = unicode(raw_input("Please enter Plaintext to Cipher: "), "UTF-8")
k = int(raw_input("Please enter the shift: "))

in_alphabet = unicode(string.ascii_lowercase)
out_alphabet = in_alphabet[k:] + in_alphabet[:k]

translation_table = dict((ord(ic), oc) for ic, oc in zip(in_alphabet, out_alphabet))

print first.translate(translation_table)

如果需要的话,这个方法也可以扩展到大写字母。

2

这段代码应该能很好地运行。它还可以处理任意的偏移量,包括负数。

phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))

result = ''
for char in phrase:
    x = ord(char)

    if char.isalpha():
        x = x + shift

        offset = 65
        if char.islower():
            offset = 97

        while x < offset:
            x += 26

        while x > offset+25:
            x -= 26

        result += chr(x)

print result

另一种方法是使用稍微不同的加密方式,简单来说就是对所有字符进行旋转,包括大写字母、小写字母,甚至是所有ASCII码大于0x20的字符。

phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))

result = ''
for char in phrase:
    x = ord(char)

    x = x + shift

    while x < 32:
        x += 96

    while x > 127:
        x -= 96

    result += chr(x)

print result
6

我喜欢kaizer.se的回答,但我觉得我可以用一个更简单的方法来解释,使用的是string.maketrans这个函数:

import string

first = raw_input("Please enter Plaintext to Cipher: ")
k = int(raw_input("Please enter the shift: "))

shifted_lowercase = ascii_lowercase[k:] + ascii_lowercase[:k]

translation_table = maketrans(ascii_lowercase, shifted_lowercase)

print first.translate(translation_table)

撰写回答