.net core to achieve RSA encryption and decryption

Today, when used in the call Hui Tong parking RSA interface is a two-way encryption technology but the interface documentation provided to me is java RSA encryption public key, but needs to be converted to .net publicKey XML format and then converted a pass, and finally turn into a success standard XML sigh of relief, but found when debugging I am using the .net core Niubi it does not support FromXmlString

Here is a summary of a suitable .net core of the RSA encryption code that goes to

#region RSAhelper
         public  class RSAHelper 
        { 
            Private  Readonly the RSA _privateKeyRsaProvider;
             Private  Readonly the RSA _publicKeyRsaProvider;
             Private  Readonly HashAlgorithmName _hashAlgorithmName;
             Private  Readonly Encoding _encoding; 

            ///  <Summary> 
            /// instantiation RSAHelper
             ///  </ Summary> 
            ///  < param name = "rsaType"> type of encryption algorithm RSA SHA1; RSA2 SHA256 key length of at least 2048 </ param> 
            ///  <param name = "encoding"> coding type </ param>
            /// <param name="privateKey">私钥</param>
            /// <param name="publicKey">公钥</param>
            public RSAHelper(RSAType rsaType, Encoding encoding, string privateKey, string publicKey = null)
            {
                _encoding = encoding;
                if (!string.IsNullOrEmpty(privateKey))
                {
                    _privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey);
                }

                if (!string.IsNullOrEmpty (publicKey)) 
                { 
                    _publicKeyRsaProvider = CreateRsaProviderFromPublicKey (publicKey); 
                } 

                _hashAlgorithmName = rsaType == RSAType.RSA? HashAlgorithmName.SHA1: HashAlgorithmName.SHA256; 
            } 

            #region using a private signature /// <Summary> /// using private key signature
             /// </ Summary> /// <param name = "data"> raw data </ param> /// <Returns> </ Returns> public String Sign ( String data) 
            { byte

             
             
             
             
             
                [] = Databytes _encoding.GetBytes (Data); 

                var signatureBytes = _privateKeyRsaProvider.SignData (databytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1); 

                return Convert.ToBase64String (signatureBytes); 
            } 

            #endregion 

            #region use the public key to verify the signature /// <Summary > /// using the public key to verify the signature
             /// </ Summary> /// <param name = "data"> raw data </ param> /// <param name = "Sign"> signature </ param> / // <Returns> </ Returns> public BOOL the Verify ( String Data,string

             
             
             
             
             
              sign)
            {
                byte[] dataBytes = _encoding.GetBytes(data);
                byte[] signBytes = Convert.FromBase64String(sign);

                var verify = _publicKeyRsaProvider.VerifyData(dataBytes, signBytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1);

                return verify;
            }

            #endregion

            #region 解密

            public string Decrypt(string cipherText)
            {
                if (_privateKeyRsaProvider == null)
                {
                    throw new Exception("_privateKeyRsaProvider is null");
                }
                return Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
            }

            #endregion

            #region 加密

            public string Encrypt(string text)
            {
                if (_publicKeyRsaProvider == null)
                {
                    throw new Exception("_publicKeyRsaProvider is null");
                }
                return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
            }

            #endregion

            #region 使用私钥创建RSA实例

            public RSA CreateRsaProviderFromPrivateKey(string privateKey)
            {
                var privateKeyBits = Convert.FromBase64String(privateKey);

                var rsa = RSA.Create();
                var rsaParameters = new RSAParameters();

                using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits)))
                {
                    byte bt = 0;
                    ushort twobytes = 0;
                    twobytes = binr.ReadUInt16();
                    if (twobytes == 0x8130)
                        binr.ReadByte();
                    else if (twobytes == 0x8230)
                        binr.ReadInt16();
                    else
                        throw new Exception("Unexpected value read binr.ReadUInt16()");

                    twobytes = binr.ReadUInt16();
                    if (twobytes != 0x0102)
                        throw new Exception("Unexpected version");

                    bt = binr.ReadByte();
                    if (bt != 0x00)
                        throw new Exception("Unexpected value read binr.ReadByte()");

                    rsaParameters.Modulus = binr.ReadBytes(GetIntegerSize(binr));
                    rsaParameters.Exponent = binr.ReadBytes(GetIntegerSize(binr));
                    rsaParameters.D =binr.ReadBytes (GetIntegerSize (binr)); 
                    rsaParameters.P = binr.ReadBytes (GetIntegerSize (binr)); 
                    rsaParameters.Q = binr.ReadBytes (GetIntegerSize (binr)); 
                    rsaParameters.DP = binr.ReadBytes (GetIntegerSize (binr)); 
                    rsaParameters.DQ = binr.ReadBytes (GetIntegerSize (binr)); 
                    rsaParameters.InverseQ = binr.ReadBytes (GetIntegerSize (binr)); 
                } 

                Rsa.ImportParameters (rsaParameters); 
                return rsa; 
            } 

            #Endregion 

            #region 使用公钥创建RSA实例

            public RSA CreateRsaProviderFromPublicKey(string publicKeyString)
            {
                // encoded OID sequence for  PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
                byte[] seqOid = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };
                byte[] seq = new byte[15];

                var x509Key = Convert.FromBase64String(publicKeyString);

                // ---------  Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob  ------
                using (MemoryStream mem = new MemoryStream(x509Key))
                {
                    using (BinaryReader binr = new BinaryReader(mem))  //wrap Memory Stream with BinaryReader for easy reading
                    {
                        byte bt = 0;
                        ushort twobytes = 0;

                        twobytes = binr.ReadUInt16();
                        if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
                            binr.ReadByte();    //advance 1 byte
                        else if (twobytes == 0x8230)
                            binr.ReadInt16();   //advance 2 bytes
                        else
                            return null;

                        seq = binr.ReadBytes(15);       //read the Sequence OID
                        if (!CompareBytearrays(seq, seqOid))    //make sure Sequence for OID is correct
                            return null;

                        twobytes = binr.ReadUInt16();
                        if (twobytes == 0x8103) //data read as little endian order (actual data order for Bit String is 03 81)
                            binr.ReadByte();    //advance 1 byte
                        else if (twobytes == 0x8203)
                            binr.ReadInt16();   //advance 2 bytes
                        else
                            return null;

                        bt = binr.ReadByte();
                        if (bt != 0x00)     //expect null byte next
                            return null;

                        twobytes = binr.ReadUInt16();
                        if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
                            binr.ReadByte();    //advance 1 byte
                        else if (twobytes == 0x8230)
                            binr.ReadInt16();   //advance 2 bytes
                        else
                            return null;

                        twobytes = binr.ReadUInt16();
                        byte lowbyte = 0x00;
                        byte highbyte = 0x00;

                        if (twobytes == 0x8102) //data read as little endian order (actual data order for Integer is 02 81)
                            lowbyte = binr.ReadByte();  // read next bytes which is bytes in modulus
                        else if (twobytes == 0x8202)
                        {
                            highbyte = binr.ReadByte(); //advance 2 bytes
                            lowbyte = binr.ReadByte();
                        }
                        else
                            return null;
                        byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };   //reverse byte order since asn.1 key uses big endian order
                        int modsize = BitConverter.ToInt32(modint, 0);

                        int firstbyte = binr.PeekChar();
                        if (firstbyte == 0x00)
                        {   //if first byte (highest order) of modulus is zero, don't include it
                            binr.ReadByte();    //skip this null byte
                            modsize -= 1;   //reduce modulus buffer size by 1
                        }

                        byte[] modulus = binr.ReadBytes(modsize);   //read the modulus bytes

                        if (binr.ReadByte() != 0x02)            //expect an Integer for the exponent data
                            return null;
                        int expbytes = (int)binr.ReadByte();        // should only need one byte for actual exponent data (for all useful values)
                        byte[] exponent = binr.ReadBytes(expbytes);

                        // ------- create RSACryptoServiceProvider instance and initialize with public key -----
                        var rsa = RSA.Create();
                        RSAParameters rsaKeyInfo = new RSAParameters
                        {
                            Modulus = modulus,
                            Exponent = exponent
                        };
                        rsa.ImportParameters(rsaKeyInfo);

                        return rsa;
                    } 

                } 
            } 

            #Endregion 

            #region import key algorithm Private int GetIntegerSize (the BinaryReader binR) 
            { byte BT = 0 ;
                 int COUNT = 0 ; 
                BT = binr.ReadByte ();
                 IF (BT =! 0x02 )
                     return 0 ; 
                BT = binR .ReadByte (); IF (BT == 0x81 ) 
                    COUNT =

             
                 

                 binr.ReadByte();
                else
                if (bt == 0x82)
                {
                    var highbyte = binr.ReadByte();
                    var lowbyte = binr.ReadByte();
                    byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
                    count = BitConverter.ToInt32(modint, 0);
                }
                else
                {
                    count = bt;
                }

                while (binr.ReadByte() == 0x00)
                {
                    count -= 1;
                }
                binr.BaseStream.Seek(-1, SeekOrigin.Current);
                return count;
            }

            private bool CompareBytearrays(byte[] a, byte[] b)
            {
                if (a.Length != b.Length)
                    return false;
                int i = 0;
                foreach (byte c in a)
                {
                    IF (= C! B [I])
                         return  to false ; 
                    I ++ ; 
                } 
                return  to true ; 
            } 

            #endregion 

        } 

        ///  <Summary> 
        /// the RSA algorithm type
         ///  </ Summary> 
        public  enum RSAType 
        { 
            // /  <Summary> 
            /// SHAl
             ///  </ Summary> 
            the RSA = 0 ,
             ///  <Summary> 
            ///RSA2 key length of at least 2048
             /// the SHA256
             ///  </ Summary> 
            RSA2 
        } 
        #endregion

Called goes to

Ah so the

Guess you like

Origin www.cnblogs.com/dujian123/p/11592455.html