国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#.NET Framework RSA 公鑰加密 私鑰解密 ver:20230609

這篇具有很好參考價值的文章主要介紹了C#.NET Framework RSA 公鑰加密 私鑰解密 ver:20230609。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C#.NET Framework RSA 公鑰加密 私鑰解密 ver:20230609

?

環(huán)境說明:

.NET Framework 4.6 的控制臺程序?。

?

.NET Framework?對于RSA的支持:

1.?.NET Framework 內(nèi)置只支持XML格式的私鑰/公鑰。如果要用PKCS1,PKCS8格式的,要用到三方庫BouncyCastle。

2. .NET 中默認加密算法為“RSA/ECB/PKCS1Padding” ,要和JAVA互通,JAVA 那邊也得是?RSA/ECB/PKCS1Padding 。

?

加密解析:

//假設私鑰長度為1024, 1024/8-11=117。
//如果明文的長度小于117,直接全加密,然后轉base64。(data.Length <= maxBlockSize)
//如果明文長度大于117,則每117分一段加密,寫入到另一個Stream中,最后轉base64。while (blockSize > 0)

?

如果要和其它語言互通,這個分段長度需要和其它語言約定好,不一是 私鑰長度/8-11。

?

解密解析:

//假設私鑰長度為1024, 1024/8 =128。
//如果明文的長度小于 128,直接全解密。(data.Length <= maxBlockSize)
//如果明文長度大于 128,則每 128 分一段解密,寫入到另一個Stream中,最后 GetString。while (blockSize > 0)

?

用“支付寶開放平臺開發(fā)助手”生成一組公私鑰:

PKCS8私鑰:

MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAMz0Czg6QUtTISa2pUkloeQB/TEpHdqrfyroWpKLW9B/LWFSOGH9nyTk1pPZaeadyEZQ6gay/C0pUAetLraq9bMA/Luxq68b87uG7WX7dKytEO2/87qGpGMRs97H+GlkzWil2QO2KK4cHnAcVicPsmi5aZ72U0BWJFyPhtd+qdmrAgMBAAECgYEAvW67iAbgHt0BASVD9C3iSjpEaVHVlC165o/IVzaTcEx8Bz3Ve0zN8W3JnvIO3ebsG4HiLLr2Nk++9rltOc0eNeGMv7F1e/OFot1wN0ON6s1g4bYh1z5Uz8FcYiMWcqHHICrx+oSFeK9x+I2Zge7enQXcsVnqEhm77ZE5YczSryECQQD9nB58e5efYchF+cYbmURioX18cUMuhQbB9Aq2N55cd689Lg35KZqT8JQTp/8tQSdCJG8d2nU8VKspUKTEAuaDAkEAzuKIIoc9PVJvy90LhIPA9c1S8BPCI7EMCaTZqJ5o3VaR2dqvUZDGX7kL3kYkQ+n7mq3KIECvkEFzA+FOP96XuQJBAJQTKHW0T/YeSKoayUHp/lS8R6F2HCy4PRbXn71+wfbpZqcJEd2OHhQM3tiPOV258esbjMlYeSUNppZL4LgVnXMCQQC7Lvs9Ql+GPDAqo7ToEM1lmICR906QPIBHuX+1sJ3wpYMROWumwPa7ZRH36j6ls+6R5OwcgmpWeuE1gYTrBNsBAkEAn2pEtAljX1foQff6CLozYg/J6J9RmVFcJ6qz0LX3052qNFBQYw8CMHB7VkVNzsDIDC8LX5uP2pzTrdPLew+pPA==

與之匹配的 PKCS1 私鑰,用助手轉換的:

MIICXwIBAAKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQABAoGBAL1uu4gG4B7dAQElQ/Qt4ko6RGlR1ZQteuaPyFc2k3BMfAc91XtMzfFtyZ7yDt3m7BuB4iy69jZPvva5bTnNHjXhjL+xdXvzhaLdcDdDjerNYOG2Idc+VM/BXGIjFnKhxyAq8fqEhXivcfiNmYHu3p0F3LFZ6hIZu+2ROWHM0q8hAkEA/ZwefHuXn2HIRfnGG5lEYqF9fHFDLoUGwfQKtjeeXHevPS4N+Smak/CUE6f/LUEnQiRvHdp1PFSrKVCkxALmgwJBAM7iiCKHPT1Sb8vdC4SDwPXNUvATwiOxDAmk2aieaN1Wkdnar1GQxl+5C95GJEPp+5qtyiBAr5BBcwPhTj/el7kCQQCUEyh1tE/2HkiqGslB6f5UvEehdhwsuD0W15+9fsH26WanCRHdjh4UDN7YjzldufHrG4zJWHklDaaWS+C4FZ1zAkEAuy77PUJfhjwwKqO06BDNZZiAkfdOkDyAR7l/tbCd8KWDETlrpsD2u2UR9+o+pbPukeTsHIJqVnrhNYGE6wTbAQJBAJ9qRLQJY19X6EH3+gi6M2IPyeifUZlRXCeqs9C199OdqjRQUGMPAjBwe1ZFTc7AyAwvC1+bj9qc063Ty3sPqTw=

與之匹配的公鑰:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQAB

?

核心重點是拿到 .NET 的RSACryptoServiceProvider 對象。

?

nuget 中引用?Portable.BouncyCastle。

工具類:

RsaUtil 的作用:?將私鑰(PKCS1,PKCS8)、公鑰、私鑰證書、公鑰證書轉為.NET RSACryptoServiceProvider 對象。

using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

namespace CommonUtils
{
    /// <summary>
    /// 將私鑰(PKCS1,PKCS8)、公鑰、私鑰證書、公鑰證書轉為.NET RSACryptoServiceProvider 對象
    /// </summary>
    public static class RsaUtil
    {
        #region 加載私鑰


        /// <summary>
        /// 轉換私鑰字符串為RSACryptoServiceProvider
        /// </summary>
        /// <param name="privateKeyStr">私鑰字符串</param>
        /// <param name="keyFormat">PKCS8,PKCS1</param>
        /// <param name="signType">RSA 私鑰長度1024 ,RSA2 私鑰長度2048</param>
        /// <returns></returns>
        public static RSACryptoServiceProvider LoadPrivateKey(string privateKeyStr, string keyFormat)
        {
            string signType = "RSA";
            if (privateKeyStr.Length > 1024)
            {
                signType = "RSA2";
            }
            //PKCS8,PKCS1
            if (keyFormat == "PKCS1")
            {
                return LoadPrivateKeyPKCS1(privateKeyStr, signType);
            }
            else
            {
                return LoadPrivateKeyPKCS8(privateKeyStr);
            }
        }

        /// <summary>
        /// PKCS1 格式私鑰轉 RSACryptoServiceProvider 對象
        /// </summary>
        /// <param name="strKey">pcsk1 私鑰的文本內(nèi)容</param>
        /// <param name="signType">RSA 私鑰長度1024 ,RSA2 私鑰長度2048 </param>
        /// <returns></returns>
        public static RSACryptoServiceProvider LoadPrivateKeyPKCS1(string privateKeyPemPkcs1, string signType)
        {
            try
            {
                privateKeyPemPkcs1 = privateKeyPemPkcs1.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();
                privateKeyPemPkcs1 = privateKeyPemPkcs1.Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();

                byte[] data = null;
                //讀取帶

                data = Convert.FromBase64String(privateKeyPemPkcs1);


                RSACryptoServiceProvider rsa = DecodeRSAPrivateKey(data, signType);
                return rsa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return null;
        }

        private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey, string signType)
        {
            byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;

            // --------- Set up stream to decode the asn.1 encoded RSA private key ------
            MemoryStream mem = new MemoryStream(privkey);
            BinaryReader binr = new BinaryReader(mem);  //wrap Memory Stream with BinaryReader for easy reading
            byte bt = 0;
            ushort twobytes = 0;
            int elems = 0;
            try
            {
                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();
                if (twobytes != 0x0102) //version number
                    return null;
                bt = binr.ReadByte();
                if (bt != 0x00)
                    return null;


                //------ all private key components are Integer sequences ----
                elems = GetIntegerSize(binr);
                MODULUS = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                E = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                D = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                P = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                Q = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                DP = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                DQ = binr.ReadBytes(elems);

                elems = GetIntegerSize(binr);
                IQ = binr.ReadBytes(elems);


                // ------- create RSACryptoServiceProvider instance and initialize with public key -----
                CspParameters CspParameters = new CspParameters();
                CspParameters.Flags = CspProviderFlags.UseMachineKeyStore;

                int bitLen = 1024;
                if ("RSA2".Equals(signType))
                {
                    bitLen = 2048;
                }

                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(bitLen, CspParameters);
                //RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

                RSAParameters RSAparams = new RSAParameters();
                RSAparams.Modulus = MODULUS;
                RSAparams.Exponent = E;
                RSAparams.D = D;
                RSAparams.P = P;
                RSAparams.Q = Q;
                RSAparams.DP = DP;
                RSAparams.DQ = DQ;
                RSAparams.InverseQ = IQ;
                RSA.ImportParameters(RSAparams);
                return RSA;
            }
            catch (Exception ex)
            {
                throw ex;
                // return null;
            }
            finally
            {
                binr.Close();
            }
        }

