Post on: 2024-5-28Last edited: 2025-1-11Words 00 min

type
status
date
slug
summary
tags
category
icon
password
😀
不打国赛,赛后看题复现,感谢给我提供附件的师傅@糖醋小鸡块

古典密码

notion image

OvO

kk可以通过e的高位eh除以n来求得,然后根据e的生成式子建立方程,利用eh近似为e解方程求得p的高位,最后来一次coppersmith。

ezrsa

题目代码很简单,就是用一个CBC模式的3DES加密了rsa私钥。但是密钥随机的范围特别小,因此可以通过爆破来解开对称加密。具体可以定位RSA库的代码,然后再通过引用找到PEM.py中的encode函数:
这里可以找到3des的KDF方式,并且加密时的IV为salt,PEM文件中已经打印出来了。解密PEM之前需要先弄懂私钥格式,参考一下OPENSSL中RSA私钥文件(PEM格式)解析。私钥的标签头为4字节3082025c,e默认为0x10001,那么在PEM文件中对应的值为0203010001。因此现在只需要爆破passphrase并与上述两个位置的明文对应就能恢复解密的PEM文件了。
只能得到私钥的前144bytes和最后88bytes。私钥的前一部分刚好给了n和e的值。后一部分为qinvp和dq的低14bytes,由于CBC模式解密错误只影响一轮,因此还能有剩下6字节是正确的,也就是我们需要在已知n,e,invert(q,p),dq低位 的条件下分解n。该过程同2022年蓝帽杯初赛密码题。这里dq给的比特太少了,并且次数为2,所以要让beta取接近1才比较适配以下条件:
notion image
得到dq把q求出来用m=c^dq mod q 解密即可。

hash

题目用了个py2.7版本的hash函数来对key做单射,所以我们的目标是恢复key,然后得到用于异或加密的sha384。 所以要去找一下py2.7下hash()的源码实现。懒得去装py2.7,在python3有实现py27hash ,找到hash的实现:
在这里可以看到当传入的参数为字节的时候,调用shash:
定位关键代码:
由于:x = (1000003 * x) & mask ^ c ,等价于 x = (1000003 * x + cc) % 2**64 ,其中 cc 取值范围为-256到256之间。这里的递推关系非常像是LCG,然后cc的范围很小,因此可以考虑构造格子来打。这里要注意第一个x是初始值,可记为,显然我们是需要知道这个值来造格的,因此可以考虑爆破value的第一个字节。 我们已知的递推关系为:
 
然后我们带入一下就有:
这里只用了连续两组来表示,但已经可以说明格子每行之间的关系了。我们可以造下面这个格子:
2^7 是为了匹配256这个范数,第一列统一乘上一个系数是为了优先规约。exp:

what mouth

一个flask写的密钥分发协议,主要难点在于审代码,可以结合gpt去读,具体的参考2024-CISCN-wp-crypto | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz)

📎 参考文章

💡
欢迎一起交流~
 

从一道题学习三种低指数相关攻击技巧

🗒️从一道题学习三种低指数相关攻击技巧

通过一道CTF题目学习三种解题技巧。


首届高校网络安全管理运维赛

🗒️首届高校网络安全管理运维赛

中国教育技术协会举办的首届高校网络安全管理运维赛。