Sky's blog

密码学课程3道古典密码题目

Word count: 556 / Reading time: 3 min
2017/12/13 Share

Q1

题目给出了程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import 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
5
1.这里的change函数的作用其实就是凯撒加密
2.将str1进行凯撒加密,移位量为key
3.然后得到str2=zab81501z9740b67dc0by8z15093a426
4.flag的值就是str1的md5
5.已知md5(flag)的[10:16]是aebc0a

破解思路相当清晰了

1
2
3
4
1.将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
15
import 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
9
encode = "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
3
安信信安 信信 安信 信安 安信 安信安信 安安安 安安安 信安信信

zns81fh{72esam3a9ig99c32p93c60hp55q}

看到只出现信安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
19
ctf9f98c13f2uc{9732ac6e0mtbb35d59fa}

2栏:
c2tafc96fe908mct1b3bf325udc5{99f7a3}

3栏:
cumtctf{b99bf7393582dca51c936ffea20}

4栏:
c32btfa3f2c59u6dfce59{0989mfc7ta13b}

6栏:
c8u2mdtccat5f1{cb99396bfff7e3a92305}

9栏:
cf1u7cm39t93c36t5ff8f{2ebda9c29a0b5}

12栏:
c983u926mbdftfcfc7aet35af912{3c0b59}

发现栏数为3的时候是答案:

1
cumtctf{b99bf7393582dca51c936ffea20}

CATALOG
  1. 1. Q1
  2. 2. Q2
  3. 3. Q3