Python 中的凯撒密码求解器
Caesar Cipher solver in Python
我在python中做了一个凯撒密码求解器,但是没有错误,只是没有打印任何东西。我也做过类似的事情,但是以前没有过。
with open("C:\Users\Rajive\AppData\Local\Programs\Python\Python3.4.3\brit-a-z.txt", 'r') as f:
check_list = [x.strip() for x in f.readlines()]
def crackcaesar(encrypted):
for i in range(26):
totalwords = 0
numright = 0
answer = []
if i != 0:
for symbol in encrypted:
if symbol.isalpha():
neword = (ord(symbol) + i)
if symbol.isupper():
if neword > ord('Z'):
neword -= 26
elif neword < ord('A'):
neword += 26
elif symbol.islower():
if neword > ord('z'):
neword -= 26
elif neword < ord('a'):
neword += 26
newletter = chr(neword)
answer.append(newletter)
for word in str(answer):
totalwords += 1
for line in check_list:
if line == word:
numright += 1
if (numright // 2) > (totalwords // 2):
print(str(answer))
print("Type your encoded caesar cipher message")
while True:
crackcaesar(input())
问题是 numright
永远不会大于 totalwords
。尝试
if numright == totalwords:
print(str(answer))
此外,answer
是一个字符列表。 str(answer)
会给你 "['a', 'b', 'c']"
。您需要使用 "".join(answer)
.
首先,你有一个 3 级嵌套循环,并没有真正实现密码。其次,您没有密码密钥(请参阅下面的编辑)。这个for循环:
for word in str(answer):
totalwords += 1
for line in check_list:
if line == word:
numright =+ 1
不应嵌套在这个已经嵌套的 for 循环中:
for i in range(26):
totalwords = 0
numright = 0
answer = []
if i != 0:
for symbol in encrypted:
此外,i
从 0-25
开始的循环中的 if i != 0:
似乎没有意义。您似乎在尝试匹配字母表范围,但是如果您将范围限制在 0-26 之间,那么实施 Caeser Cipher 就不会很幸运,因为第一个可打印字符从 32(space)开始,小写的 'z'
是 122。你应该一起删除那个循环 - 它会破坏密码。只需使用 for symbol in encrypted:
循环。
此外,循环 for word in str(answer):
正在逐个字符计算 answer
个字符 ,因此名为 totalwords
的变量实际上是在计算字符数,这您可以简单地通过获取字符串的长度来完成。如果你想做单词,你应该在 answer
变量上调用 str.split(' ')
,假设 space
字符是分隔符。希望这可以帮助。
编辑
你的钥匙在哪里? (确切地)。 你的密码的主要问题是当你需要添加(或减去)密钥数量时,你正在为每个序数值添加一个计数器变量。因为你没有实现密钥转换,您只需要添加一个值,否则您可以使用一组键来实现 caeser 密码。
我在python中做了一个凯撒密码求解器,但是没有错误,只是没有打印任何东西。我也做过类似的事情,但是以前没有过。
with open("C:\Users\Rajive\AppData\Local\Programs\Python\Python3.4.3\brit-a-z.txt", 'r') as f:
check_list = [x.strip() for x in f.readlines()]
def crackcaesar(encrypted):
for i in range(26):
totalwords = 0
numright = 0
answer = []
if i != 0:
for symbol in encrypted:
if symbol.isalpha():
neword = (ord(symbol) + i)
if symbol.isupper():
if neword > ord('Z'):
neword -= 26
elif neword < ord('A'):
neword += 26
elif symbol.islower():
if neword > ord('z'):
neword -= 26
elif neword < ord('a'):
neword += 26
newletter = chr(neword)
answer.append(newletter)
for word in str(answer):
totalwords += 1
for line in check_list:
if line == word:
numright += 1
if (numright // 2) > (totalwords // 2):
print(str(answer))
print("Type your encoded caesar cipher message")
while True:
crackcaesar(input())
问题是 numright
永远不会大于 totalwords
。尝试
if numright == totalwords:
print(str(answer))
此外,answer
是一个字符列表。 str(answer)
会给你 "['a', 'b', 'c']"
。您需要使用 "".join(answer)
.
首先,你有一个 3 级嵌套循环,并没有真正实现密码。其次,您没有密码密钥(请参阅下面的编辑)。这个for循环:
for word in str(answer):
totalwords += 1
for line in check_list:
if line == word:
numright =+ 1
不应嵌套在这个已经嵌套的 for 循环中:
for i in range(26):
totalwords = 0
numright = 0
answer = []
if i != 0:
for symbol in encrypted:
此外,i
从 0-25
开始的循环中的 if i != 0:
似乎没有意义。您似乎在尝试匹配字母表范围,但是如果您将范围限制在 0-26 之间,那么实施 Caeser Cipher 就不会很幸运,因为第一个可打印字符从 32(space)开始,小写的 'z'
是 122。你应该一起删除那个循环 - 它会破坏密码。只需使用 for symbol in encrypted:
循环。
此外,循环 for word in str(answer):
正在逐个字符计算 answer
个字符 ,因此名为 totalwords
的变量实际上是在计算字符数,这您可以简单地通过获取字符串的长度来完成。如果你想做单词,你应该在 answer
变量上调用 str.split(' ')
,假设 space
字符是分隔符。希望这可以帮助。
编辑
你的钥匙在哪里? (确切地)。 你的密码的主要问题是当你需要添加(或减去)密钥数量时,你正在为每个序数值添加一个计数器变量。因为你没有实现密钥转换,您只需要添加一个值,否则您可以使用一组键来实现 caeser 密码。