        private static int GetIntegerSize(BinaryReader binr)
        {
            byte bt = 0;
            byte lowbyte = 0x00;
            byte highbyte = 0x00;
            int count = 0;
            bt = binr.ReadByte();
            if (bt != 0x02)        //expect integer
                return 0;
            bt = binr.ReadByte();

            if (bt == 0x81)
                count = binr.ReadByte();    // data size in next byte
            else
                if (bt == 0x82)
            {
                highbyte = binr.ReadByte(); // data size in next 2 bytes
                lowbyte = binr.ReadByte();
                byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
                count = BitConverter.ToInt32(modint, 0);
            }
            else
            {
                count = bt;     // we already have the data size
            }

            while (binr.ReadByte() == 0x00)
            {    //remove high order zeros in data
                count -= 1;
            }
            binr.BaseStream.Seek(-1, SeekOrigin.Current);        //last ReadByte wasn't a removed zero, so back up a byte
            return count;
        }

        /// <summary>
        /// PKCS8 文本轉RSACryptoServiceProvider 對象
        /// </summary>
        /// <param name="privateKeyPemPkcs8"></param>
        /// <returns></returns>
        public static RSACryptoServiceProvider LoadPrivateKeyPKCS8(string privateKeyPemPkcs8)
        {

            try
            {
                //PKCS8是“BEGIN PRIVATE KEY”
                privateKeyPemPkcs8 = privateKeyPemPkcs8.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();
                privateKeyPemPkcs8 = privateKeyPemPkcs8.Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();

                //pkcs8 文本先轉為 .NET XML 私鑰字符串
                string privateKeyXml = RSAPrivateKeyJava2DotNet(privateKeyPemPkcs8);

                RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
                publicRsa.FromXmlString(privateKeyXml);
                return publicRsa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// PKCS8 私鑰文本 轉 .NET XML 私鑰文本
        /// </summary>
        /// <param name="privateKeyPemPkcs8"></param>
        /// <returns></returns>
        public static string RSAPrivateKeyJava2DotNet(string privateKeyPemPkcs8)
        {
            RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyPemPkcs8));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
            Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
            Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
        }

        #endregion


        /// <summary>
        /// 加載公鑰證書
        /// </summary>
        /// <param name="publicKeyCert">公鑰證書文本內(nèi)容</param>
        /// <returns></returns>
        public static RSACryptoServiceProvider LoadPublicCert(string publicKeyCert)
        {

            publicKeyCert = publicKeyCert.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "").Replace("\r", "").Replace("\n", "").Trim();

            byte[] bytesCerContent = Convert.FromBase64String(publicKeyCert);
            X509Certificate2 x509 = new X509Certificate2(bytesCerContent);
            RSACryptoServiceProvider rsaPub = (RSACryptoServiceProvider)x509.PublicKey.Key;
            return rsaPub;

        }

