包含三道crypto题目的题解。
crypto1
题目描述:
1 | crypto1 |
题目:
1 | from Crypto.Util.number import * |
题目首先生成了一个128字节的gift,并给出一个加密值:
然后,对flag的每一个字节mi又进行如下加密,并给出密文:
显然只要知道gift就可以对密文逐字节爆破,为了求出gift我这里采用groebner,首先把gift<<48看作一个整体,然后令:
然后我们又知道前几个被加密的flag字符应该是”flag{“,取第一个字符就能造出如下的groebner用法:
1 | PR.<x,y> = PolynomialRing(Zmod(N)) |
就可以求出y的值,然后对flag逐个爆破即可。
exp:
1 | from Crypto.Util.number import * |
然后其实用groebner确实也有点大材小用,其实用相关明文攻击就可以,仍然令:
那么还是取第一个字符的加密值,就有下面的两个等式:
显然两个多项式有公共根x,所以求gcd就能得到x。
exp:
1 | from Crypto.Util.number import * |
一种新的密码算法
题目描述:
1 | 车厂好像在搞一些很新的东西。 |
题目:
1 | import flag |
cipher:
1 | cipher [8107, -15748, 921, -2565, -124146, 1775, 33149, -50478, 2349, 168, -267559, 1183, 35010, -50623, 2407, 2758, -304997, 959, 34378, -71456, 2807, 700, -280622, 498, 29055, -68814, 2638, 1126, -249750, 76, 30408, -47829, 2106, -559, -262141, 1698, 9089, -18788, 974, -1915, -128297, 1542, 31591, -50627, 2338, 410, -276685, 1315, 36859, -66598, 2856, 1250, -330512, 1210, 8776, -11380, 793, -1469, -111219, 1361, 25034, -38643, 1945, 965, -226238, 849, 35515, -39060, 2164, 187, -304231, 2176] |
估计预期要用LWE之类的,所以才给了500分。但实际上r向量给定了,并且pk_mt矩阵满秩,所以直接解矩阵方程就可以得到作为flag的唯一解,最大的槽点是解出来的那一坨居然就是flag,甚至不需要包一个”flag{}”,我还以为套了一层古典。
exp:
1 |
|
DSA
题目描述:
1 | 这个签名有什么问题呢 |
题目:
1 | #!/usr/bin/env python |
标准的DSA签名实现,造的HNP的格子也很标准,如下:
线性关系是:
这部分的原理不明白的话可以去la佬博客看,或者也可以看我写的这篇文章中的LLL-Third Blood一题:
2023-0xGame-week4-wp-crypto | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz)
而之所以要乘T,是因为测试一下会发现x大约在221比特的数量级,而k是210比特,因此用最经典的这个不消x的格子的话,要对前面数列均乘上一个2^11的平衡系数。然后题目把界也小卡了一下,导致x并不在规约出的前几行,但是可以在后面的行中找到结果。
如果这样出不了结果的话,就必须消去x后再利用消去后的表达式造格。
exp:
1 | from Crypto.Util.number import * |