0

我遇到了一个解密问题。我有一个非常基本的密码,它只是字母表,偏移 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)
4

5 回答 5

5

str.translate最适合凯撒密码类型加密,这似乎是您想要做的

首先需要通过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))
于 2013-01-22T08:18:15.547 回答
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

我不会在这里发布解密结果,因为我没有“家长咨询”贴纸自动取款机。;-) 就试一试吧!

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

于 2013-01-22T08:10:03.013 回答
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!

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

于 2013-01-22T08:09:02.610 回答
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在这一点上开始看起来不错。请参阅@Abhijit 的回答

于 2013-01-22T08:23:23.473 回答
0

Python 已经为这些简单的密码内置了函数,所以不需要使用字典:

字符串翻译

字符串.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)
于 2013-01-22T08:27:55.257 回答