Training: Crypto - Substitution II (Crypto, Training)
题目描述
I have created an advanced version of the simple substitution cipher.
It can now use chars in range from 0-255, but that should not stop you.
The ciphertext is in the language of this text, and uses correct punctuation and case-sensitivity.
我创建了简单替换密码的进阶版本
它现在可以使用 0-255 范围内的字符,但这应该拦不住你。
密文使用此文本的语言,并使用正确的标点符号和区分大小写。
密文
70 4C 0E AD B3 EB 42 A3 35 EB 42 15 4C 0E 26 50
A9 E5 D8 15 26 A9 4C 0E 6A A9 6E EB 26 A9 D8 EB
B3 BE 6A B3 72 A9 EA A3 42 A9 7C 4C A3 A9 AD 4C
42 A9 15 42 50 A9 DB 6A B3 7C A9 6E 6A 35 35 A9
BE 4C 0E 6A A9 B7 6A 35 35 4C 6E A9 D8 EB 0D A0
6A B3 50 A9 E5 D8 6A A9 58 B3 4C EA 35 6A 91 A9
6E 15 42 D8 A9 42 D8 15 26 A9 0D 15 58 D8 6A B3
A9 15 26 A9 42 D8 EB 42 A9 42 D8 6A A9 A0 6A 7C
A9 15 26 A9 58 B3 6A 42 42 7C A9 35 4C 0E AD 50
A9 95 A9 6E 15 35 35 A9 0D 4C 91 6A A9 A3 58 A9
6E 15 42 D8 A9 EB A9 EA 6A 42 42 6A B3 A9 6A 0E
0D B3 7C 58 42 15 4C 0E A9 26 D8 6A 91 6A A9 EB
0E 7C A9 26 4C 4C 0E 50 A9 9A 4C A3 B3 A9 26 4C
35 A3 42 15 4C 0E A9 15 26 69 A9 26 58 4C BE BE
35 B7 6A EA 91 BE 26 50
解
Training: Crypto - Substitution I (Crypto, Training)的进阶版本,这道题和Training: Crypto - Digraphs (Crypto, Training)思路一样,要么穷举出255(0xFF)字母表所有的结果,一共(255!)种可能,要么采用词频分析的方法。这么大的字母表想穷举完比较费时,故这里采用词频分析的方法。
解密方法基本同Training: Crypto - Digraphs (Crypto, Training)一样,首先对16进制的密文进行处理,将其用可见符号来代替,再使用quipiup来辅助分析。
直接上代码
r = """
70 4C 0E AD B3 EB 42 A3 35 EB 42 15 4C 0E 26 50
A9 E5 D8 15 26 A9 4C 0E 6A A9 6E EB 26 A9 D8 EB
B3 BE 6A B3 72 A9 EA A3 42 A9 7C 4C A3 A9 AD 4C
42 A9 15 42 50 A9 DB 6A B3 7C A9 6E 6A 35 35 A9
BE 4C 0E 6A A9 B7 6A 35 35 4C 6E A9 D8 EB 0D A0
6A B3 50 A9 E5 D8 6A A9 58 B3 4C EA 35 6A 91 A9
6E 15 42 D8 A9 42 D8 15 26 A9 0D 15 58 D8 6A B3
A9 15 26 A9 42 D8 EB 42 A9 42 D8 6A A9 A0 6A 7C
A9 15 26 A9 58 B3 6A 42 42 7C A9 35 4C 0E AD 50
A9 95 A9 6E 15 35 35 A9 0D 4C 91 6A A9 A3 58 A9
6E 15 42 D8 A9 EB A9 EA 6A 42 42 6A B3 A9 6A 0E
0D B3 7C 58 42 15 4C 0E A9 26 D8 6A 91 6A A9 EB
0E 7C A9 26 4C 4C 0E 50 A9 9A 4C A3 B3 A9 26 4C
35 A3 42 15 4C 0E A9 15 26 69 A9 26 58 4C BE BE
35 B7 6A EA 91 BE 26 50 """
#进制转换(记得我以前还写了一个函数来着)
s = [i for i in r.split()]
for i in range(len(s)):
s[i] = int(s[i],16)
#密文替换为单字符格式
text = ''
texttable = []
i = 0
for j in s:
if j in texttable:
text += chr(97 + texttable.index(j))
else:
text += chr(97 + i)
i += 1
texttable.append(j)
print(text)
#abcdefghifgjbcklmnojkmbcpmqfkmoferpesmthgmubhmdbgmjglmvpeumqpiimrbcpmwpiibqmofxypelmnopmzebtip{mqjgomgojkmxjzopemjkmgofgmgopmypumjkmzepggumibcdlm|mqjiimxb{pmhzmqjgomfmtpggpempcxeuzgjbcmkop{pmfcumkbbclm}bhemkbihgjbcmjk~mkzbrriwpt{rkl
此时得到的密文中又有特殊符号,而且通过题目描述可以知道明文中的大小写和标点符号又被加密进去了。。。此时又可以通过猜测单词来解开密文(如果你和作者特别熟悉确实可能猜到他的思路)。英语短文中出现最多的字符是空格,将密文中出现最多的字符替换为空格,短文格式就一目了然了。
分析密文词频
#出现字符统计
for i in range(len(set(s))):
print(chr(97 + i) + ':',text.count(chr(97 + i)))
将m替换为空格得到
text = text.replace('m', ' ')
print(text)
#abcdefghifgjbckl nojk bcp qfk oferpes thg ubh dbg jgl vpeu qpii rbcp wpiibq ofxypel nop zebtip{ qjgo gojk xjzope jk gofg gop ypu jk zepggu ibcdl | qjii xb{p hz qjgo f tpggpe pcxeuzgjbc kop{p fcu kbbcl }bhe kbihgjbc jk~ kzbrriwpt{rkl
密文一下就明朗了起来,再用quipiup进行分析能够得到明显可读的信息。
至于特殊字符怎么处理,就只有通过观察可读内容来进行替换猜测,基本上是英文大小写问题和标点符号的问题了。我自己分析后,完整的代码
r = """
70 4C 0E AD B3 EB 42 A3 35 EB 42 15 4C 0E 26 50
A9 E5 D8 15 26 A9 4C 0E 6A A9 6E EB 26 A9 D8 EB
B3 BE 6A B3 72 A9 EA A3 42 A9 7C 4C A3 A9 AD 4C
42 A9 15 42 50 A9 DB 6A B3 7C A9 6E 6A 35 35 A9
BE 4C 0E 6A A9 B7 6A 35 35 4C 6E A9 D8 EB 0D A0
6A B3 50 A9 E5 D8 6A A9 58 B3 4C EA 35 6A 91 A9
6E 15 42 D8 A9 42 D8 15 26 A9 0D 15 58 D8 6A B3
A9 15 26 A9 42 D8 EB 42 A9 42 D8 6A A9 A0 6A 7C
A9 15 26 A9 58 B3 6A 42 42 7C A9 35 4C 0E AD 50
A9 95 A9 6E 15 35 35 A9 0D 4C 91 6A A9 A3 58 A9
6E 15 42 D8 A9 EB A9 EA 6A 42 42 6A B3 A9 6A 0E
0D B3 7C 58 42 15 4C 0E A9 26 D8 6A 91 6A A9 EB
0E 7C A9 26 4C 4C 0E 50 A9 9A 4C A3 B3 A9 26 4C
35 A3 42 15 4C 0E A9 15 26 69 A9 26 58 4C BE BE
35 B7 6A EA 91 BE 26 50 """
s = [i for i in r.split()]
for i in range(len(s)):
s[i] = int(s[i],16)
text = ''
texttable = []
i = 0
for j in s:
if j in texttable:
text += chr(97 + texttable.index(j))
else:
text += chr(97 + i)
i += 1
texttable.append(j)
#print(text)
#abcdefghifgjbcklmnojkmbcpmqfkmoferpesmthgmubhmdbgmjglmvpeumqpiimrbcpmwpiibqmofxypelmnopmzebtip{mqjgomgojkmxjzopemjkmgofgmgopmypumjkmzepggumibcdlm|mqjiimxb{pmhzmqjgomfmtpggpempcxeuzgjbcmkop{pmfcumkbbclm}bhemkbihgjbcmjk~mkzbrriwpt{rkl
'''
#出现字符统计
for i in range(len(set(s))):
print(chr(97 + i) + ':',text.count(chr(97 + i)))
'''
text = text.replace('m', ' ')
text = text.replace('l', '.')
text = text.replace('{', 'm')
text = text.replace('}', 'l')
text = text.replace('~', ':')
print(text)
#abcdefghifgjbck. nojk bcp qfk oferpes thg ubh dbg jg. vpeu qpii rbcp wpiibq ofxype. nop zebtipm qjgo gojk xjzope jk gofg gop ypu jk zepggu ibcd. | qjii xbmp hz qjgo f tpggpe pcxeuzgjbc kopmp fcu kbbc. lbhe kbihgjbc jk: kzbrriwptmrk.
在放到网页上去分析基本就可读了,已经可以通过分析结果还原明文了
'qongratulations. zhis one was harderx but you got it. very well done jellow hacker. zhe problem with this cipher is that the key is pretty long. | will come up with a better encryption sheme any soon. four solution is: spoddljebmds.'
'Congratulations. This one was harder, but you got it. very well done fellow hacker. The problem with this cipher is that the key is pretty long. I will come up with a better encryption sheme any soon. your solution is: spoddlfebmds.'
solution: spoddlfebmds