        /// <summary>
        /// pem 公鑰文本 轉  .NET RSACryptoServiceProvider。
        /// </summary>
        /// <param name="publicKeyPem"></param>
        /// <returns></returns>
        public static RSACryptoServiceProvider LoadPublicKey(string publicKeyPem)
        {

            publicKeyPem = publicKeyPem.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();

            //pem 公鑰文本 轉  .NET XML 公鑰文本。
            string publicKeyXml = RSAPublicKeyJava2DotNet(publicKeyPem);

            RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
            publicRsa.FromXmlString(publicKeyXml);
            return publicRsa;


        }

        /// <summary>
        /// pem 公鑰文本 轉  .NET XML 公鑰文本。
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        private static string RSAPublicKeyJava2DotNet(string publicKey)
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
                Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }


    }
}

?

RsaEncryptUtil 工具類:基于 RSACryptoServiceProvider 加密解密的輕度封裝,標準的支持分段加密。

?

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace CommonUtils
{
    /// <summary>
    /// 基于 RSACryptoServiceProvider 加密解密的輕度封裝,標準的支持分段加密。
    /// </summary>
    public static class RsaEncryptUtil
    {

        #region 非標準的-私鑰加密-公鑰解密

        /// <summary>
        /// 私鑰加密 .Net平臺默認是使用公鑰進行加密,私鑰進行解密。私鑰加密需要自己實現(xiàn)或者使用第三方dll
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key">私鑰,格式:PKCS8</param>
        /// <returns></returns>
        public static byte[] encryptByPrivateKey(String data, String key)
        {
            String priKey = key.Trim();
            String xmlPrivateKey = RSAPrivateKeyJava2DotNet(priKey);
            //加載私鑰  
            RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
            privateRsa.FromXmlString(xmlPrivateKey);
            //轉換密鑰  
            AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
            IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 參數(shù)與Java中加密解密的參數(shù)一致       
            c.Init(true, keyPair.Private); //第一個參數(shù)為true表示加密,為false表示解密;第二個參數(shù)表示密鑰 
            byte[] DataToEncrypt = Encoding.UTF8.GetBytes(data);
            byte[] outBytes = c.DoFinal(DataToEncrypt);//加密  
            return outBytes;

        }

        /// <summary>
        /// 私鑰加密
        /// </summary>
        /// <param name="data">明文</param>
        /// <param name="key">私鑰</param>
        /// <param name="keyFormat">私鑰格式:PKCS1,PKCS8</param>
        /// <returns></returns>
        public static byte[] encryptByPrivateKey(String data, String key, string keyFormat)
        {
            String priKey = key.Trim();

            //加載私鑰  
            RSACryptoServiceProvider privateRsa = RsaUtil.LoadPrivateKey(key, keyFormat);

            //轉換密鑰  
            AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
            IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 參數(shù)與Java中加密解密的參數(shù)一致       
            c.Init(true, keyPair.Private); //第一個參數(shù)為true表示加密,為false表示解密;第二個參數(shù)表示密鑰 
            byte[] DataToEncrypt = Encoding.UTF8.GetBytes(data);
            byte[] outBytes = c.DoFinal(DataToEncrypt);//加密  
            return outBytes;

        }

        /// <summary>
        /// RSA私鑰格式轉換,java->.net
        /// </summary>
        /// <param name="privateKey"></param>
        /// <returns></returns>
        private static string RSAPrivateKeyJava2DotNet(string privateKey)
        {
            RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));

            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
        }

        /// <summary>
        /// 用公鑰解密
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte[] decryptByPublicKey(String data, String key)
        {
            String pubKey = key.Trim();
            String xmlPublicKey = RSAPublicKeyJava2DotNet(pubKey);

            RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
            publicRsa.FromXmlString(xmlPublicKey);

            AsymmetricKeyParameter keyPair = DotNetUtilities.GetRsaPublicKey(publicRsa);
            //轉換密鑰  
            // AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetRsaKeyPair(publicRsa);
            IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 參數(shù)與Java中加密解密的參數(shù)一致       
            c.Init(false, keyPair); //第一個參數(shù)為true表示加密,為false表示解密;第二個參數(shù)表示密鑰 
            byte[] DataToEncrypt = Convert.FromBase64String(data);
            byte[] outBytes = c.DoFinal(DataToEncrypt);//解密  
            return outBytes;
        }

        /// <summary>
        /// RSA公鑰格式轉換,java->.net
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        private static string RSAPublicKeyJava2DotNet(string publicKey)
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
                Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }

        #endregion


        #region 標準的-公鑰加密-私鑰解密

        /** 默認編碼字符集 */
        private static string DEFAULT_CHARSET = "UTF-8";

        /// <summary>
        /// 公鑰加密(超過 私鑰長度 / 8 - 11,分段加密)
        /// </summary>
        /// <param name="content">明文</param>
        /// <param name="charset">編碼</param>
        /// <param name="publicKeyPem">公鑰</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static string RSAEncrypt(string content, string charset, string publicKeyPem)
        {
            try
            {
                //假設私鑰長度為1024, 1024/8-11=117。
                //如果明文的長度小于117,直接全加密,然后轉base64。(data.Length <= maxBlockSize)
                //如果明文長度大于117,則每117分一段加密,寫入到另一個Stream中,最后轉base64。while (blockSize > 0)

                RSACryptoServiceProvider rsa = RsaUtil.LoadPublicKey(publicKeyPem);
                //string sPublicKeyPEM = File.ReadAllText(publicKeyPem);
                //RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                //rsa.PersistKeyInCsp = false;
                //RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsa, sPublicKeyPEM);
                if (string.IsNullOrEmpty(charset))
                {
                    charset = DEFAULT_CHARSET;
                }
                byte[] data = Encoding.GetEncoding(charset).GetBytes(content);
                int maxBlockSize = rsa.KeySize / 8 - 11; //加密塊最大長度限制
                if (data.Length <= maxBlockSize)
                {
                    byte[] cipherbytes = rsa.Encrypt(data, false);
                    return Convert.ToBase64String(cipherbytes);
                }
                MemoryStream plaiStream = new MemoryStream(data);
                MemoryStream crypStream = new MemoryStream();
                Byte[] buffer = new Byte[maxBlockSize];
                int blockSize = plaiStream.Read(buffer, 0, maxBlockSize);
                while (blockSize > 0)
                {
                    Byte[] toEncrypt = new Byte[blockSize];
                    Array.Copy(buffer, 0, toEncrypt, 0, blockSize);
                    Byte[] cryptograph = rsa.Encrypt(toEncrypt, false);
                    crypStream.Write(cryptograph, 0, cryptograph.Length);
                    blockSize = plaiStream.Read(buffer, 0, maxBlockSize);
                }

                return Convert.ToBase64String(crypStream.ToArray(), Base64FormattingOptions.None);
            }
            catch (Exception ex)
            {
                throw new Exception("EncryptContent = " + content + ",charset = " + charset, ex);
            }
        }

        /// <summary>
        /// 私鑰解密(超過 私鑰長度 / 8 - 11,分段加密)
        /// </summary>
        /// <param name="content">密文</param>
        /// <param name="charset">編碼</param>
        /// <param name="privateKeyPem">私鑰</param>
        /// <param name="keyFormat">私鑰格式 PKCS1,PKCS8</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static string RSADecrypt(string content, string charset, string privateKeyPem, string keyFormat)
        {
            try
            {
                //假設私鑰長度為1024, 1024/8 =128。
                //如果明文的長度小于 128,直接全解密。(data.Length <= maxBlockSize)
                //如果明文長度大于 128,則每 128 分一段解密,寫入到另一個Stream中,最后 GetString。while (blockSize > 0)

                RSACryptoServiceProvider rsaCsp = RsaUtil.LoadPrivateKey(privateKeyPem, keyFormat);

                //RSACryptoServiceProvider rsaCsp = LoadCertificateFile(privateKeyPem, signType);
                if (string.IsNullOrEmpty(charset))
                {
                    charset = DEFAULT_CHARSET;
                }
                byte[] data = Convert.FromBase64String(content);
                int maxBlockSize = rsaCsp.KeySize / 8; //解密塊最大長度限制
                if (data.Length <= maxBlockSize)
                {
                    byte[] cipherbytes = rsaCsp.Decrypt(data, false);
                    return Encoding.GetEncoding(charset).GetString(cipherbytes);
                }
                MemoryStream crypStream = new MemoryStream(data);
                MemoryStream plaiStream = new MemoryStream();
                Byte[] buffer = new Byte[maxBlockSize];
                int blockSize = crypStream.Read(buffer, 0, maxBlockSize);
                while (blockSize > 0)
                {
                    Byte[] toDecrypt = new Byte[blockSize];
                    Array.Copy(buffer, 0, toDecrypt, 0, blockSize);
                    Byte[] cryptograph = rsaCsp.Decrypt(toDecrypt, false);
                    plaiStream.Write(cryptograph, 0, cryptograph.Length);
                    blockSize = crypStream.Read(buffer, 0, maxBlockSize);
                }

                return Encoding.GetEncoding(charset).GetString(plaiStream.ToArray());
            }
            catch (Exception ex)
            {
                throw new Exception("DecryptContent = " + content + ",charset = " + charset, ex);
            }
        }


        #endregion


    }
}

