使用Caesar Cipher解码加密文件

时间:2014-04-18 20:06:57

标签: python

我想要解密加密文件。在转换它并将其与字典(充满单词)进行比较时,我在底部遇到了麻烦。有人能引导我朝正确的方向发展吗?我正在努力比较这两者。

#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()        

1 个答案:

答案 0 :(得分:2)

让我们逐步解决这个问题,第一步的标题是

为什么在CAESAR CIPHER中有260,000个字符长的字符串

对不起,我不是故意过于戏剧化,但你意识到这会占用更多的空间,而且 Space 不是吗?而且完全没必要。避免理解%(模数)运算符是一个丑陋而缓慢的黑客攻击。别这么做。

现在,以模数:

第二步当然必须要理解模数。它实际上并不难,它就像分裂问题的其余部分一样。你还记得你在学校和学习部门的时候吗? 7/4 1r3而不是1.75,还记得吗?好的Python有所有功能。 7/4 == 1.757//4 == 17 % 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)]