如何使用导出的RSA公钥与PyCrypto解密消息?

时间:2016-09-11 08:29:59

标签: python rsa pycrypto

我遇到了这个挑战,我要求使用导出的公钥解密加密的邮件。我收到3个文件:

  1. 加密python脚本
  2. 加密邮件
  3. 导出的公钥
  4. 我尝试导入公钥然后解密,但我想我必须弄清楚私钥才能解密邮件。

    加密代码为:

    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))
    

1 个答案:

答案 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)

现在你应该拥有解密消息所需的一切,只是不要忘记在将加密消息传递给解密函数之前对其进行解码。