我想要解密加密文件。在转换它并将其与字典(充满单词)进行比较时,我在底部遇到了麻烦。有人能引导我朝正确的方向发展吗?我正在努力比较这两者。
#this function takes a string and encrypts ONLY letters by k shifts
def CaeserCipher(string, k):
#setting up variables to move through
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'*10000
lower = 'abcdefghijklmnopqrstuvwxyz'*10000
newCipher = ''
#looping each letter and moving it k times
for letter in string:
if letter in upper:
if upper.index(letter) + k > 25:
indexPosition = (upper.index(letter) + k)
newCipher = newCipher + upper[indexPosition]
else:
indexPosition = upper.index(letter) + k
newCipher = newCipher + upper[indexPosition]
elif letter in lower:
if lower.index(letter) + k > 25:
indexPosition = (lower.index(letter) + k)
newCipher = newCipher + lower[indexPosition]
else:
indexPosition = lower.index(letter) + k
newCipher = newCipher + lower[indexPosition]
else:
newCipher = newCipher + letter
return newCipher
f = open('dictionary.txt', "r")
dictionary = set()
for line in f:
word = line.strip()
dictionary.add(word)
print dictionary
#main file
#reading file and encrypting text
f = open('encryptMystery1.txt')
string = ''
out = open("plain1.txt", "w")
myList = []
for line in f:
myList.append(line)
for sentence in myList:
for k in range(26):
updatedSentence = CaeserCipher(sentence, k)
for word in updatedSentence.split():
if word in dictionary:
out.write(updatedSentence)
break
print myList
f.close()
out.close()
答案 0 :(得分:2)
让我们逐步解决这个问题,第一步的标题是
对不起,我不是故意过于戏剧化,但你意识到这会占用更多的空间,而且 Space 不是吗?而且完全没必要。避免理解%
(模数)运算符是一个丑陋而缓慢的黑客攻击。别这么做。
第二步当然必须要理解模数。它实际上并不难,它就像分裂问题的其余部分一样。你还记得你在学校和学习部门的时候吗? 7/4
1r3
而不是1.75
,还记得吗?好的Python有所有功能。 7/4 == 1.75
,7//4 == 1
和7 % 4 == 3
。这很有用,因为它可以用于包装"一个固定长度的数字。
比方说,你有一些带有26个索引的字符串(比如,我不知道,字母表?)。您尝试在起始索引中添加一些数字,然后返回结果,但是您已经“重新添加2到Y
并且它已经工作了!”好吧,模数可以。 Y
在索引24中(记住零是它自己的索引),24 + 2是26并且没有第26个索引。但是,如果您知道字符串中只有26个元素,我们可以使用模数并使用THAT。
按照这种逻辑,index + CONSTANT % len(alphabet)
总是会使用简单的数学运算返回正确的数字,而不是甜蜜的宝贝耶稣你刚刚被屠杀的四分之一元素长的字符串。
所以你有一个好主意,依次浏览每一行并应用各种密码。如果我是你,我将它们全部转储到单独的文件中,甚至转储到单独的列表元素中。请记住,如果您要撤消密码,则需要使用-k
而不是k
。简单地改变你的凯撒密码以检测这一点可能是一个好主意,因为模数技巧在这种情况下不起作用。尝试类似:
def cipher(text, k):
cipherkey = "SOMESTRINGGOESHERE"
if k < 0:
k = len(cipherkey) + k
# len(cipherkey) - abs(k) would be more clear, but if it HAS to be
# a negative number to get in here, it seems silly to add the call
# to abs
然后你可以这样做:
startingtext = "Encrypted_text_goes_here"
possibledecrypts = [cipher(startingtext, -i) for i in range(1,26)]