TGCTF
qwq
比赛过一半了才开始打,不过还好都做出来了(看来最近还是有进步的XD
前面的都是些板子题,wp就写最后两题了(好吧其实就是比较懒…
EZREA
题目
1 | from secrets import flag, get_random_emojiiiiii |
将给出的p0转化为实际的p低位,此时泄露的低位是256bit,而p为512位,所以此时已知的位数是不足以支撑我们直接打copper的,分析源码不难看到,p后面应该是有9个emoji的,而我们已知的只有8个,对这八个emoji分析一下,发现它们前六位16进制是一样的,那么已知前六位后面的位数爆一下就行。这样就又知道32位,copper就很好打了。
1 | from Crypto.Util.number import * |
解出pq之后发现还存在e与phi不互素的问题,有限域开根即可,又因为flag尾部有填充使其大于n,所以最后解出的m要爆一下加上k倍n。
1 | from Crypto.Util.number import * |
LLLCG
题目
1 | from hashlib import sha256 |
流程其实挺明显的,第一步先crt还原12个原始的k。
1 | ks_list = [ |
然后gröbner-基直接解abcdn(关于gröbner-基的知识回头专门写一下。挖坑ing……)
1 | from hashlib import sha256 |
注意一点是多项式的那个lcg不能模n,所以咱新定义一个不模n的next1()。
得到结果为
1 | [seed1 + 27553442761320803111033927459351301439, seed2 + 8751726402848649210592158816653868133, seed3 + 151675940788388913235685454123990751505, a + 190977597196110730368051435445041597812, b + 92142738520715948485383509663407014763, c + 27559439992420203108859060145440838759, d + 127040748918708020271648934423063832295, 201571730232643984713598504087145846411] |
因为此时是ZZ下的,我们需要模n才能得到对应的参数,此时n已知是列表最后一个值。
1 | from hashlib import sha256 |
得到abcdn之后我们令seed1,seed2,seed3分别为12个L_list中的最后三个,这样就可以直接进行选项二的相关计算。
接下来进行选项二,总结一下就是使用签名的第一个k是又经过307次后的lcg,给了10个r与s,不难想到是基于DSA的HNP问题。但是经过尝试发现一般的做法无法规约出满足x数量级的结果。因为此时
1 | self.x = randint(1, self.q - 1) |
而q.bit_length()为160,k为128bit,如果用常规的格,我们用hermite定理算一下目标向量的上界
1 | import math |
规约的结果大概在140bit左右,无法满足x的数量级,于是我们消去x之后再构造格。
1 | import hashlib |
得到x之后在选项3使用选项2的最后一次k签名msg提交即可
脚本交互一直报错只能手动交互了XD