?

調(diào)用示例:

using CommonUtils;
using System;

namespace ConsoleNetFxRsaEncrypt
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //PKCS8格式私鑰
                string strPriPkcs8 = "MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAMz0Czg6QUtTISa2pUkloeQB/TEpHdqrfyroWpKLW9B/LWFSOGH9nyTk1pPZaeadyEZQ6gay/C0pUAetLraq9bMA/Luxq68b87uG7WX7dKytEO2/87qGpGMRs97H+GlkzWil2QO2KK4cHnAcVicPsmi5aZ72U0BWJFyPhtd+qdmrAgMBAAECgYEAvW67iAbgHt0BASVD9C3iSjpEaVHVlC165o/IVzaTcEx8Bz3Ve0zN8W3JnvIO3ebsG4HiLLr2Nk++9rltOc0eNeGMv7F1e/OFot1wN0ON6s1g4bYh1z5Uz8FcYiMWcqHHICrx+oSFeK9x+I2Zge7enQXcsVnqEhm77ZE5YczSryECQQD9nB58e5efYchF+cYbmURioX18cUMuhQbB9Aq2N55cd689Lg35KZqT8JQTp/8tQSdCJG8d2nU8VKspUKTEAuaDAkEAzuKIIoc9PVJvy90LhIPA9c1S8BPCI7EMCaTZqJ5o3VaR2dqvUZDGX7kL3kYkQ+n7mq3KIECvkEFzA+FOP96XuQJBAJQTKHW0T/YeSKoayUHp/lS8R6F2HCy4PRbXn71+wfbpZqcJEd2OHhQM3tiPOV258esbjMlYeSUNppZL4LgVnXMCQQC7Lvs9Ql+GPDAqo7ToEM1lmICR906QPIBHuX+1sJ3wpYMROWumwPa7ZRH36j6ls+6R5OwcgmpWeuE1gYTrBNsBAkEAn2pEtAljX1foQff6CLozYg/J6J9RmVFcJ6qz0LX3052qNFBQYw8CMHB7VkVNzsDIDC8LX5uP2pzTrdPLew+pPA==";
                //PKCS1格式私鑰
                string strPriPkcs1 = "MIICXwIBAAKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQABAoGBAL1uu4gG4B7dAQElQ/Qt4ko6RGlR1ZQteuaPyFc2k3BMfAc91XtMzfFtyZ7yDt3m7BuB4iy69jZPvva5bTnNHjXhjL+xdXvzhaLdcDdDjerNYOG2Idc+VM/BXGIjFnKhxyAq8fqEhXivcfiNmYHu3p0F3LFZ6hIZu+2ROWHM0q8hAkEA/ZwefHuXn2HIRfnGG5lEYqF9fHFDLoUGwfQKtjeeXHevPS4N+Smak/CUE6f/LUEnQiRvHdp1PFSrKVCkxALmgwJBAM7iiCKHPT1Sb8vdC4SDwPXNUvATwiOxDAmk2aieaN1Wkdnar1GQxl+5C95GJEPp+5qtyiBAr5BBcwPhTj/el7kCQQCUEyh1tE/2HkiqGslB6f5UvEehdhwsuD0W15+9fsH26WanCRHdjh4UDN7YjzldufHrG4zJWHklDaaWS+C4FZ1zAkEAuy77PUJfhjwwKqO06BDNZZiAkfdOkDyAR7l/tbCd8KWDETlrpsD2u2UR9+o+pbPukeTsHIJqVnrhNYGE6wTbAQJBAJ9qRLQJY19X6EH3+gi6M2IPyeifUZlRXCeqs9C199OdqjRQUGMPAjBwe1ZFTc7AyAwvC1+bj9qc063Ty3sPqTw=";
                //公鑰
                string strPub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQAB";

                string strDJM = "泰酷拉!123ABC";//待加密字符串
                strDJM = "泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC";//待加密字符串,超過117字符的測試

                Console.WriteLine("待加密字符串:" + strDJM);
                string charSet = "UTF-8";
                string strJMH = RsaEncryptUtil.RSAEncrypt(strDJM, charSet, strPub);//密文
                Console.WriteLine("密文:" + strJMH);

                string strDecryptedByPkcs8 = RsaEncryptUtil.RSADecrypt(strJMH, charSet, strPriPkcs8, "PKCS8");//使用PKCS8格式私鑰解密
                Console.WriteLine("PKCS8 解密后:" + strDecryptedByPkcs8);

                string strDecryptedByPkcs1 = RsaEncryptUtil.RSADecrypt(strJMH, charSet, strPriPkcs1, "PKCS1");//使用PKCS1格式私鑰解密

                Console.WriteLine("PKCS1 解密后:" + strDecryptedByPkcs1);

            }
            catch (Exception ex)
            {
                Console.WriteLine("ex:" + ex.Message);
            }

            Console.WriteLine("hello");
            Console.ReadKey();
        }
    }
}

