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

