从RSACryptoServiceProvider导出私钥后调用AsnReader.ReadInteger报错如何解决
错误原因
你报错的核心原因是对PKCS#1 RSAPrivateKey的ASN.1结构层级理解有误:
- 你拿到的导出内容的最外层ASN.1节点是
SEQUENCE类型(对应Universal类值16),而你直接调用ReadInteger()方法期望读取INTEGER类型(对应Universal类值2),节点类型不匹配因此抛出异常。
PKCS#1定义的RSAPrivateKey结构层级如下:
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }
修正后的代码
你需要先读取最外层的SEQUENCE节点,再从内部读取对应的整数字段:
using (var rsa = new RSACryptoServiceProvider(1024)) { var priv = rsa.ExportRSAPrivateKey(); var asnr = new AsnReader(priv, AsnEncodingRules.DER); // 先读取最外层SEQUENCE var seqReader = asnr.ReadSequence(); // 读取版本字段 var version = seqReader.ReadInteger(); // 再读取模数N var N = seqReader.ReadInteger(); }
内容的提问来源于stack exchange,提问作者bazzilic
相关产品推荐
相关产品推荐

