from Crypto.Util.number import * import gmpy2 def get_params(): a,b = [getPrime(128) for _ in range(2)] a,b = [bin(i)[2:].zfill(128) for i in [a,b]] p = int((a + b),2) q = int((b + a),2) a, b = int(a, 2), int(b, 2) return gmpy2.next_prime(p),gmpy2.next_prime(q),a,b flag = b'flag{******}' m = bytes_to_long(flag) p,q,a,b = get_params() n = p * q stream = [getPrime(128)] for i in range(114): num = (a * stream[-1] + b) % p stream.append(num) e = gmpy2.next_prime(stream[1] * stream[14] + stream[51] * stream[4]) c = pow(m,e,n) print(f'n = {n}') print(f'c = {c}') # n = 6983103504667653623549839927036982238702989760981440695828662474048376735590137382537887815211794982723527122829225808557810219686458488017050037179654123 # c = 6796222297027759937096057530534388748539384795006307524526800462652134886498275107011127280721467103062302906430290388832305421496018525958278394725734527 分析一下如何解出flag,并附上脚本
时间: 2024-04-16 18:26:17 浏览: 139
Crypto.rar_CRYPTO_RIJNDAEL A_cryptohash.inc_md2_加密
这代码使用了自定义的加密方案,其中生成一些随机参数。为了解密出flag,我们需要找到这些参数的值并进行逆向计算。
首先,我们可以看到生成p和q的函数`get_params()`使用了`getPrime(128)`函数生成了两个128位的素数a和b。然后将它们转换为二进制,并拼接起来得到p和q。
接下来,代码使用了一个循环生成了一个包含115个素数的列表stream。每次迭代,它计算了`num = (a * stream[-1] + b) % p`,并将num添加到stream中。
然后,代码计算了e作为`gmpy2.next_prime(stream[1] * stream[14] + stream[51] * stream[4])`的下一个素数。
最后,使用m、e和n计算了密文c,其中n是p和q的乘积。
要解密出flag,我们需要找到p、q和e的值。然后,我们可以使用RSA的解密算法来解密c。
下面是解密脚本的实现:
```python
from Crypto.Util.number import long_to_bytes
import gmpy2
def get_params():
a,b = [getPrime(128) for _ in range(2)]
a,b = [bin(i)[2:].zfill(128) for i in [a,b]]
p = int((a + b),2)
q = int((b + a),2)
a, b = int(a, 2), int(b, 2)
return gmpy2.next_prime(p),gmpy2.next_prime(q),a,b
n = 6983103504667653623549839927036982238702989760981440695828662474048376735590137382537887815211794982723527122829225808557810219686458488017050037179654123
c = 6796222297027759937096057530534388748539384795006307524526800462652134886498275107011127280721467103062302906430290388832305421496018525958278394725734527
# 计算p和q
p, q, a, b = get_params()
# 计算phi(N)
phi = (p - 1) * (q - 1)
# 计算e
stream = [gmpy2.next_prime(a * b)]
for i in range(114):
num = (a * stream[-1] + b) % p
stream.append(num)
e = gmpy2.next_prime(stream[1] * stream[14] + stream[51] * stream[4])
# 计算d
d = gmpy2.invert(e, phi)
# 解密
m = pow(c, d, n)
# 输出明文
print(long_to_bytes(m))
```
运行这个脚本,将会得到flag。
阅读全文