寒假无聊摸鱼,月赛题没有crypto,就随便写了misc来看看VN的题,下午写完两道crypto就没看了,后面发现VN的题质量还挺不错。
ezmath
模15意义下2的阶为4,从而返回4*n即可。
远程exp如下:
1 | from pwn import * |
AreYouAdmin
DSA的题,k是由类似LCG的伪随机数生成器产生的,所以用于签名的k之间是相关的,在本题中,对于连续的三个签名之间的k有如下关系:
参考用一般的LCG:来产生DSA中的k的相关攻击:DSA-LCG(理论的推导看这篇paper),我们对该攻击进行扩展。
如果M小于q,那么后面一个模q可以忽略,但是本题中M大于q,而在模q的意义一致即可,因此,M与q的大小没有关系。我们梳理一下已知的信息:
那么我们可以联立得到以下方程:
在假设M小于q的条件下,我们可以构造如下格:
即向量是格列空间的一个格点(),L和M都已知,但是我们需要X的信息,一般的方法是扩展格矩阵,用CVP把X的信息带出来。上面的格矩阵明显不对称,一般也需要扩展到方阵,于是我们将列空间同样扩展到8维,得到下面的格矩阵。
其中我们是可以任意选择的,L已知,由于的大致比特范围我们已知,我们可以对列向量m的后4维做一个简单估计,当然,要使得后4维尽可能小,一般取$\mu,\mu_i$使得后面4维都约等于1,这样就变成了求解格密码的经典CVP问题,对于一般DSA的选取,,,一般均匀分布,估算大小为极值的一半,目标向量为,格为:
此时m与我们设置的目标向量target是很接近的,利用Baiba算法就可以求出格L空间上距离target最近的向量m,从而得到私钥x。
当然到这里核心思路结束了,我们回到题目本身,上面都是假设M小于q,而此题中M大于q,因此第四列后面还需要消去额外的整数个q才能得到-c,那么类似地,我们继续扩展格到9维的方阵就可以解决上述问题。但是只要在模q的意义相等即可,所以8维的格也可以解,只是得的的k1,k2,k3是原始LCG的输出,并且注意到题目给出secretkey的比特数为169(如果不注意到这个条件是规约不出来的),因此一个更好的格如下(最后一行和最后一列可以去掉,8维也可解)
由于,最后一行最后一个数设为1,只要target向量最后一项和它数量级差不多即可。简单一点就取为:
最后只要注意到我们的格是基于列向量的,而sagemath默认的格是基于行向量的,我们把上面矩阵转置一下放sagemath写个脚本就行。
一个本地测试的脚本:
1 | from Crypto.Util.number import * |
在本题中secretkey是固定的,拿到一组数据后就可以本地得到secretkey之后再交互得到flag。
exp如下:
1 | from pwn import * |