Franklin-Reiter相关消息攻击
Franklin-Reiter相关消息攻击
使用条件
m1和m2两个明文存在线性关系如 M1 ≡ F(M2) (mod n),其中F表示类似于ax+b的线性关系,且都在相同的e和n下加密
解密原理
首先,我们知道C1 ≡ M1e(mod n),并且M1 ≡ F(M2)(mod n),那么我们可以知道M2是F(x)e ≡ C1(mod n)的一个根。同样的M2是xe - C2在模n意义下的一个根。所以说x - M2同时整除以上两个多项式。因此我们可以求得以上两个多项式的最大公因子,如果最大公因子恰好是线性的话,那么我们就求得了M2。需要注意的是当 e=3 的情况下,最大公因子一定是线性的。
例题
m1=a*m2+b,c1=pow(m1,e,n),c2=pow(m2,e,n)
1 |
|
c1 = pow(2m+3,17,n) c2 = pow(4m+11,17,n)
1 |
|
题目分析
1 |
|
- [(i-5)*i+6==0 for i in x] 使用列表推导式判断等式是否成立,若成立,返回True,否则False,故列表中最终得到的是[True,True],
- 由此可以反推出x = [2,3] (解方程得到),显然也可以知道下一串中y = [4,11]
- reduce函数是应用lambda表达式对列表([True,True])中的每一个元素依次进行异或操作
- PS:“lambda x,y:x&y”中的‘x’与“[(i-5)*i+6==0 for i in x]”中的‘x’并不是同一个
所以能够得到
1 |
|
看reduce函数,举个例子
1 |
|
- 初始时,reduce 函数将列表中的第一个元素 1 作为初始的累积结果 x。
- 然后,对于列表中的每个元素 y,都将当前的累积结果 x 和该元素 y 传递给匿名函数 lambda x, y: x * y 进行积累操作。
- 第一次迭代中,x 是 1,y 是 2,所以累积结果是 1 * 2 = 2。
- 第二次迭代中,x 是 2(上一次的累积结果),y 是 3(列表中的下一个元素),所以累积结果是 2 * 3 = 6。
- 第三次迭代中,x 是 6,y 是 4,所以累积结果是 6 * 4 = 24。
所以题目中
1 |
|
最终得到
1 |
|
解题代码
1 |
|
d,e未知,但是中间量存在线性关系
1 |
|
这里的加密关系
1 |
|
其中有两个未知数,可以把e直接爆破出来(原文便用到了短填充攻击(Coppersmith’s short-pad attack)的代码,暂时没研究明白)
1 |
|
求出m了,根据题目的加密方式 m = s % (p+1) = d % (p+1),类似于dp泄露
1 |
|
e 比较大的时候的half-gcd算法
1 |
|
这道题比较特殊,e很大,用上面的脚本跑大概要1个小时,这里引入另一种解法,half gcd算法
(这个half gcd算法也没看明白,以后看明白再写一篇)
参考:多项式 gcd 的正确姿势:Half-GCD 算法
常规算法
1 |
|
half gcd算法
1 |
|
gcd的结果是 ax - b,我们要得到的是x - m,用monic()将ax - b化为首一多项式即x系数位1,如此得到x - m,然后用coefficients()[0]提取到-m,最后再添个符号得到flag。
Franklin-Reiter相关消息攻击
http://example.com/2024/02/22/Franklin-Reiter相关消息算法/