Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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),
                });
            }
        }