示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="privateKeyBytes"></param>
        /// <returns></returns>
        private static RSACryptoServiceProvider DecodeRsaPrivateKey(byte[] privateKeyBytes)
        {
            RSACryptoServiceProvider provider2;
            MemoryStream             input = new MemoryStream(privateKeyBytes);
            BinaryReader             rd    = new BinaryReader(input);

            try
            {
                switch (rd.ReadUInt16())
                {
                case 0x8130:
                    rd.ReadByte();
                    break;

                case 0x8230:
                    rd.ReadInt16();
                    break;

                default:
                    return(null);
                }
                if (rd.ReadUInt16() != 0x102)
                {
                    return(null);
                }
                if (rd.ReadByte() > 0)
                {
                    return(null);
                }

                CspParameters parameters = new CspParameters();
                parameters.Flags            = CspProviderFlags.NoFlags;
                parameters.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
                parameters.ProviderType     = ((Environment.OSVersion.Version.Major > 5) || ((Environment.OSVersion.Version.Major == 5) && (Environment.OSVersion.Version.Minor >= 1))) ? 0x18 : 1;

                RSAParameters parameters2 = new RSAParameters();
                parameters2.Modulus = rd.ReadBytes(Helpers.DecodeIntegerSize(rd));

                RSAParameterTraits traits = new RSAParameterTraits(parameters2.Modulus.Length * 8);
                parameters2.Modulus  = Helpers.AlignBytes(parameters2.Modulus, traits.size_Mod);
                parameters2.Exponent = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_Exp);
                parameters2.D        = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_D);
                parameters2.P        = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_P);
                parameters2.Q        = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_Q);
                parameters2.DP       = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_DP);
                parameters2.DQ       = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_DQ);
                parameters2.InverseQ = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_InvQ);

                RSACryptoServiceProvider provider = new RSACryptoServiceProvider(parameters);
                provider.ImportParameters(parameters2);
                provider2 = provider;
            }
            catch (Exception ex)
            {
                provider2 = null;
            }
            finally
            {
                rd.Close();
            }
            return(provider2);
        }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="publicKeyBytes"></param>
        /// <returns></returns>
        private static RSACryptoServiceProvider DecodePublicKey(byte[] publicKeyBytes)
        {
            RSACryptoServiceProvider provider2;
            MemoryStream             input = new MemoryStream(publicKeyBytes);
            BinaryReader             rd    = new BinaryReader(input);

            byte[] b       = new byte[] { 0x30, 13, 6, 9, 0x2a, 0x86, 0x48, 0x86, 0xf7, 13, 1, 1, 1, 5, 0 };
            byte[] buffer2 = new byte[15];
            try
            {
                switch (rd.ReadUInt16())
                {
                case 0x8130:
                    rd.ReadByte();
                    break;

                case 0x8230:
                    rd.ReadInt16();
                    break;

                default:
                    Debug.Assert(false);
                    return(null);
                }
                if (Helpers.CompareBytearrays(rd.ReadBytes(15), b))
                {
                    switch (rd.ReadUInt16())
                    {
                    case 0x8103:
                        rd.ReadByte();
                        goto Label_00CF;

                    case 0x8203:
                        rd.ReadInt16();
                        goto Label_00CF;
                    }
                }
                return(null);

Label_00CF:
                if (rd.ReadByte() > 0)
                {
                    Debug.Assert(false);
                    return(null);
                }
                ushort num2 = rd.ReadUInt16();
                if (num2 == 0x8130)
                {
                    rd.ReadByte();
                }
                else if (num2 == 0x8230)
                {
                    rd.ReadInt16();
                }
                else
                {
                    return(null);
                }
                CspParameters parameters = new CspParameters();
                parameters.Flags            = CspProviderFlags.NoFlags;
                parameters.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
                parameters.ProviderType     = ((Environment.OSVersion.Version.Major > 5) || ((Environment.OSVersion.Version.Major == 5) && (Environment.OSVersion.Version.Minor >= 1))) ? 0x18 : 1;
                RSACryptoServiceProvider provider    = new RSACryptoServiceProvider(parameters);
                RSAParameters            parameters2 = new RSAParameters();
                parameters2.Modulus = rd.ReadBytes(Helpers.DecodeIntegerSize(rd));
                RSAParameterTraits traits = new RSAParameterTraits(parameters2.Modulus.Length * 8);
                parameters2.Modulus  = Helpers.AlignBytes(parameters2.Modulus, traits.size_Mod);
                parameters2.Exponent = Helpers.AlignBytes(rd.ReadBytes(Helpers.DecodeIntegerSize(rd)), traits.size_Exp);
                provider.ImportParameters(parameters2);
                provider2 = provider;
            }
            catch (Exception)
            {
                Debug.Assert(false);
                provider2 = null;
            }
            finally
            {
                rd.Close();
            }
            return(provider2);
        }