from Crypto.Util.number import * from random import randint from secret import flag def TrickPrime(bits): p = getPrime(bits) q = getPrime(bits) cut = randint(1,256) temp = p*q print('clown =',temp) game = (p&(2**bits-1)) >>cut<<cut #p高位需要给出 print("trick =",game) return p,q def CrazyPrime(nbits): p = getPrime(nbits) q = getPrime(nbits) r = getPrime(nbits) n = p * q * r print("n =", n) m = getPrime(256) P = pow(m, p, n) Q = pow(m, q, n) R = pow(m, r, n) print("P =", P) print("Q =", Q) print("R =", R) return m P,Q = TrickPrime(512) R = CrazyPrime(512) N =P*Q*R phi = (P-1)*(Q-1)*(R-1) e = 65537 d = inverse(e,phi) m = bytes_to_long(flag) c = pow(m,e,N) print("c = ",c)
时间: 2024-04-02 07:35:24 浏览: 230
这段代码看起来是一个RSA加密过程,但是它使用了两个不同的质数生成函数`TrickPrime`和`CrazyPrime`。其中,`TrickPrime`生成两个质数`p`和`q`,并且根据一个随机数`cut`将`p`的高位移动到低位,得到一个新的数`game`,然后返回`p`和`q`。`CrazyPrime`生成三个质数`p`、`q`和`r`,然后返回一个随机生成的数`m`,以及三个数`P`、`Q`和`R`,其中`P`、`Q`和`R`分别是$m^p \bmod n$、$m^q \bmod n$和$m^r \bmod n$,其中$n=pqr$。
这段代码的加密过程是将明文转换为整数$m$,然后计算$c=m^e \bmod N$,其中$N=pqr$,$e$是一个常见的RSA公钥指数(65537)。由于这里使用了三个不同的质数,因此我们不能使用常见的RSA攻击技术(如Wiener攻击、Håstad攻击等)。
但是这段代码的安全性仍然存在问题。首先,`TrickPrime`函数中使用的随机数`cut`只有8位,这意味着我们只需要尝试256次就可以恢复原始的`p`值。其次,`CrazyPrime`函数中生成的`P`、`Q`和`R`值都是使用相同的明文$m$计算得到的,这意味着我们可以使用CRT攻击来获取明文。因此,我们可以使用这些漏洞来破解这个加密算法。
相关问题
from Crypto.Util.number import * import gmpy2 import random def get_extend(): while True: d = random.randint(2**680,2**730) if isPrime(d): e = gmpy2.invert(d,lcm) return e flag = b"flag{xxxxxxxxxxx}" m = bytes_to_long(flag) e = 65537 p = getPrime(1024) q = getPrime(1024) lcm = gmpy2.lcm(p-1,q-1) n = p*q c = pow(m,e,n) e1 = get_extend() e2 = get_extend() print("e1 =",e1) print("e2 =",e2) print("c =",c) print("n =",n)
这段代码是一个简单的RSA加密示例。首先,它导入了一些必要的库,包括`Crypto.Util.number`、`gmpy2`和`random`。然后定义了一个函数`get_extend()`,它用于生成一个满足特定条件的随机数d。该函数使用`random.randint()`生成一个位于2^680和2^730之间的随机数d,并使用`isPrime()`检查该数是否为素数。如果是素数,它会使用`gmpy2.invert()`计算出与d互素的数e,并返回e。
接下来,代码定义了一个名为flag的字节串,将其转换为长整型m。然后设置了RSA加密所需的一些参数,包括指数e、两个随机生成的素数p和q、以及它们的最小公倍数lcm。最后,使用`pow()`函数对明文m进行加密,得到密文c。
另外,代码还生成了两个扩展指数e1和e2,并将所有参数打印出来。
需要注意的是,此代码中的某些部分可能需要额外的库或函数定义才能正常运行。
from Crypto.Util.number import * import gmpy2 import random def get_extend(): while True: d = random.randint(2680,2730) if isPrime(d): e = gmpy2.invert(d,lcm) return e flag = b"flag{xxxxxxxxxxx}" m = bytes_to_long(flag) e = 65537 p = getPrime(1024) q = getPrime(1024) lcm = gmpy2.lcm(p-1,q-1) n = p*q c = pow(m,e,n) e1 = get_extend() e2 = get_extend() print("e1 =",e1) print("e2 =",e2) print("c =",c) print("n =",n) 这题的解题思路是什么
这段代码是一个简单的RSA加密示例。首先,它导入了一些必要的库,包括`Crypto.Util.number`、`gmpy2`和`random`。然后定义了一个函数`get_extend()`,它用于生成一个满足特定条件的随机数d。该函数使用`random.randint()`生成一个位于2680和2730之间的随机数d,并使用`isPrime()`检查该数是否为素数。如果是素数,它会使用`gmpy2.invert()`计算出与d互素的数e,并返回e。
接下来,代码定义了一个名为flag的字节串,将其转换为长整型m。然后设置了RSA加密所需的一些参数,包括指数e、两个随机生成的素数p和q、以及它们的最小公倍数lcm。最后,使用`pow()`函数对明文m进行加密,得到密文c。
另外,代码还生成了两个扩展指数e1和e2,并将所有参数打印出来。
所以,这道题的解题思路是通过阅读代码,了解RSA加密算法的基本原理和参数设置,并根据给定的参数计算出相应的结果。具体而言,需要注意以下几点:
1. 生成满足条件的随机数d:通过调用`get_extend()`函数生成满足条件的随机数d。
2. 计算扩展指数e:根据生成的随机数d和最小公倍数lcm,使用`gmpy2.invert()`计算出与d互素的数e。
3. 生成RSA加密所需的参数:随机生成两个素数p和q,计算它们的最小公倍数lcm,并计算n=p*q。
4. 加密明文m:使用`pow()`函数对明文m进行加密,得到密文c。
5. 打印结果:将生成的扩展指数e1和e2、密文c以及其他参数打印出来。
通过以上步骤,就可以得到解题所需的结果。
阅读全文