我遇到了解密问题。我有一个非常基本的密码,只有字母表,并且偏移了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)
答案 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为这些简单的密码构建了函数,因此不需要使用字典:
示例:
>>> 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)