用列表进行Python解密
我遇到了一个解密问题。我有一个非常基本的密码,它只是字母表,偏移1个字母,如下所示:用列表进行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
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很好。谢谢您的帮助。