HackThisSite - Basic Mission 6

Challenge

Network Security Sam has encrypted his password. The encryption system is publically available and can be accessed with this form.

Sam 把他的密码加密了。加密系统是公开的,可以通过页面上的表单访问。

已知加密后的密码:477djk?=

页面提供了一个加密工具,可以输入任意字符串查看加密结果。

Solution

这题需要逆向加密算法。先用加密工具测试几组已知明文,观察规律:

输入 aaaa(4个相同的字符):

1
aaaa → abcd

规律很明显:每个字符的 ASCII 值加上了它的位置索引(从0开始)。

1
2
3
4
a(0) + 0 = a
a(1) + 1 = b
a(2) + 2 = c
a(3) + 3 = d

所以加密公式是:encrypted[i] = chr(ord(plaintext[i]) + i)

解密即为逆操作:plaintext[i] = chr(ord(encrypted[i]) - i)

Python 解密脚本:

1
2
3
4
5
encrypted = "477djk?="
decrypted = ""
for i, c in enumerate(encrypted):
decrypted += chr(ord(c) - i)
print(decrypted) # 465aff96

验证:重新加密 465aff96

1
2
3
4
5
6
7
8
4 + 0 = 4
6 + 1 = 7
5 + 2 = 7
a + 3 = d
f + 4 = j
f + 5 = k
9 + 6 = ?
6 + 7 = =

结果:477djk?=,与已知密文完全匹配。

自定义加密算法如果有公开的加密 oracle(可以任意加密已知明文),攻击者可以通过 chosen-plaintext attack 推导出算法逻辑,进而解密任意密文。

465aff96