不使用密钥的 RSA 解密

Posted

技术标签:

【中文标题】不使用密钥的 RSA 解密【英文标题】:RSA decryption without using the key 【发布时间】:2020-02-17 15:06:54 【问题描述】:

我在学习 RSA 方面还是新手,很抱歉这个愚蠢的问题。

我得到了一个 RSA 公钥和一个密文。 我知道 RSA 是如何工作的,所以我已经根据 N、p 和 q 进行了计算。 现在无需蛮力找到私钥,我应该找到一种方法将其解密为明文并 我的问题如下:当我打印我的密文时,它看起来像这样:

b'\xdcM\xbf\xe6\x91\x1c\xf7\x1a\xbfVM\x10\x9eu\x97\x9f\x86yx~y\xab\xac\xab\xf6\xc0G\xb5\x84\r\ x89\x0b\x83\x8a\x84\x88Z28(\xd4\x99S\xd8\xf4\xed\r\xc8\xec\x00k\x0cx(\xde\x01\x0f\'\x08w\xb9_\x96X\xcap\ xe0\xc5\x9b\x1c/\x0f\xabW\xb4+d6\x00Y\xcf\x04\xf3\x916$W\xa8&\xc1\x94\x90\xae\xb0\xceF,\x86.\x81Oo\x00 \x00\xbc\x1fBE\x95u\xaa\xe1\xf5a\x97\r\xa5\n4\x05\x182\xd8\xb5\xfd,M\xdd\xc9\xdf\xe7\xcce\x9b\xf5\x075 \x8d/\xd6\xc4R\xf3=\xd8\xb7\x8c\xd5\x0fjo\xec\xd6\x15\x03\x1b=\x9fL\x032\xee\\x8b[\xf0\x7f-\xb6X\ xaa\xba\x15\xf7AsT\xdck\x14\xf3?\xfc\x82\q\xaf\xea=\xc4\x07\x03\x82\xc0\xfb1b\x89-\x81\\xda\xbf\x94] \xac@\xf2y0\x7f\x83/\xb5\xe6i\x7f\xe4\xbb\n\xad\xdd\xbb\xbf\xa5\xdc\x08\xb6\x82\xb4\xf4g\x16\x82\x0c ~\x13\x8b-\\xf0n\x99\x93\x00\xa9\xc0Y\xb9\x93\xfeV\x1dI\x8f\xa5\xab\x17\xf7\xd4HfP\xdc\xa6\x10^b\ x9cy\xc5\x81Z+\xa2H\xbe=\xdf\x9c\xd7\x9d\x809\xaag\xce\xa2\xe8\x96\xc6\xc1\xc7\x90\xdd\xe6%.-z3\\x8e? \xaf\xbbx\xb4\xe9;\xba\x87\x01:R\x1d\x889M\xf9\xf2\xacx\xe1\xea\xbfG\xb8\x8fr:\x89\xef\x85\x9e\xbd\x10J\x1a\xbd\xe5t\x0f\x8f8\xba6&\nU\x04\xc7\xc3\xef7t)\xd8m:>\xf9\xa4@\xc7\x10l\xeas\r\x83\xfb\x96fXi\xa7=R\xff\x7f\xbf0%\xa7\x88c\x0e\x9fp\xaa\xcb\xcen|T\x131Z\xb3X\xecB\xbf+\xf9\xa76S8\xf7\x10\xe9)\x04\xd8e\xe6\xb5 \x1f\xe8\xce\xd8\x87"\xb6\xe4\x8c\xfd\xec~//\x8b\xc1\x9b\x8a\ xe7\xcd7\xc3\xf24\x01\xf7\xcf\xa9Q\x93X\x06\x8e[\xba96\xca\x17b\xaf\xe2\x8ea\x10[M%\xe0\x06h@\rN\xb6\xe7 %`\xae\xfbW\xc3\x0e\x05i\xbd\xed\x96l/U\x01\xe4\xbbPJ\x96\xad\xb6\x0b\x87*\x0ct\xc2$'

我应该如何使用带有这些 base64 字节的 rsa?我试图用 base64 解码它,它给了我: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdc in position 0: invalid continuation byte.

也转换它不会给我一个可读的字符串。有人可以帮我解决这个问题并给我一个线索吗?

def decrypt(fname):
  with open(fname+'.enc', 'rb') as f:
      ct = f.read()

  with open(pkfile, 'rb') as f:
      pk = RSA.importKey(f.read(), 'PEM')

    p,q = fermat(pk) //using fermat factorization to get p and q
    b = ct.decode("utf-8")

【问题讨论】:

【参考方案1】:

bytes.decode 不用于加密,它只是将字节转换为字符串对象。请参阅https://docs.python.org/3/library/stdtypes.html#bytes 了解更多信息。

你必须计算e mod n的倒数,然后你可以使用:

private_key = RSA.construct((n, e, d))
dsmg = private_key.decrypt(msg)

【讨论】:

有没有办法不用私钥来解密这个?

以上是关于不使用密钥的 RSA 解密的主要内容,如果未能解决你的问题,请参考以下文章

RSA解密密钥

Java使用非对称数据加密RSA加密解密

python中的RSA加密与解密

Python使用rsa模块实现非对称加密与解密

Android使用RSA加密和解密

如何使用SunMSCAPI密钥解密RSA-OAEP