You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:39:02