NISA CTF Crypto两道题解

发布于 2019-11-22  1624 次阅读


残缺的MD5

题面:

残缺的明文:NISA{mdfhg_odfhty_ojky6u0_ki70n}

密文:cfc6bcdf4cbeab03a66e8d2bbb84a8aa

下划线为残缺的数字或字母,请你找出完整的明文

这题已经给出了缺了三个字符的明文和md5密文,因为空格不多,我们直接上脚本爆破就可以了:


import hashlib
import itertools
word="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" #观察其他的区域推测空缺的部分都是字母或者数字
r=itertools.product(word,repeat=3) #生成爆破容器
answer="cfc6bcdf4cbeab03a66e8d2bbb84a8aa" #加密后的密文
for i in r:
dec = "NISA{mdfhg" + i[0] + "odfhty" + i[1] + "ojky6u0" + i[2] + "ki70n}" #开始枚举爆破
dec=dec.strip() #为了防止一些空格啥的给后面的比较带来不必要的麻烦,我们先预处理下,下面的strip同。
enc = hashlib.md5()
enc.update(dec)
code=enc.hexdigest() #md5加密
code=code.strip()
if(code==answer): #一旦枚举的密文匹配上了已知的密文,那么这就是flag了
print(dec)

我不懂加密,嗯,真不懂

题面:


import sys
key = 'ASDAEFECENSOREDSDFED'
flag = 'NISA{******************}'
if len(key) % 2 == 1:
print "Key Length Error"
sys.exit(1)
n = len(key) // 2
encrypted = ''
for c in flag:
c = ord(c)
for a, b in zip(key[0:n], key[n:2*n]):
c = (ord(a) * c + ord(b)) % 251
encrypted += '%02x' % c
print encrypted

加密后的密文是8e61bb192d196b6b86b3622c2b86c57d62d72c86e02c86b32cdf8473843f

咋一看好像是单密钥加密,绕了有点晕。

一开始打算是尝试逆向他的加密,后面放弃了

后面突然间发现,这个加密方式是每个字符都严格对应一个密文的(大喜

(这个特征其实有点明显,因为他是处理完一个字符就塞一个两位的16进制的字符进入密文里面)

那么我们就可以直接暴力打表了~~直接把已知的所有字符弄进去加密一遍就OK了!


import sys
key = 'ASDAEFECENSOREDSDFED'
words = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{}_~!@#$%^&*()+=<>?/:[]-,.`|0123456789'
encrypted= '8e61bb192d196b6b86b3622c2b86c57d62d72c86e02c86b32cdf8473843f'
if len(key) % 2 == 1:
print "Key Length Error"
sys.exit(1)


n = len(key) // 2
for c in words:
d = c
c = ord(c)
for a, b in zip(key[0:n], key[n:2*n]):
c = (ord(a) * c + ord(b)) % 251
str= '%02x' % c
print d +" --> "+ str

得到:

a --> 3e
b --> 47
c --> 50
d --> 59
e --> 62
f --> 6b
g --> 74
h --> 7d

··············中间太长了略························

` --> 35
| --> 36
0 --> 7b
1 --> 84
2 --> 8d
3 --> 96
4 --> 9f
5 --> a8
6 --> b1
7 --> ba
8 --> c3
9 --> cc

然后写一个py脚本或者手打,把密文一一解出来就OK了!


等风来,不如追风去。