public static RSAParameters ReadRSAPrivateKey(Stream s)
        {
            using (StreamReader sR = new StreamReader(s))
            {
                if (sR.ReadLine() != "-----BEGIN RSA PRIVATE KEY-----")
                {
                    throw new IOException("The data should begin with header: -----BEGIN RSA PRIVATE KEY-----");
                }

                StringBuilder base64Data = new StringBuilder(2048);

                do
                {
                    string line = sR.ReadLine();

                    if (line == "-----END RSA PRIVATE KEY-----")
                    {
                        break;
                    }

                    base64Data.Append(line);
                }while (true);

                DEREncoding obj = DEREncoding.Decode(Convert.FromBase64String(base64Data.ToString()));

                using (Stream sV = obj.GetValueStream())
                {
                    DEREncoding objVer = DEREncoding.Decode(sV);

                    if (objVer.Value[0] != 0)
                    {
                        throw new IOException("Unknown version number for RSA private key data.");
                    }

                    DEREncoding objModulus  = DEREncoding.Decode(sV);
                    DEREncoding objExponent = DEREncoding.Decode(sV);
                    DEREncoding objD        = DEREncoding.Decode(sV);
                    DEREncoding objP        = DEREncoding.Decode(sV);
                    DEREncoding objQ        = DEREncoding.Decode(sV);
                    DEREncoding objDP       = DEREncoding.Decode(sV);
                    DEREncoding objDQ       = DEREncoding.Decode(sV);
                    DEREncoding objInverseQ = DEREncoding.Decode(sV);

                    RSAParameters parameters = new RSAParameters();

                    parameters.Modulus  = objModulus.GetIntegerValue();
                    parameters.Exponent = objExponent.GetIntegerValue();
                    parameters.D        = objD.GetIntegerValue();
                    parameters.P        = objP.GetIntegerValue();
                    parameters.Q        = objQ.GetIntegerValue();
                    parameters.DP       = objDP.GetIntegerValue();
                    parameters.DQ       = objDQ.GetIntegerValue();
                    parameters.InverseQ = objInverseQ.GetIntegerValue();

                    return(parameters);
                }
            }
        }
        public static RSAParameters DecodeRSAPublicKey(Stream s)
        {
            DEREncoding seq = Decode(s);

            using (Stream seqStream = seq.GetValueStream())
            {
                DEREncoding objModulus  = Decode(seqStream);
                DEREncoding objExponent = Decode(seqStream);

                RSAParameters parameters = new RSAParameters();

                parameters.Modulus  = objModulus.GetIntegerValue();
                parameters.Exponent = objExponent.GetIntegerValue();

                return(parameters);
            }
        }
        public static RSAParameters DecodeRSAPrivateKey(Stream s)
        {
            DEREncoding seq = Decode(s);

            using (Stream seqStream = seq.GetValueStream())
            {
                DEREncoding objVer = Decode(seqStream);

                if (objVer.Value[0] != 0)
                {
                    throw new IOException("Unknown version number for RSA private key data.");
                }

                DEREncoding objModulus  = Decode(seqStream);
                DEREncoding objExponent = Decode(seqStream);
                DEREncoding objD        = Decode(seqStream);
                DEREncoding objP        = Decode(seqStream);
                DEREncoding objQ        = Decode(seqStream);
                DEREncoding objDP       = Decode(seqStream);
                DEREncoding objDQ       = Decode(seqStream);
                DEREncoding objInverseQ = Decode(seqStream);

                RSAParameters parameters = new RSAParameters();

                parameters.Modulus  = objModulus.GetIntegerValue();
                parameters.Exponent = objExponent.GetIntegerValue();
                parameters.D        = objD.GetIntegerValue();
                parameters.P        = objP.GetIntegerValue();
                parameters.Q        = objQ.GetIntegerValue();
                parameters.DP       = objDP.GetIntegerValue();
                parameters.DQ       = objDQ.GetIntegerValue();
                parameters.InverseQ = objInverseQ.GetIntegerValue();

                return(parameters);
            }
        }