?

-文章來源地址http://www.zghlxwxcb.cn/news/detail-476723.html

到了這里,關于C#.NET Framework RSA 公鑰加密 私鑰解密 ver:20230609的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 前端js使用jsrsasign,生成RSA秘鑰,獲取一系列信息(公鑰,私鑰,模數(shù),指數(shù)等)進行加密解密

    前言: 之前的項目里用的RSA加解密的時候是生成固定的公鑰(模數(shù),指數(shù))和私鑰放在代碼里進行數(shù)據(jù)的解密?,F(xiàn)在要修改成前端自己生成(模數(shù)和指數(shù))傳給后臺。后臺加密數(shù)據(jù)返回給我。我在用私鑰解密。 后面查了很多,開始的window.crypto里的方法可以生成公鑰和私鑰,

    2024年02月16日
    瀏覽(111)
  • 私鑰和公鑰到底是誰來加密、誰來解密?

    私鑰和公鑰到底是誰來加密、誰來解密?

    1.? 應用場景 場景1(第一種用法):用于信息加解密,此時使用公鑰加密,私鑰解密。 場景2(第二種用法):用于數(shù)字簽名,此時使用私鑰簽名,公鑰驗簽。 有點混亂,不要去硬記,你只要這樣想即可: - 既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解

    2023年04月15日
    瀏覽(96)
  • RSA加密,公鑰、私鑰的生成,前端使用公鑰加密,JSEncrypt返回值為false的原因以及解決方法,XML轉換Pkcs1、8

    RSA加密,公鑰、私鑰的生成,前端使用公鑰加密,JSEncrypt返回值為false的原因以及解決方法,XML轉換Pkcs1、8

    非對稱加密算法,兩個且不同的Key,一個公開,一個私密,公開加密,私密解密。 特點: 原文短,加密后密文長 生成相對較慢 安全性超強 我們使用.net進行生成公鑰、私鑰。 使用RSA.ToXmlString(Boolean) 方法生成公鑰以及私鑰,方法中接收一個參數(shù), true ?表示同時包含 RSA 公鑰

    2024年01月21日
    瀏覽(98)
  • 國密sm2公鑰加密 私鑰解密java代碼實現(xiàn)

    目錄 一、引入jar包 二、生成秘鑰對,加解密工具類

    2024年02月11日
    瀏覽(93)
  • RSA算法習題 (采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。)

    RSA算法習題 (采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。)

    1、采用RSA算法,其中e=7,p=11,q=13,求出公鑰和私鑰,并求出明文85進行加密后的密文。 2. 找出質數(shù) P、Q P=11 Q=13 3. 計算公共模數(shù) N = P * Q = 143 4. 歐拉函數(shù) Φ(N) = (P-1)*(Q-1) = 10 *12 = 120 5. 計算公鑰E 1Eφ(N) 所以1E120 E的取值范圍{3,7,9,11,13,17,19,...,117,119} E的取值必須和φ(N)互質 取

    2024年02月09日
    瀏覽(100)
  • 【openssl】RSA 生成公鑰私鑰 |通過私鑰獲取公鑰

    【openssl】RSA 生成公鑰私鑰 |通過私鑰獲取公鑰

    通過博客:Window系統(tǒng)如何編譯openssl?編譯出openssl.exe(位于apps文件夾下)。 現(xiàn)在需要使用它獲得公鑰私鑰、通過私鑰獲取公鑰 目錄 說明!?。?一.定位openssl.exe目錄 二、進入命令cmd 三、生成私鑰 四、已知的私鑰替換模板私鑰 五、通過私鑰生成公鑰 a.生成公鑰私鑰:跳過第四

    2024年02月04日
    瀏覽(98)
  • 使用RSA生成公鑰和私鑰

    可以用keytool工具直接生成,需要openssl工具Binaries - OpenSSLWiki設置到環(huán)境變量里 生成的authkey放到gateway下,生成的auth.jks放到auth認證服務下 網(wǎng)關結合鑒權,需要配置如下配置文件???????????????? 認證服務配置Bean 接口AuthToolController RSAUtil 依賴 訪問localhost:6080/generate/do

    2024年02月12日
    瀏覽(97)
  • 已知RSA的公鑰(e,n)計算對應的私鑰d

    已知RSA的公鑰(e,n)計算對應的私鑰d

    今天分享一個軟考中經(jīng)常出現(xiàn)的關于RSA私鑰計算的題目。我們試著理解背后的算法邏輯,然后再看看如何解題。 設在RSA的公鑰密碼體制中,公鑰為(e, n)= (13, 35), 則私鑰d= ()。? A. 17 B. 15 C. 13 D. 11 Rivest Shamir Adleman(RSA)加密算法是一種非對稱加密算法,廣泛應用于許多產(chǎn)

    2023年04月18日
    瀏覽(22)
  • WebAPi接口安全之公鑰私鑰加密

    WebAPi接口安全之公鑰私鑰加密

    隨著各種設備的興起,WebApi作為服務也越來越流行。而在無任何保護措施的情況下接口完全暴露在外面,將導致被惡意請求。最近項目的項目中由于提供給APP的接口未對接口進行時間防范導致短信接口被怒對造成一定的損失,臨時的措施導致PC和app的防止措施不一樣導致后來

    2024年02月04日
    瀏覽(17)
  • 使用 OpenSSL 擴展來實現(xiàn)公鑰和私鑰加密

    首先,你需要生成一對公鑰和私鑰??梢允褂?OpenSSL 工具來生成: 1、生成私鑰 2、從私鑰生成公鑰: 現(xiàn)在你有了一個私鑰( private_key.pem )和一個對應的公鑰( public_key.pem )。下面是如何在 PHP 中使用它們進行加密和解密: 3、檢測是否支付OPENSSL,或用phpinfo(); 上述代碼中,

    2024年02月03日
    瀏覽(90)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包