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

使用Python进行RSA解密报错:ValueError: 密文长度必须等于密钥长度

RSA OAEP解密报错解决:ValueError: Ciphertext length must be equal to key size.

问题场景

手里有字符串格式的RSA私钥,以及一段用Cipher.getInstance("RSA/ECB/OAEPWITHSHA-512ANDMGF1PADDING")加密的密文字符串,用以下Python代码解密时触发错误:ValueError: Ciphertext length must be equal to key size.

原代码:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes

encrypted_message = 'MTEyMw=='
private_key_str = """-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA4v3 ...L8Q9xNBVn9XJ5 -----END RSA PRIVATE KEY-----"""

private_key = serialization.load_pem_private_key(
    private_key_str.encode(),
    password=None,
    backend=default_backend()
)

decrypted = private_key.decrypt(
    encrypted_message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(decrypted.decode())

错误原因及修复步骤

  • 密文未做Base64解码:加密后的密文通常会做Base64编码传输,直接把Base64字符串传给decrypt方法,而非解码后的字节数据,会导致长度完全不符合密钥要求。
    修复:用base64.b64decode解码密文。

  • OAEP参数不匹配:加密时用的是OAEPWITHSHA-512ANDMGF1PADDING,但代码里的OAEP配置用的是SHA256,哈希算法不匹配会触发解密失败,甚至提前引发长度校验错误。
    修复:把OAEP的哈希算法和MGF1的哈希算法都改成SHA-512。

  • 私钥格式无效:私钥字符串内容挤在一行(比如-----BEGIN RSA PRIVATE KEY-----和密钥内容连在一起),不符合PEM格式要求,可能导致加载的密钥异常,间接引发长度校验错误。
    修复:确保私钥PEM格式正确,各部分换行分隔,示例:

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEA4v3 ...
    ... L8Q9xNBVn9XJ5
    -----END RSA PRIVATE KEY-----
    

修正后的代码

import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes

encrypted_message = 'MTEyMw=='
# 修正后的私钥格式,确保换行正确
private_key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4v3 ...L8Q9xNBVn9XJ5
-----END RSA PRIVATE KEY-----"""

# 加载私钥
private_key = serialization.load_pem_private_key(
    private_key_str.encode(),
    password=None,
    backend=default_backend()
)

# 解码Base64密文
encrypted_bytes = base64.b64decode(encrypted_message)

# 用匹配的OAEP参数解密
decrypted = private_key.decrypt(
    encrypted_bytes,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA512()),
        algorithm=hashes.SHA512(),
        label=None
    )
)

print(decrypted.decode())

内容的提问来源于stack exchange,提问作者Vasu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:22:53