2024年春秋杯夏季赛Crypto部分题目复现
触不可及。正因为触不可及,天空才是湎于幻想之人的归宿。
1.ezzzecc
题目附件:
1 | p = getPrime(256) |
当时看到这道题的时候,这不就是个ecc的板子题嘛!只要再多搞个k爆破就可以出来了
但是我还是有点低估了这道题
p = koZP3YQAklARRNrmYfjxoKIAXegOcG4jMOmKb08uESOkCCn72d6UM2NWgefYPEMq4EJ1M0jKaqt02Guo5Ubccjqg4QZaaHbScREx38UMLQKwG0LcDd8VFX1zkobc1ZQn4L3DhKQrgJZI55todgOdJuHN532bxScAvOF26gJyQclPtRHn3M6SHrRCEXzzmszd68PJlLB6HaabrRrCW9ZoAYSZetM5jDBtNCJLpR0CBZUUk3Oeh2MZQu2vk8DZ1QqNG49hlxGfawp1FXvAZPdMwixzkhEQnbCDcOKzYyT6BZF2Dfd940tazl7HNOswuIpLsqXQ2h56guGngMeYfMXEZV09fsB3TE0N934CLF8TbZnzFzEkOe8TPTK2mWPVSrgmbsGHnxgYWhaRQWg3yosgDfrEa5qfVl9De41PVtTw024gltovypMXK5XMhuhogs0EMN7hkLapLn6lMj
额,这p是什么东西?
尝试了很多种编码方式,就是解不出p,“p的格式为p={p}”也没看明白是什么意思
后面朋友把学长的脚本分享给了我,我发现我遗漏了一个很重要的点,就是椭圆曲线的方程:
因为K和G都在曲线上,所以我们可以把K和G两个点代入到椭圆方程当中求kp
然后在gcd(k1p,k2p),最后就可以把p给求出来
exp:
1 | from Crypto.Util.number import* |
跑了挺长时间的,用虚拟机好像跑的快一点
2.signatrue
这道题因为是一道靶机题,就先分析一下解题思路,以后有环境了再复现一下:
附件:
server.py
1 | import os |
这道题是DSA+HNP的结合题,XCTF2020-高校战役-NHP和这道题较为类似,因为这道题也是靶机题,有环境再复现
我们粗略看一下这些代码块:
1 | def gen_key(): |
我们能够看得出,这里考察的是隐藏数问题(HNP / Hidden Number Problem),用admin来检验签名
多次签名造格
(春秋杯是真的喜欢考DSA的知识啊,今年冬季赛也考了DSA)
我们有:
然后我们在login函数里发现times=8,所以我们造格时i最大也为8
所以有:
把x,k求出来
然后我们来估算一下:
1 | k = int(hashlib.md5(os.urandom(20)).hexdigest(),16) |
通过这里的代码,我们可以估计k(K)的长度大概在32*4=128bits左右
DSA通常使用 1024 比特的 p
和 160 比特的 q
,所以q应该就是160比特长
1 | pri = random.randint(2,q - 2) |
x在(2,q-2)的范围内,所以x的长度和q应该也差不多,为160bits左右
然后估算造的这个格x的大小,大概在140.8bit左右,所以很明显小了,因为x至少都有160bits左右,所以这个格要重新造
HNP造格的一些其它思路:
https://zhuanlan.zhihu.com/p/581146119
我们发现k小x大,所以我们可以先消去x:
(步骤简化了一些,详细步骤上面的博客里有)
求出k0之后,然后就可以解r和s
学完这道题,收获还是很大的
HNP也经常和LCG一起考察,到时候一并更新
*NPUCTF 2020 - babyLCG
*RCTF 2022 - IS_THIS_LCG
第一次尝试在自己的博客上记录自己的学习心得,还有很多不足之处,希望各位师傅批评指正!