我的问题是: “假设您的RSA公钥因子为p = 6323和q = 2833,并且 公共指数e是31。假设您收到的密码文本为6627708。编写一个程序,将上述参数作为输入并实现RSA Decryption函数以恢复纯文本。”
当尝试解密密文时,我收到错误消息:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-30-bb484f24f99a> in <module>
----> 1 cipher.decrypt((str(ciphertext)))
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Crypto/Cipher/PKCS1_OAEP.py in decrypt(self, ciphertext)
165 # Step 1b and 1c
166 if len(ciphertext) != k or k<hLen+2:
--> 167 raise ValueError("Ciphertext with incorrect length.")
168 # Step 2a (O2SIP)
169 ct_int = bytes_to_long(ciphertext)
ValueError: Ciphertext with incorrect length.
我的代码当前如下所示:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
n = 17913059
e = 31
p = 6323
q = 2833
d = 13861087
ciphertext = 6627708
key = RSA.construct(rsa_components=(n,e,d,p,q))
cipher = PKCS1_OAEP.new(key)
cipher.decrypt((str(ciphertext)))
我想知道的是,如果我走在正确的轨道上,还是完全脱离轨道。我不太确定如何解决长度错误。我当时想也许我需要像在AES中那样填充,但是我不太确定。预先感谢您的帮助!
答案 0 :(得分:1)
如果您有c
,d
和n
,则可以使用RSA formula来获取密文:
>>> pow(ciphertext, d, n)
205
这似乎是格式错误的消息(它们通常是十六进制或ASCII值),因此这可能只是一个示例问题。
您的问题来自pycryptodome's implementation的RFC 7.1.2,其中指出:
C:要解密的密文,长度为k的八位字节串,其中k = 2hLen + 2
其中:
hLen表示哈希函数输出的八位字节长度
因此,从技术上讲,您的密文太短而无法被RSA解密。
答案 1 :(得分:0)
此代码应为您提供帮助:
p = 6323
q = 2833
n = p * q
d = 13861087
e = 31
c = 6627708
plaintext = pow(c, d, n)
这是您解密邮件的最简单方法,请参阅Wikipedia's RSA page,了解其工作原理。
另请参阅@rassars答案,该方法可以解决问题。
@Dylaloo问题出在Fcrypt或RFC之一(我记不清了,它链接在pycryptodome的RSA源代码中(碰巧是纯python)),而pycryptodome紧随其后。请参阅我的答案以了解如何解密密文