Python实现RSA加解密触发ValueError: Ciphertext with incorrect length求助
问题原因
你报错的核心原因是加密流程和解密流程的字节处理不对等:
- 加密时你调用了
binascii.hexlify()将原生128字节的RSA密文转换成了256字节的十六进制编码字节串 - 解密时你直接把256字节的十六进制串传给了解密接口,而1024位RSA的PKCS1_OAEP解密要求输入密文长度必须为128字节,因此触发长度不匹配错误。
修复方案
只需要在解密逻辑中,先把十六进制编码的密文转换回原生二进制密文即可,对应修改decrypt函数,增加一行binascii.unhexlify()的逆处理即可。
修改后的完整代码
from Crypto.PublicKey import RSA as rsa from Crypto.Cipher import PKCS1_OAEP import binascii def encrypt(message, pukey): pukey = rsa.import_key(pukey) encryptor = PKCS1_OAEP.new(pukey) encmessage = encryptor.encrypt(message) encmessage = binascii.hexlify(encmessage) return encmessage def decrypt(message, prkey): prkey = rsa.import_key(prkey) decryptor = PKCS1_OAEP.new(prkey) # 新增:把十六进制编码的密文转回原生二进制密文 message = binascii.unhexlify(message) decmessage = decryptor.decrypt(message) return decmessage def main(): keypair = rsa.generate(1024) with open('abcd.txt', 'r', encoding='utf-8') as f: mes = f.read().encode('utf-8') pukey = keypair.publickey().exportKey() prkey = keypair.exportKey() enc = encrypt(mes, pukey) print("加密后的十六进制密文:", enc) dec = decrypt(enc, prkey) print("解密后的原始内容:", dec.decode('utf-8')) input('') if __name__ == '__main__': main()
补充注意事项
- 1024位RSA的加密长度有限,使用PKCS1_OAEP填充时最大仅支持加密86字节的明文,如果需要加密更长的文本,建议使用混合加密方案:用AES加密大体积文本,再用RSA加密AES的密钥。
- 代码中额外补充了编码格式指定,避免不同系统默认编码不一致导致的读取文件乱码问题。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

