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

使用Cryptodomex库导入RSA公钥时遇ValueError:密钥格式不支持

问题原因及解决方案

你的核心问题在于:RSA公钥有严格的ASN.1 DER格式规范,不是随便把文本套上PEM头/尾就能当作合法公钥。你用'PUBPUB'这类自定义字符串生成的PEM内容,本质上只是被包装了公钥格式的普通文本,完全不具备RSA公钥的结构,所以RSA.import_key会报错格式不支持,加空格延长长度也没用——长度够了但结构不对。

正确做法分两种场景:

场景1:生成合法的RSA公钥

如果你的需求是生成一个标准的RSA公钥对,然后导出PEM格式,代码应该这么写:

from Crypto.PublicKey import RSA
from Crypto.IO import PEM

# 生成2048位RSA密钥对
key_pair = RSA.generate(2048)
# 导出公钥的DER编码数据(符合ASN.1规范)
public_key_der = key_pair.publickey().export_key(format='DER')
# 包装成PEM格式
public_key_pem = PEM.encode(public_key_der, 'PUBLIC KEY')

print(public_key_pem)
# 此时可以正常导入
rsa_key = RSA.import_key(public_key_pem)

场景2:用RSA公钥加密自定义文本

如果你的真实需求是把用户输入的文本(比如'PUBPUB')用RSA公钥加密,而不是把文本当作公钥,代码应该是这样:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64

# 先生成或导入合法的RSA公钥
key_pair = RSA.generate(2048)
public_key = key_pair.publickey()

# 要加密的自定义文本
text_to_encrypt = 'PUBPUB'
# 初始化加密器
cipher = PKCS1_OAEP.new(public_key)
# 加密文本(需要转成字节)
encrypted_data = cipher.encrypt(text_to_encrypt.encode())
# 转成base64方便存储/传输
encrypted_base64 = base64.b64encode(encrypted_data).decode()

print(encrypted_base64)

错误代码问题解析

你调用PEM.encode(public_key.encode(), 'PUBLIC KEY')时,传入的public_key.encode()是普通字符串的字节,不是RSA公钥的DER编码数据。PEM只是把原始二进制数据编码成带头/尾的文本格式,它不会帮你把普通文本转换成合法的公钥结构。所以最终生成的PEM内容完全不符合RSA公钥的格式要求,自然无法被RSA.import_key解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:55:01