Python解密与列表

时间:2013-01-22 07:57:19

标签: python list encryption

我遇到了解密问题。我有一个非常基本的密码,只有字母表,并且偏移了1个字母,如下所示:

A    B
B    C
C    D
D    E
to z  to A

右栏是我给的字母,我需要把它们翻到左边的字母。

我正在从文件中读取此内容,并将每列保存到这样的列表中

#!/usr/bin/python

key = "key.txt"
encrypted = "encrypted.txt"
decrypted = "decrypted.txt"

encryptedList = []
decryptedList = []

with open(key, "r") as file:
    for line in file:
        currentLine = line.split()

        currentDecrypted = currentLine[0]
        currentEncrypted = currentLine[1]

        decryptedList.append(currentEncrypted)
        encryptedList.append(currentDecrypted)

file.close()

counter = 0
with open(encrypted, "r") as file:
for line in file:
    currentLine = line
    for letter in currentLine:
        currentLetter = letter
        for item in encryptedList:
            if(item == currentLetter):
            ####here's where the problem starts####
            ####I've tried just printing counter, and I get mostly go    
                printencryptedList[counter-1]
                counter = 0
                break
            counter += 1

我正在尝试解密的是一个看起来像这样的文本文件

FMMP
NZ OBNF JT KSMBB
KPIO TVDLT BQQ
GWWWWWWBMT PG DJJJJJH

我得到FMMP的正确计数,(5,12,12,15),计数器-1,但后来得到39,25,40等等。任何帮助将不胜感激,如果您需要更多信息,请告诉我。

我也欢迎有关更好/更简单的方法的想法,但我也想要一个类似于此的解决方案,所以我可以弄清楚这里发生了什么。感谢

好的,谢谢你的所有答案和信息。我发布了我最终做的事情并且有效。我确信它不像它应该的那样pythonic,但我实现了一些人们提到的东西。感谢您的信息。

import string

key = "key.txt"
encrypted = ""encrypted.txt"
decrypted = "decrypted.txt


encryptedString = ""
decryptedString = ""

keyDict = {}

with open(key, "r") as file:
    for line in file:
    currentLine = line.split()

    currentDecrypted = currentLine[0]
    currentEncrypted = currentLine[1]

    keyDict[currentDecrypted] = currentEncrypted


with open(encrypted, "r") as file:
    for line in file:
    currentLine = line
        for letter in currentLine:
        currentLetter = letter
        encryptedString += letter
            for key in keyDict:
            if(keyDict[key] == letter):
                decryptedString += key
                break
            elif(letter == " "):
                decryptedString += " "
                break
            elif(letter == "\n"):
                decryptedString += "\n"
                break




with open(decrypted, "a") as file:
    file.write(decryptedString)

5 个答案:

答案 0 :(得分:5)

str.translate最适合Caesar cipher类型加密,这似乎是您要做的事情

您首先需要通过string.maketrans

创建翻译表

大写字母字符可以从string.ascii_uppercase

获取

要旋转Alpha字符,您只需执行ascii_uppercase[1:] + ascii_uppercase[0]

即可

现在这是一个从这里开始的小路上

>>> secret = """FMMP
NZ OBNF JT KPTIVB
KPIO TVDLT BTT
GVOEBNFOUBMT PG DPNQVUJOH"""
>>> from string import ascii_uppercase as UPPER, maketrans
>>> print secret.translate(maketrans(UPPER[1:] + UPPER[0], UPPER))

答案 1 :(得分:3)

你绝对应该使用字典。与Pythons map()一起,你的任务非常简单:

import string

secret = """FMMP
NZ OBNF JT KPTIVB
KPIO TVDLT BTT
GVOEBNFOUBMT PG DPNQVUJOH"""

characters = list(string.uppercase)
cipher = dict(zip(characters[1:]+[characters[0]], characters))

decrypted = "".join(map(lambda x: cipher.get(x,x), secret))

print decrypted

我不会在这里发布解密结果,因为我没有“父母咨询”-sticker atm。 ;-)试试吧!

当然string - 模块中有辅助函数,但OP想要学习python,而不是实现“防弹”加密系统。

答案 2 :(得分:0)

改为使用字典和转换器功能:

my_crypt = {
    "a":"b",
    "b":"c",
    "c":"d"
    ...
}

def crypt_str(in_str, crypt_dict):
    out_str = ""
    for char in in_str:
        if char in crypt_dict:
            out_str += crypt_dict[char]
        else:
            out_str += char
    return out_str

>>> print(crypt_str("hello!", my_crypt))
ifmmp!

与此处提供的其他方法相比的优势:如果您想要更改其转换方式,例如将字符转换为数字 - 它的工作原理完全相同。

答案 3 :(得分:0)

  

我有一个非常基本的密码,只有字母表,并且偏移了1个字母。

这是真的吗?您显示的代码支持任意替换。如果不需要,那么:

encstr = 'FMMP NZ OBNF JT KPTIVB KPIO TVDLT BTT GVOEBNFOUBMT PG DPNQVUJOH'
decstr = ''.join([(chr(ord(ech)-1) if 'A' <= ech <= 'Z' else ech) for ech in encstr])

修改

原始示例期望明文'Z'换行到'A'而不是碰到'['(用ASCII表示)。要妥善处理这个:

''.join([(chr(ord('A')+(ord(ech)-ord('A')-1)%26 ) if 'A' <= ech <= 'Z' else ech) for ech in encstr])

所以这有点难看。 translate在这一点上开始变得很好。 See @Abhijit's answer

答案 4 :(得分:0)

Python为这些简单的密码构建了函数,因此不需要使用字典:

string.translate

string.maketrans

示例:

>>> s='''FMMP
NZ OBNF JT KSMBB
KPIO TVDLT BQQ
GWWWWWWBMT PG DJJJJJH'''
>>> import string
>>> tr = string.maketrans(string.uppercase[1:]+'A', string.uppercase)
>>> print string.translate(s,tr)