使用Python实现凯撒密码,需要一点帮助
我正在用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)