目前,我的代码看起来像这样(感谢我在另一篇文章中的帮助)
phrase = raw_input("Enter text to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ("Encrypted text is: ")
for character in phrase:
#Loops through phrase and shows ascii numbers, example: hello is: 104,101,108,108,111
x = ord(character)
#adds a shift to each character so if shift is 1 'hello' becomes: ifmmp 105,102,109,109,112
result += chr(x + shift)
print "\n",result,"\n"
问题是,如果我输入多个单词,例如:hello world,移位为1
输出为:ifmmp!xpsme
感叹号显示空格(因班次而异)。我正在考虑使用if语句来检测空格:
phrase = raw_input("Enter text to Cipher: ")
shift = int(raw_input("Please enter shift: "))
result = ("Encrypted text is: ")
for character in phrase:
#Loops through phrase and shows ascii numbers, example: hello is: 104,101,108,108,111
x = ord(character)
if x == ord(' '):
print "\nfound a space space"
#adds 1 to each character so 'hello' becomes: ifmmp 105,102,109,109,112
result += chr(x + shift)
print "\n",result,"\n"
但我不知道如何将空间添加到结果变量中。另外,我在这个帖子中看到:Caesar's Cipher using python, could use a little help
JeffB使用while循环来处理ASCII表32是空格而127是DEL。他为什么用96?我不明白。
while x < 32:
x += 96
while x > 127:
x -= 96
抱歉这个问题很长。提前谢谢了!你的帮助对我来说非常宝贵。
答案 0 :(得分:3)
你可以跳过这个空间:
for character in phrase:
x = ord(character)
if character == ' ':
result += ' '
else:
result += chr(x + shift)
您的班次不会将输出限制为仅ASCII。如果你想确保这一点,你应该使用模运算符:
chr(32 + (x + shift) % (127 - 32))
答案 1 :(得分:1)
您可以添加如下空格:
if character.isspace():
result += ' '
或将字符串拆分为空格:
示例:强>
>>> "hello world".split()
['hello', 'world']
<强>码强>
new_strs = []
result = ("Encrypted text is:")
for word in phrase.split():
new_word = []
for character in word:
x = ord(character) + shift
new_word.append(chr(x if 97 <= x <= 122 else 96 + x % 122))
new_strs.append("".join(new_word))
print result, " ".join(new_strs)
为什么x if 97 <= x <= 122 else 96 + x % 122
?
对于shift = 1 'z'
的{{1}},将为123,即x + shift
。因此,要获得'{'
而不是'a'
,请取模数新条例值为122('{'
)并添加96(ord('z')
)。
<强>输出:强>
ord('a') -1
答案 2 :(得分:0)
只需使用maketrans并翻译基本上为您加密或解密邮件的功能。他们可以为问题提供一个非常简短有效的解决方案
message = input('enter message').lower()
offset = int(input('enter offset (enter a negative number to decrypt)'))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
enc_alphabet = (alphabet[alphabet.index(alphabet[offset]):len(alphabet)])+ alphabet[0:offset]
data = str.maketrans(alphabet,enc_alphabet)
final_message = str.translate(message, data)
print(final_message)
然后你不必担心添加空格或任何东西,这是一个完全有效的凯撒密码加密程序
答案 3 :(得分:0)
空间不是Cesar Cipher(a.k.a. Shift Cipher)需要处理的唯一问题。历史上,字符设置为全部大写(或更低),并且所有空格和所有标点都被删除。
This site显示了Cesar密码实现的一个很好的示例,它处理所有标点符号删除以及密钥生成(可选)。链接的实现选择使用由正则表达式实现的允许字符的白名单。
# Message is a the string to be encrypted / decrypted
sub(r'[^A-Z]', '', message.upper())