使用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
相关产品推荐
相关产品推荐

