type
status
date
slug
summary
tags
category
icon
password
不打国赛,赛后看题复现,感谢给我提供附件的师傅
@糖醋小鸡块
。古典密码
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才比较适配以下条件:得到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)。
📎 参考文章
欢迎一起交流~
- Author:ZimaBlue
- URL:https://www.zimablue.life/article/ciscn2024
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!