[WP] cryptohack symmetric-ciphers stream-ciphers

听说你是块密码?不对,是流密码?妖孽,速速与我一战

目录传送门:cryptohack 练习学习汇总(writeup index)

Symmetry

“This challenge introduces an unusual property of OFB.”

这个所谓的特殊性质就是对称性,OFB 异或 plaintext 的过程是在加密 iv(, iv+1, …) 之后,因此是自反的,encrypt 和 decrypt 完全等价

代码: cryptohack/mathematics symmetric-ciphers Symmetry.py

Bean Counter

看看代码,好,CTR 模式

嗯?怎么有点不对劲?

1
2
3
4
if self.stup:
self.newIV = hex(int(self.value, 16) + self.step)
else:
self.newIV = hex(int(self.value, 16) - self.stup)

好耶是 bug!错别字!

好一个 CTR 变成了异或加密

另外我们显然知道 png 格式前 16 个字节的内容,至此可以恢复出 encrypted(iv) 进而得到 flag,完美

代码: cryptohack/mathematics symmetric-ciphers Bean-Counter.py

CTRIME

CTR 模式的一大特殊性:不需要 padding,不需要满 16 字节,因此我们相当于知道了 zlib.compress 之后的长度。

zlib.compress 特性:相邻的同样的内容会被压缩。因此我们可以输入已知内容+我们猜测的一个字节,如果发现压缩之后大小没怎么变化基本就可以确定是了

实际操作的时候,可以选择压缩后长度最小的(即最有可能),且输入的内容可以多重复几遍,效果更佳

注意,仍然是需要多线程加速,最终用时 2min

代码: cryptohack/mathematics symmetric-ciphers CTRIME.py

Logon Zero

如果我们将 ct 和 iv 全部设置为相同的某个字符,那么可以发现解密过程中 state 不会改变,因此得到的 b 全部相同!而且 ct 为全 0 因此所有的 c 都相同!

也就是说,只要我们重置密码时候传输 28 个 b'\0' 那么最后的密码将是 8 位相同的随机数(例外:如果恰好 b 为 0 那么密码将为空,因为 password_length 也会是 0)

一个新知识点:json 处理在字符串中处理不可见字符的方式: Unicode(例如 \u0000

值得一提的是,得到 flag 后可以在 flag 里面发现一个 CVE 的名字,竟然是 windows server 的一个 2020 的洞

代码: cryptohack/mathematics symmetric-ciphers Logon-Zero.py

Stream of Consciousness

可以发现所有的密码都由一串相同的结果 xor 得到(CTR 模式特性),而且我们知道 flag 的开头几个字母 crypto{

首先我们可以获取密文。反复向网站发送 100 次请求可以得到 22 种不同的密文。对每个密文都尝试以 crypto{ 为开头解得秘钥,并判断秘钥是否可以用于其他密文(以得到可见字符),最后得到开头的 7 位秘钥

接下来,由我们已经解密得到的除了 flag 之外的字段,可以根据英语语义猜测其接下来的字段

脚本用于人工交互(输入猜测)得到秘钥

下面是我的猜测过程

1
2
3
4
5
6
7
8
9
10
11
[+] Guess Period:
11 l
9 all
1 bly
9 nore
0 ve
2 ing
15 ying
17 ng
1 ow
16 n

代码: cryptohack/mathematics symmetric-ciphers Stream-of-Consciousness.py

Dancing Queen

可以发现给出的 chacha20 代码的字节处理过程完全可逆,因此由 msgmsg_enc 求出 key 然后解密 flag_enc 即可

代码: cryptohack/mathematics symmetric-ciphers Dancing-Queen.py