这里的题目是朋友给我的,标题是一些提示哈,他们起的标题,是为了方便我写,题目来源好像是比赛的题目,具体哪个我也不知道现在,我的理解比较浅显,希望各位师傅指导。
1.这里是一些文章和学习方法哈,没有题目。
2.Whatis逆元
题目
题目就给了提示哈,是利用逆元,题目给了a,b,n,但我构造不成功,问了学长,他给了思路哈,这里写一下
这样就可以开始解题啦,运行脚本,获得falg。
3.howto爆破
题目
题目中给了n,还给了一个for循环,我们仔细观察一下这个for循环。i在1~n中,如果i与n互质,则num加上1。看到这里,我们可以想到欧拉函数的计算(欧拉函数有好几种情况的计算,这里是其中一种)。如果n是质数,则 φ(n)=n-1 。因为质数与⼩于它的每⼀个数,都构成互质关系。所以最终num=n-1。运行脚本,获得flag。
4.完了,又泄露了
题目
首先,我们要分析一下题目,找到信息。题目写了,p,q是1024bit的(在数字领域,为了表达所能表现的状态的数量,使用一个叫“比特”的单位。 1024其实是 2的 10次方,我们把 8比特称为 1个字节),flag<<444,会输出flag的长度,以及c,N,p0的值。那54应该是flag的长度,那我们求一下flag的bit长度。
flag是431bit,p是1024bit,flag<<444,这相当于在flag的二进制后面添加444个0,也就是说,此时flag为875bit。(这里用到异或,异或 : 相同为0,不同为1 ,任何二进制数与零异或,都会等于其本身)这里的数据就是二进制,所以p的后444位是不变的,即知道 p_low 444位。1024-875=149 , 所以 异或 时 p的高149位没有数与其异或,即p_high 已知149位。
(因为我不会写脚本算出p_high和p_low,所以就只能用工具先把p0转化成二进制后获取了) 把p0的数据从十进制转为二进制,前149位数为p_high,后444位数为p_low。即已知p的高位和低位,求p的中间位。mm 为 m 的前431位(不算0b) ,因为 m<< 444, 最后444位全是0。运行脚本,获得flag。
这里用到的是sagemath网页版。
这里补充一次基础知识
5.又泄露了
题目
分析一下,p,q是1024bit,e已知,已给出n,c,p0。由((p>>128)<<128))可知,这是p高位攻击,p0二进制最后128未知。我们将p0转化为二进制看看。
可见 p 低位的0已补齐,kbits为128( kbits 为 p 未知的二进制位数),运行脚本,获得flag。
现在对这个脚本进行一些解析。
(1)f=p_high+x,这里的x代表的是需要我们去求解的p低位。由((p>>128)<<128))我们知道,p0二进制最后128位(这128位是p低位)我们是不知道的。所以,这一部分未知的就是x。
(2)x = f.small_roots(X=2^128,beta=0.4), kbits 为 p 未知的二进制位数,这一步是求解根的上界。
(3)p = p_high+int(x[0]),x[0] 为p的低位,p_high为p的高位,位数要对齐才能相加,所以在p高位后面加0,来补齐位数。
6.crt是什么鬼
题目
标题就给了提示哈,要用到crt(CRT是中国剩余定理,这里只是用了小写),分析一下题目。gift = crt([x, y], [p, q]),我们在这看到了crt。所以有
gift ≡ x (mod p)
gift ≡ y (mod q)
k1p = gift - x
k2q = gift -y
N = k1p * k2q = (gift - x) * (gift - y) = k1 * k2 * n0
n = n >> 440 << 440,由这个我们可以知道这题应该是n高位攻击。所以我们构造
PR.<x> = PolynomialRing(Zmod(N))
f = n_high+x
我们求一下n0,这里n0是n高位+n低位,n低位是n未知的部分,这里是用x代替的。n高位就是题目给的n。
n0是N的因子,求出n0后,求n0与k1p的最大公约数,可以解出p,之后就是正常的RSA解题了。