Python生成的RSA公钥无法导入C#:ASN1数据损坏异常
Python Crypto生成的RSA公钥无法被.NET Core 6读取的解决方案
问题根源
你遇到的AsnContentException错误,本质是Python端导出的公钥格式和.NET端预期的格式不匹配:
Python的Crypto.PublicKey.RSA模块中,exportKey()方法默认导出PEM格式的公钥(包含-----BEGIN PUBLIC KEY-----这类头部尾部文本)。直接对这个PEM字符串做Base64编码后,传给.NET时,解码得到的是带文本头部的字节数据,而非.NET要求的纯ASN.1 DER编码二进制数据。这就导致.NET解析ASN.1结构时,识别到错误的标签类型(错误信息里的Universal 13对应UTF8String,而预期的Universal 16是ASN.1 Sequence结构)。
修正Python端代码
需要明确指定exportKey()导出DER格式的公钥结构,根据.NET要使用的导入方法,分两种情况:
情况1:对应.NET的ImportSubjectPublicKeyInfo
导出标准的SubjectPublicKeyInfo结构(PKCS#8格式的公钥):
from Crypto.PublicKey import RSA import base64 key = RSA.generate(2048) # 导出DER编码的SubjectPublicKeyInfo结构 public_key_der = key.publickey().exportKey(format='DER', pkcs=8) public_key = base64.b64encode(public_key_der).decode('utf8')
情况2:对应.NET的ImportRSAPublicKey
导出裸RSA公钥结构(PKCS#1格式):
from Crypto.PublicKey import RSA import base64 key = RSA.generate(2048) # 导出DER编码的裸RSA公钥结构 public_key_der = key.publickey().exportKey(format='DER', pkcs=1) public_key = base64.b64encode(public_key_der).decode('utf8')
对应的.NET Core代码
根据Python端导出的格式,选择对应的导入方法:
对应SubjectPublicKeyInfo的导入
byte[] publicKeyBytes = Convert.FromBase64String(base64PublicKey); RSA rsa = RSA.Create(); rsa.ImportSubjectPublicKeyInfo(publicKeyBytes, out int bytesRead);
对应裸RSA公钥的导入
byte[] publicKeyBytes = Convert.FromBase64String(base64PublicKey); RSA rsa = RSA.Create(); rsa.ImportRSAPublicKey(publicKeyBytes, out int bytesRead);
内容的提问来源于stack exchange,提问作者jwatts1980
相关产品推荐
相关产品推荐

