我遇到了这个挑战,我要求使用导出的公钥解密加密的邮件。我收到3个文件:
我尝试导入公钥然后解密,但我想我必须弄清楚私钥才能解密邮件。
加密代码为:
import gmpy
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
message = open('message', 'r').read() * 30
def ext_rsa_encrypt(p, q, e, msg):
m = bytes_to_long(msg)
while True:
n = p * q
try:
phi = (p - 1)*(q - 1)
d = gmpy.invert(e, phi)
pubkey = RSA.construct((long(n), long(e)))
key = PKCS1_v1_5.new(pubkey)
enc = key.encrypt(msg).encode('base64')
return enc
except:
p = gmpy.next_prime(p**2 + q**2)
q = gmpy.next_prime(2*p*q)
e = gmpy.next_prime(e**2)
p = getPrime(128)
q = getPrime(128)
n = p*q
e = getPrime(64)
pubkey = RSA.construct((long(n), long(e)))
f = open('pubkey.pem', 'w')
f.write(pubkey.exportKey())
g = open('msg.enc', 'w')
g.write(ext_rsa_encrypt(p, q, e, message))
答案 0 :(得分:0)
正如评论中所指出的,256键非常小,可以很容易地分解。首先,您必须重建密钥生成中使用的素数。找到模数和指数是一个简单的单线衬垫openssl:
$ openssl rsa -in <your-public-key> -pubin -text -modulus
这应输出类似
的内容Exponent: <decimal-value> (<hex-value>)
Modulus=<hex-value>
现在您可以使用msieve对模数进行分解,或在https://factordb.com/数据库中搜索它。这会给你你的“p”和“q”。 由于加密代码不是RSA,您必须编写自己的解密函数,如下所示:
def ext_rsa_decrypt(p, q, e, msg):
m = bytes_to_long(msg)
while True:
n = p * q
try:
phi = (p - 1)*(q - 1)
d = gmpy.invert(e, phi)
privkey = RSA.construct((long(n), long(e), long(d)))
key = PKCS1_v1_5.new(privkey)
enc = key.decrypt(msg, "a")
return enc
except Exception, ex:
traceback.print_exc()
p = gmpy.next_prime(p**2 + q**2)
q = gmpy.next_prime(2*p*q)
e = gmpy.next_prime(e**2)
现在你应该拥有解密消息所需的一切,只是不要忘记在将加密消息传递给解密函数之前对其进行解码。