听说你是块密码?不对,是流密码?妖孽,速速与我一战
目录传送门: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 | if 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 | [+] Guess Period: |
代码: cryptohack/mathematics symmetric-ciphers Stream-of-Consciousness.py
Dancing Queen
可以发现给出的 chacha20 代码的字节处理过程完全可逆,因此由 msg
和 msg_enc
求出 key
然后解密 flag_enc
即可
代码: cryptohack/mathematics symmetric-ciphers Dancing-Queen.py