from Crypto.Util.number import * ImportError: No module named Crypto.Util.number

from Crypto.Util.number import *
import gmpy2

c = 122899291469021470029549130291481574095771255674082966638
n = 4290418064651218965804214795113724709341221467051724424273
e = 65537
factors = [14574373685302455767, 17136129397262704181, 17178964373573894299]
phi = 1
for x in factors:
    phi *= (x-1)
d = gmpy2.invert(e, phi)
print long_to_bytes(pow(c, d, n))

PS C:\Users\kai> & python c:/Users/kai/Desktop/py/py/多因数.py
Traceback (most recent call last):
  File "c:/Users/kai/Desktop/py/py/多因数.py", line 1, in <module>
    from Crypto.Util.number import *
ImportError: No module named Crypto.Util.number

当初安装为 pip install crypto导致该问题,第三包有问题需要重新安装

卸载: pip uninstall crypto pycryptodome

重新安装: pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple

重新执行后,恢复正常

PS C:\Users\kai> & python c:/Users/kai/Desktop/py/py/多因数.py
flag{n0t_RSA}
PS C:\Users\kai>

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是一个加密脚本,使用了同余式加密(CRT)。 首先,我们需要求出 $p$ 和 $q$,然后计算 $n$。这一部分的代码如下: ```python from Crypto.Util.number import * from secret import flag def keygen(nbit): p, q = [getPrime(nbit) for _ in range(2)] return (p, q) p, q = keygen(1024) n = p * q ``` 接下来,我们需要求出 $y$,满足 $x^2 - Dy^2 = 1$。这可以使用 Sympy 库来求解。 ```python from sympy import * D = 1117 x = y = symbols('x y') eq = Eq(x**2 - D*y**2, 1) sol = solve(eq, (x, y)) x, y = sol[0] ``` 现在,我们已经有了所有的加密参数,可以开始解密了。首先,我们需要求出 $p$ 和 $q$ 的质因数分解。 ```python from sympy import factorint factors = factorint(n) p, q = factors.keys() ``` 接下来,我们需要计算 $u_1 = (233n^2+1)^{p-1} \mod p$ 和 $u_2 = (233n^2+1)^{q-1} \mod q$。 ```python u1 = pow(233*n**2+1, p-1, p) u2 = pow(233*n**2+1, q-1, q) ``` 现在,我们可以使用 CRT 来计算 $v = (u_1 \cdot q \cdot (q^{-1} \mod p) + u_2 \cdot p \cdot (p^{-1} \mod q)) \mod n$。 ```python from Crypto.Util.number import inverse v = (u1*q*inverse(q, p) + u2*p*inverse(p, q)) % n ``` 最后,我们可以使用 $y$ 来解密第二部分的密文,并将其与第一部分的密文合并得到原始的字节串。 ```python enc1 = ... enc2 = ... part1 = pow(enc1, inverse((p-1)*(q-1), n), n) part2 = pow(enc2, (p+1)//4 * (q+1)//4, n) flag = long_to_bytes(part1) + long_to_bytes(part2) print(flag) ``` 完整的解密代码如下: ```python from Crypto.Util.number import * from sympy import * from secret import flag def keygen(nbit): p, q = [getPrime(nbit) for _ in range(2)] return (p, q) p, q = keygen(1024) n = p * q D = 1117 x = y = symbols('x y') eq = Eq(x**2 - D*y**2, 1) sol = solve(eq, (x, y)) x, y = sol[0] factors = factorint(n) p, q = factors.keys() u1 = pow(233*n**2+1, p-1, p) u2 = pow(233*n**2+1, q-1, q) v = (u1*q*inverse(q, p) + u2*p*inverse(p, q)) % n t = len(flag)//2 enc1 = int(input("enc1:")) enc2 = int(input("enc2:")) part1 = pow(enc1, inverse((p-1)*(q-1), n), n) part2 = pow(enc2, (p+1)//4 * (q+1)//4, n) flag = long_to_bytes(part1) + long_to_bytes(part2) print(flag) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值