Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用列表进行Python解密_Python_List_Encryption - Fatal编程技术网

用列表进行Python解密

用列表进行Python解密,python,list,encryption,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 = [] decryp

我遇到了一个解密问题。我有一个非常基本的密码,它只是字母表,偏移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
我要解密的是一个文本文件,看起来像这样

#!/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
我用计数器-1得到FMMP的正确计数,(5,12,12,15),然后得到39,25,40等等。任何帮助都将不胜感激,如果您需要更多信息,请告诉我

我也欢迎关于更好/更简单的方法的想法,但我也希望有一个类似的解决方案,这样我就可以了解这里发生了什么。谢谢

好的,谢谢所有的答案和信息。我正在发布我最终所做的事情,它很有效。我确信它并不像它应该的那么像python,但是我实现了人们提到的一些事情。谢谢你的信息

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)

改用字典和转换器函数:

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!

与这里提供的其他方法相比,它的优点是:如果你想改变它的转换方式,例如将字符转换成数字,它的工作原理是一样的。

你绝对应该使用字典。与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
我不会在这里发布解密的结果,因为我没有“家长建议”-贴纸atm;-)试试看

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

最适合于类型加密,这似乎是您正在尝试的

您首先需要通过创建一个翻译表

大写字母字符可以从

要旋转字母字符,只需执行
ascii\u大写[1:][ascii\u大写[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个字母

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

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])
encstr='FMMP NZ OBNF JT KPTIVB KPIO TVDLT BTT GVOEBNFOUBMT PG DPNQVUJOH'

decstr=''.join([(chr(ord(ech)-1)如果“A”Python为这些简单密码内置了函数,那么不需要使用字典:

例如:

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

看一看Python的字典(而不是你的两个平行列表)。这个主意很有趣,谢谢。我以前用过字典,一开始我没有用字典,因为我认为不能排序会很重要,但我想实际上不会。是的,对不起,我删除了你说“不”的帖子因为我意识到了我的错误,所以在我发布它后立即发送。感谢可能是家庭作业,也许不是,但是如果你想在实际项目中使用它,不要!使用PyCrypto!无论如何,如果你使用“with”,你不需要“file.close”声明。谢谢,习惯放文件。关闭。谢谢你让我知道上面有什么不好的东西,哈哈,我在发布之前甚至没有亲自检查。这是我的不好。我改变了它。作为python的初学者,这一步需要学习很多:)map对我来说是新概念,lambda也是。谢谢你,现在我有很多东西要通读。这就是我的意图。Python有许多来自不同范例的优秀编程模式。这两个概念都是函数式的,我很喜欢。
dic.get(x,x)
相当于
x if cipher.get(x)不是其他密码[x]
。这是如何处理空格的?我知道它是这样的,而且它工作得很好,但我很难看到它在这里是如何处理空格的。您的代码似乎未经检查。它将“空格”与任何字符一样处理,因此会将其弄乱。您还有一个输入错误:
对于enc中的ech]
。我会解决这个问题。感谢您的更正。我在本地测试了几个版本,但粘贴了错误的行,这也解决了我正在编辑的空间问题。再次感谢。@ThorstenKranz很好。谢谢您的帮助。