/// <summary>读取PEM文件到RSA参数</summary> /// <param name="content"></param> /// <returns></returns> public static RSAParameters ReadPem(String content) { if (String.IsNullOrEmpty(content)) { throw new ArgumentNullException(nameof(content)); } // 公钥私钥分别处理 content = content.Trim(); if (content.StartsWithIgnoreCase("-----BEGIN RSA PRIVATE KEY-----", "-----BEGIN PRIVATE KEY-----")) { var content2 = content.TrimStart("-----BEGIN RSA PRIVATE KEY-----") .TrimEnd("-----END RSA PRIVATE KEY-----") .TrimStart("-----BEGIN PRIVATE KEY-----") .TrimEnd("-----END PRIVATE KEY-----") .Replace("\n", null).Replace("\r", null); var data = Convert.FromBase64String(content2); // PrivateKeyInfo: version + Algorithm(algorithm + parameters) + privateKey var asn = Asn1Util.Read(data); var keys = asn.Value as Asn1Util[]; // 可能直接key,也可能有Oid包装 var oids = asn.GetOids(); if (oids.Any(e => e.FriendlyName == "RSA")) { keys = Asn1Util.Read(keys[2].Value as Byte[]).Value as Asn1Util[]; } // 参数数据 return(new RSAParameters { Modulus = keys[1].GetByteArray(true), Exponent = keys[2].GetByteArray(false), D = keys[3].GetByteArray(true), P = keys[4].GetByteArray(true), Q = keys[5].GetByteArray(true), DP = keys[6].GetByteArray(true), DQ = keys[7].GetByteArray(true), InverseQ = keys[8].GetByteArray(true) }); } else { content = content.Replace("-----BEGIN PUBLIC KEY-----", null) .Replace("-----END PUBLIC KEY-----", null) .Replace("\n", null).Replace("\r", null); var data = Convert.FromBase64String(content); var asn = Asn1Util.Read(data); var keys = asn.Value as Asn1Util[]; // 可能直接key,也可能有Oid包装 var oids = asn.GetOids(); if (oids.Any(e => e.FriendlyName == "RSA")) { keys = Asn1Util.Read(keys.FirstOrDefault(e => e.Tag == Asn1Tags.BitString).Value as Byte[]).Value as Asn1Util[]; } // 参数数据 return(new RSAParameters { Modulus = keys[0].GetByteArray(true), Exponent = keys[1].GetByteArray(false), }); } }
/// <summary>读取对象</summary> /// <param name="reader"></param> /// <returns></returns> public static Asn1Util Read(BinaryReader reader) { var len = ReadTLV(reader, out var tag); if (len < 0) { return(null); } var asn = new Asn1Util { Length = len }; var tagNo = tag & 0x1F; //if (tagNo == 0x1F) tagNo = reader.BaseStream.ReadEncodedInt(); // isConstructed asn.Tag = (Asn1Tags)tagNo; if ((tag & (Byte)Asn1Tags.Constructed) != 0) { switch (asn.Tag) { case Asn1Tags.OctetString: break; case Asn1Tags.External: break; case Asn1Tags.Sequence: var reader2 = new BinaryReader(new MemoryStream(reader.ReadBytes(len))); var list = new List <Asn1Util>(); while (true) { var obj = Read(reader2); if (obj == null) { break; } list.Add(obj); } asn.Value = list.ToArray(); return(asn); case Asn1Tags.Set: break; } } // 基础类型 var buf = reader.ReadBytes(len); asn.Value = buf; switch (asn.Tag) { case Asn1Tags.Boolean: break; case Asn1Tags.Integer: asn.Value = buf; break; case Asn1Tags.BitString: if (buf.Length > 0 && buf[0] == 0) { buf = buf.ReadBytes(1); } asn.Value = buf; break; case Asn1Tags.OctetString: asn.Value = buf; break; case Asn1Tags.Null: break; case Asn1Tags.ObjectIdentifier: //asn.Value = reader.ReadBytes(len); asn.Value = new Oid(MakeOidStringFromBytes(buf)); break; case Asn1Tags.External: break; case Asn1Tags.Enumerated: break; //case Asn1Tags.Sequence: // break; //case Asn1Tags.SequenceOf: // break; case Asn1Tags.Set: break; //case Asn1Tags.SetOf: // break; case Asn1Tags.NumericString: break; case Asn1Tags.PrintableString: break; case Asn1Tags.T61String: break; case Asn1Tags.VideotexString: break; case Asn1Tags.IA5String: break; case Asn1Tags.UtcTime: break; case Asn1Tags.GeneralizedTime: break; case Asn1Tags.GraphicString: break; case Asn1Tags.VisibleString: break; case Asn1Tags.GeneralString: break; case Asn1Tags.UniversalString: break; case Asn1Tags.BmpString: break; case Asn1Tags.Utf8String: break; case Asn1Tags.Constructed: break; case Asn1Tags.Application: break; case Asn1Tags.Tagged: break; default: break; } return(asn); }