/// <summary>读取PEM文件到RSA参数</summary> /// <param name="content"></param> /// <returns></returns> public static ECKey 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 = Asn1.Read(data); var keys = asn.Value as Asn1[]; // Algorithm(algorithm + parameters) var oids = asn.GetOids(); var algorithm = oids[0]; var parameters = oids[1]; if (algorithm.FriendlyName != "ECC") { throw new InvalidDataException($"Invalid key {algorithm}"); } keys = Asn1.Read(keys[2].Value as Byte[]).Value as Asn1[]; // 里面是一个字节前缀,后面X+Y var k2 = Asn1.Read(keys[2].Value as Byte[]).Value as Byte[]; var len = (k2.Length - 1) / 2; // 参数 var ek = new ECKey { D = keys[1].Value as Byte[], X = k2.ReadBytes(1, len), Y = k2.ReadBytes(1 + len, len), }; ek.SetAlgorithm(parameters, true); return(ek); } 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 = Asn1.Read(data); var keys = asn.Value as Asn1[]; // Algorithm(algorithm + parameters) var oids = asn.GetOids(); var algorithm = oids[0]; var parameters = oids[1]; if (algorithm.FriendlyName != "ECC") { throw new InvalidDataException($"Invalid key {algorithm}"); } // 里面是一个字节前缀,后面X+Y var k2 = keys[1].Value as Byte[]; var len = (k2.Length - 1) / 2; // 参数 var ek = new ECKey { X = k2.ReadBytes(1, len), Y = k2.ReadBytes(1 + len, len), }; ek.SetAlgorithm(parameters, false); return(ek); } }
/// <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 = Asn1.Read(data); var keys = asn.Value as Asn1[]; // 可能直接key,也可能有Oid包装 var oids = asn.GetOids(); if (oids.Any(e => e.FriendlyName == "RSA")) { keys = Asn1.Read(keys[2].Value as Byte[]).Value as Asn1[]; } // 参数数据 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 = Asn1.Read(data); var keys = asn.Value as Asn1[]; // 可能直接key,也可能有Oid包装 var oids = asn.GetOids(); if (oids.Any(e => e.FriendlyName == "RSA")) { keys = Asn1.Read(keys.FirstOrDefault(e => e.Tag == Asn1Tags.BitString).Value as Byte[]).Value as Asn1[]; } // 参数数据 return(new RSAParameters { Modulus = keys[0].GetByteArray(true), Exponent = keys[1].GetByteArray(false), }); } }