Web
密码学
传统知识+古典密码
- 题目链接: http://www.shiyanbar.com/ctf/1991
- 题目描述:
小明某一天收到一封密信,信中写了几个不同的年份辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。信的背面还写有“+甲子”,请解出这段密文。
0x00 题目分析
通过题目名称和描述可知,这是一个与六十甲子有关的题目(传统知识),并且用到了古典加密。一般这种题应该首先按照题目所给顺序得到六十甲子序号序列。
0x01 对照六十甲子表
辛卯 | 癸巳 | 丙戌 | 辛未 | 庚辰 | 癸酉 | 己卯 | 癸巳 |
---|---|---|---|---|---|---|---|
28 | 30 | 23 | 08 | 17 | 10 | 16 | 30 |
0x02 “+甲子”
这句话的意思是给其序列的每一个序号加一个”甲子”,也就是60年。
辛卯 | 癸巳 | 丙戌 | 辛未 | 庚辰 | 癸酉 | 己卯 | 癸巳 |
---|---|---|---|---|---|---|---|
28 | 30 | 23 | 08 | 17 | 10 | 16 | 30 |
88 | 90 | 83 | 68 | 77 | 70 | 76 | 90 |
但是呢,得到这组数又有啥用呢,古典密码学有的只是一串字符啊,咱们可以想想,数字和字符怎么有对应关系呢?于是我们可以想到ASCII
辛卯 | 癸巳 | 丙戌 | 辛未 | 庚辰 | 癸酉 | 己卯 | 癸巳 |
---|---|---|---|---|---|---|---|
28 | 30 | 23 | 08 | 17 | 10 | 16 | 30 |
88 | 90 | 83 | 68 | 77 | 70 | 76 | 90 |
X | Z | S | D | M | F | L | Z |
0x03 解密
XZSDMFLZ得到这么一串字符,可是好像没啥规律啊,用CTFCrackTools先尝试一下栅栏解密,得到如下结果
得到因数(排除1和字符串长度):
2 4
第1栏:XSMLZDFZ
第2栏:XMZFSLDZ
继续用得到的两个字符串分别进行凯撒解密,发现第二个字符串解得的字符串中有一个是有规律的
0x04 总结
此题首先将flag进行凯撒加密,然后又用栅栏加密,将得到的密文中选择了一个进行字符->ASCII(对应的10进制),又将每项减去60,产生六十甲子序列的序号序列,再转换成六十甲子序列。
try them all
- 题目链接: http://www.shiyanbar.com/ctf/1981
- 题目描述:
You have found a passwd file containing salted passwords. An unprotected configuration file has revealed a salt of 5948. The hashed password for the ‘admin’ user appears to be 81bdf501ef206ae7d3b92070196f7e98, try to brute force this password.
0x00 翻译(毕竟英语差,顺便学习学习英语)
大意是:你发现了一个包含了加盐密码的密码文件。一个不受保护的配置文件透漏了这个加盐密码为5948,用户“admin”的密码的hash值是81bdf501ef206ae7d3b92070196f7e98,尝试用暴力破解破解此密码。
0x01 解密
看样子是MD5加密,拿到ChaMD5解密(用的是MD5-32加密的),得到明文sniper5948。题目说用了salt加密,并且加盐密码是5948,将它去了就是“admin”用户的密码。
trivial
- 题目链接: http://www.shiyanbar.com/ctf/1980
- 题目描述:
An unlocked terminal is displaying the following:
Encryption complete, ENC(???,T0pS3cre7key) = Bot kmws mikferuigmzf rmfrxrwqe abs perudsf! Nvm kda ut ab8bv_w4ue0_ab8v_DDU
You poke around and find this interesting file.
0x00 翻译
大意是:一个未锁的终端显示了如下的信息。
加密完成,ENC(???,T0pS3cre7key) = Bot kmws mikferuigmzf rmfrxrwqe abs perudsf! Nvm kda ut ab8bv_w4ue0_ab8v_DDU
0x01 题目分析
可以在上面链接中得到一个压缩包,里面有一个名为encrypt.py的python源文件,先来测试一下其功能:
encrypt.py源码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#!/usr/bin/env python
import sys
alphaL = "abcdefghijklnmopqrstuvqxyz"
alphaU = "ABCDEFGHIJKLMNOPQRSTUVQXYZ"
num = "0123456789"
keychars = num+alphaL+alphaU
if len(sys.argv) != 3:
print "Usage: %s SECRET_KEY PLAINTEXT"%(sys.argv[0])
sys.exit()
key = sys.argv[1]
if not key.isalnum():
print "Your key is invalid, it may only be alphanumeric characters"
sys.exit()
plaintext = sys.argv[2]
ciphertext = ""
for i in range(len(plaintext)):
rotate_amount = keychars.index(key[i%len(key)])
if plaintext[i] in alphaL:
enc_char = ord('a') + (ord(plaintext[i])-ord('a')+rotate_amount)%26
elif plaintext[i] in alphaU:
enc_char = ord('A') + (ord(plaintext[i])-ord('A')+rotate_amount)%26
elif plaintext[i] in num:
enc_char = ord('0') + (ord(plaintext[i])-ord('0')+rotate_amount)%10
else:
enc_char = ord(plaintext[i])
ciphertext = ciphertext + chr(enc_char)
print "Encryption complete, ENC(%s,%s) = %s"%(plaintext,key,ciphertext)
经过测试功能,可以分析出源码是怎样对明文进行加密的。encrypt.py SECRET_KEY PLAINTEXT(第一个参数是加密文件名,第二个参数是密钥,第三个参数是明文)。Encryption complete, ENC(mkks,123a) = nmnc(mkks是明文,123a是密钥,nmnc是密文)。所以根据题目现在知道了密文和密钥,让我们求明文。可以根据加密算法写一段解密的代码(代码是借鉴别人的,本人现在还小白一个)。
假设pla是b,key是a(即rotate_amount为10),那么根据源代码:1
enc_char = ord('a') + (ord(plaintext[i])-ord('a')+rotate_amount)%26
算出来chr(enc_char)为l。换句话来说,从密文换到原文也就是:1
enc_char = ord('a') + (ord(ciphertext[i])-ord('a')-rotate_amount)%26
把加号换成减号就行。
0x02 编写解密代码
1 | #!/usr/bin/env python |