Q1
题目给出了程序1
2
3
4
5
6
7
8
9
10
11
12
13
14import hashlib
def change(key,str):
result = ""
for i in str:
if ord(i)>=97 and ord(i)<=122:
result+=chr(97+(ord(i)+key)%26)
else:
result+=i
return result
key = *
str1 = "********************************"
str2 = change(key,str1) # zab81501z9740b67dc0by8z15093a426
flag= hashlib.md5(str1).hexdigest()
print flag[10:16] # aebc0a
解释一下程序流程:1
2
3
4
51.这里的change函数的作用其实就是凯撒加密
2.将str1进行凯撒加密,移位量为key
3.然后得到str2=zab81501z9740b67dc0by8z15093a426
4.flag的值就是str1的md5
5.已知md5(flag)的[10:16]是aebc0a
破解思路相当清晰了1
2
3
41.将str2用凯撒移位遍历(26种可能)
2.将每种可能进行md5
3.判断每个md5的第[10:16]是否为aebc0a
4.若是则为flag,否则跳过
所以容易得到破解程序:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import hashlib
def change(key,str):
result = ""
for i in str:
if ord(i)>=97 and ord(i)<=122:
result+=chr(97+(ord(i)+key)%26)
else:
result+=i
return result
str = "zab81501z9740b67dc0by8z15093a426"
for i in range(0,26):
tmp = change(i,str)
res = hashlib.md5(tmp).hexdigest()
if res[10:16] == "aebc0a":
print res
Q2
题目:1
2
3
4
5
6
7....
char getCode(char orgin) {
return ( key1 * (orgin-97) + key2 ) % 26 + 97;
}
....
code : afprnjgrgmhzsvaotostsvotkozatksoatoztzs
很明显的看出是个位置key1和key2的仿射加密
直接暴力破解就好1
2
3
4
5
6
7
8
9encode = "afprnjgrgmhzsvaotostsvotkozatksoatoztzs"
flag = ""
for key1 in range(1,26):
for key2 in range(0,30):
for i in range(0,len(encode)):
flag+=chr(key1*((ord(encode[i])-97)-key2)%26+97)
if "cumtctf" in flag:
print flag,key1,key2
flag = ""
Q3
1 | 安信信安 信信 安信 信安 安信 安信安信 安安安 安安安 信安信信 |
看到只出现信安2字,猜想是摩斯密码
一共2种可能:1
2
3
4信:*
安:-
解密结果:
xinancool
另一种可能:1
2
3
4信:-
安:*
解密结果:
pmana ssy
显然答案是xinancool
然后猜测下面的是维吉尼亚密钥,xinancool
即为密钥
解密:1
cff81fu{72cemb3d9at99c32c93a60tb55f}
猜测是栅栏加密:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19ctf9f98c13f2uc{9732ac6e0mtbb35d59fa}
2栏:
c2tafc96fe908mct1b3bf325udc5{99f7a3}
3栏:
cumtctf{b99bf7393582dca51c936ffea20}
4栏:
c32btfa3f2c59u6dfce59{0989mfc7ta13b}
6栏:
c8u2mdtccat5f1{cb99396bfff7e3a92305}
9栏:
cf1u7cm39t93c36t5ff8f{2ebda9c29a0b5}
12栏:
c983u926mbdftfcfc7aet35af912{3c0b59}
发现栏数为3的时候是答案:1
cumtctf{b99bf7393582dca51c936ffea20}