Esempio n. 1
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  = 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),
                });
            }
        }
Esempio n. 2
0
        /// <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);
        }