Sin(πz)=Sin(π∗z)
即
(πz)mod(2∗π)=(π∗z)mod(2∗π)
那么在RSA中我们可以使用Jumping’s Second Law
将e模ϕ(n)求逆元问题转换为e模n求逆元的问题
即
c≡memodn≡m∗emodn
即我们可以通过求解e模n的逆元来求解明文
m≡c∗e−1modn≡m∗e∗e−1modn
POC如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import gmpy2
p = 2713 q = 3733 m = 8701623 e = 3163 n = p * q c = pow(m, e, n)
# RSA Decrpytion
phi = (p - 1) * (q - 1) d = gmpy2.invert(e, phi) m1 = pow(c, d, n) print(m1)
# Jumping's Second Law in RSA
e_ = gmpy2.invert(e, n) m2 = (c * e_) % n print(m2)
""" 8701623 8701623 """
|
上述内容在RSA中对于Jumping’s Second Law的使用并不是很严谨
这里给出一个更加严谨的使用
πzmod2∗π=π∗zmod2∗π
令π为2n, z为e
则有
(2n)emodn=(2n)∗emodn – (1)
这里由于n为p, q两个素数之积,2n不是整数
所以我们需要使用三素数RSA,令第三个素数r为2
n=p∗q∗r=2∗p∗q
则当m=p∗q=2n时
将m=2n和c≡memodn带入式(1)可得
c≡memodn≡m∗emodn
POC如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import gmpy2 from Crypto.Util.number import *
p = getPrime(16) q = getPrime(16) e = getPrime(16) r = 2 n = p * q * r m = p * q c = pow(m, e, n) print(m)
# RSA Decryption
phi = (p - 1) * (q - 1) * (r - 1) d = gmpy2.invert(e, phi) m1 = pow(c, d, n) print(m1)
# Jumping's Second Law in RSA Decryption
e_ = gmpy2.invert(e, n) m2 = (c * e_) % n print(m2)
""" 1854486911 1854486911 1854486911 """
|
即在三素数RSA中有一个素数为2且m为其他两个素数之积时
可以使用Jumping’s Second Law对RSA算法进行攻击
将memodn转变为m∗emodn
将分解n的时间复杂度O(n)
降到使用EEA计算e模n逆元的时间复杂度O(log2n)
大大降低了RSA私钥的计算难度
考虑到Sin函数的对称性
则有
πzmod2∗π≡π−(π∗z)mod2∗π
即
c≡memodn≡m∗(1−e)modn
其中n为三素数之积且其中一个素数为2,m为其他两个素数之积
那么在这种情况下进行RSA解密则需要计算1−e模n的逆元
即
m≡c∗(1−e)−1modn
但由于n和1−e均为偶数,无法求(1−e)模n的逆元
若e为偶数则在正常RSA解密中无法求e模ϕ(n)的逆元
故这种情况下无解
EOF