C#RSA非对称加密算法/数字签名算法

 

 

加密过程:

1、明文-----转换----》byte[]数据

2、byte[]数据-----公钥--------》byte[]加密数据

解密过程:

1、byte[]加密数据-------私钥-------》byte[]数据

2、byte[]数据-----转换------》明文

 

------------------------------- 一、基础数据 ----------------------------------------------

 

 

            #region 获取基础数据
            string data = "{\"Name\":\"许未未\",\"Age\":18,\"CreatTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"}";
            //服务器私钥、公钥 
            string server_PublicKey = "BgIAAACkAABSU0ExAAQAAAEAAQCrefAMBzFtmy+0MofGG/GIxE8a2W8qw6VkvJ6ZNHWek3Y9/9KDGVgZ8PAD3Wiqm/+bsdA0ympuuz/7CxVPBJXCMxD09if8qM/dBHsrsFZVOy9oHgT1L7WE4MHpf16G6j/+8a9DJ1xci274G+x8UXp2pcOCStM0rfdlUPqBwzt51Q==";
            string server_PrivateKey = "BwIAAACkAABSU0EyAAQAAAEAAQCrefAMBzFtmy+0MofGG/GIxE8a2W8qw6VkvJ6ZNHWek3Y9/9KDGVgZ8PAD3Wiqm/+bsdA0ympuuz/7CxVPBJXCMxD09if8qM/dBHsrsFZVOy9oHgT1L7WE4MHpf16G6j/+8a9DJ1xci274G+x8UXp2pcOCStM0rfdlUPqBwzt51b3410FiMgWbtABPrZx5XIZI4/hFqpUiJi2WrtZxrOl+msWcRaIKWEyoThA8Z5QUFq1neEIf7K9SctfK8eBY7/aHZkXsrtC96oH3njxcwEVjrFPBMjjjhjHrdQZizkFOxMyDLf2Era72i2f9dKcP/LQMOzHkYPcP1yEMien/a0/dScWtmz4+xeExW4rSWbpPREZChl06iDSlc50eJ6uO3heujhw93cP4YC0G16AoxtFTtDSVZYT5XtVNb1Ix16bB6EEck2N7pmeRu8ylR5lg0cGKVT78N8KTgPklrMlmiL44ac1CYohSt/WDslcap1hMamoTqdfpktaCu/b9W1wjYAZ4izvaxXQc6x8EPHDldGb9m3NZ7D2KFv4Sg6yNC5dXQCrvnE4CI0d2Q5D3iaxFTrg9s1XVjq9lQBHERhWlVYFuIWntMpoKjKlOuaaCMvwdxPY2ljaYgui9KusTP773pNB48/S/JfM+fA5jtJdiJ+y5RMAu6pQBkaWuBkigcVK49UeE11GeDqfx27iYWMR8HZH3sFRwmtwWWStOMq+20D98PPbWawAsBPrHLdcW/nfMDDYWc+oXPfKYZvXyJNCJeVY=";
            //客户端私钥、公钥
            string client_PublicKey = "BgIAAACkAABSU0ExAAQAAAEAAQDTZuBk7qh0g90FyHAfR2cv9Zfc3YV35VGXNXf0terNwTVDL26BuoVb6FDnEmY1zrsANhPEhd4CqwuRDBtyF/XbSirlbr4LPJ3hWdtFwNJ+dixz3Ab1QIQr1Rh7hiJy/fehhlTj021ZDEQIX1NGohendfAVLoY1VD0FXvRtDxOf1Q==";
            string client_PrivateKey = "BwIAAACkAABSU0EyAAQAAAEAAQDTZuBk7qh0g90FyHAfR2cv9Zfc3YV35VGXNXf0terNwTVDL26BuoVb6FDnEmY1zrsANhPEhd4CqwuRDBtyF/XbSirlbr4LPJ3hWdtFwNJ+dixz3Ab1QIQr1Rh7hiJy/fehhlTj021ZDEQIX1NGohendfAVLoY1VD0FXvRtDxOf1RE4t+cpTeIw1o5jLDZWIX9Yhf59IjcIDt0zzgwdSZ7ibIqwTxoeX19YGvrX3/B5K1sI1fyjacM9ZaDl2woWze2jdNDINm42S3QTRlXry5ofwan9tgHZaHBgYtfpW8bd+EvKKdSTPsfN47jRNaI30hU8puu52aB2PMBOYKyJRPjlIX9TuQImJkfp05d3xxvRMcInWM8Si9x9a0JeLUupMGf8qOA4d7NFXzXRr8sp5LCjkc6YKyARgaP9eR3sw+4rF2VXM5sTitT81irACMUZ7A274bLx6BMZhL1YNgJi3opjn6pm3HheZ9M/ntSOipYDj+3iqh9vJInv5zTvzIFTeGao3VIU5oa2GFw+oNn8jh+PesaEAaiszB/aq7k8XGygajUWcNSx8C82+6rVeXvJ3g0sbyqZVpbS5+rgd9OV4KfPMUoCQdU6ZCjtNO/S9k/zm0/7f5mv/NRNkiyLBfu+Tx2HkYVTxHjuYc6rYHt0Jc2aE1vR50tnrSnlW69q0xZbWBwUtVZcS2VGQ3cxopjd+ei6mu2+o3eOd7KAJcdx5vk9+PYaKdQ+pxRq1r6xNp5xFDEhoflQgNMUImjpxbP8FgU=";
            #endregion

 

-------------------------------二、加密数据、签名数据、验证、解密----------------------------------------------

 

dynamic outText = new ExpandoObject();

            //加密数据
            outText.dataEncrypt = RSAHelper.RSAEncrypt(client_PublicKey, data);
            //签名数据
            outText.dataSignatureFormatter = RSAHelper.SignatureFormatter(server_PrivateKey, outText.dataEncrypt);
            //解密
            outText.dataDecrypt = RSAHelper.RSADecrypt(client_PrivateKey, outText.dataEncrypt);
            //验证
            outText.yz = RSAHelper.SignatureDeformatter(server_PublicKey, outText.dataEncrypt, outText.dataSignatureFormatter);

 

 

 

 

 

 

 

----------------------------- public-1、获取公钥私钥--------------------------------------------

 

//声明一个指定大小的RSA容器
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
string PublicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string PrivateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));

 

 

-----------------------------public-2、Hash描述 签名数据、验证】用到-------------------------------------------------------------------------

 

        /// <summary>
        /// 获取Hash描述表
        /// </summary>
        /// <param name="strSource">待签名的字符串</param>
        /// <param name="strHashData">Hash描述</param>
        /// <returns></returns>
        public static bool GetHash(string strSource, ref string strHashData, out byte[] HashData)
        {
            try
            {
                //从字符串中取得Hash描述 
                byte[] Buffer;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);
                HashData = MD5.ComputeHash(Buffer);
                strHashData = Convert.ToBase64String(HashData);
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

 

 

 

 

 

-------------------------------public-3 c# 加密数据【分段加密】----------------------------------------------

 

        /// <summary>
        /// RSA分段加密
        /// </summary>
        /// <param name="publickey">公钥</param>
        /// <param name="content">明文</param>
        /// <returns></returns>
        public static string RSAEncrypt(string publickey, string content)
        {
            if (string.IsNullOrEmpty(content))
                return null;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                //加载明文
                byte[] data = Encoding.UTF8.GetBytes(content);
                //公钥
                byte[] keyBytes = Convert.FromBase64String(publickey);
                int keySize = rsa.KeySize / 8;
                int bufferSize = keySize - 11;
                byte[] buffer = new byte[bufferSize];
                MemoryStream msInput = new MemoryStream(data);
                MemoryStream msOuput = new MemoryStream();
                int readLen = msInput.Read(buffer, 0, bufferSize);
                rsa.ImportCspBlob(keyBytes);
                while (readLen > 0)
                {
                    byte[] dataToEnc = new byte[readLen];
                    Array.Copy(buffer, 0, dataToEnc, 0, readLen);
                    //加密
                    byte[] encData = rsa.Encrypt(dataToEnc, false);
                    msOuput.Write(encData, 0, encData.Length);
                    readLen = msInput.Read(buffer, 0, bufferSize);
                }
                msInput.Close();
                //得到密文
                byte[] result = msOuput.ToArray();
                msOuput.Close();
                rsa.Clear();
                return Convert.ToBase64String(result);
            }
        }

-------------------------------public-4c# 签名数据----------------------------------------------

        /// <summary>
        /// RSA签名
        /// </summary>
        /// <param name="p_strKeyPrivate">私钥</param>
        /// <param name="m_strHashbyteSignature">待签名数据</param>
        /// <returns></returns>
        public static string SignatureFormatter(string p_strKeyPrivate, string strHashbyteSignature)
        {
            byte[] Hashbyte;
            GetHash(strHashbyteSignature, ref strHashbyteSignature, out Hashbyte);
            byte[] HashbyteSignature = Convert.FromBase64String(strHashbyteSignature);
            //私钥
            byte[] keyBytes = Convert.FromBase64String(p_strKeyPrivate);
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportCspBlob(keyBytes);
                RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(rsa);
                //设置签名的算法为MD5
                formatter.SetHashAlgorithm("MD5");
                byte[] inArray = formatter.CreateSignature(HashbyteSignature);
                return Convert.ToBase64String(inArray);
            }
        }


-------------------------------public-5、c# 验证----------------------------------------------

 

 

 

 

        /// <summary>
        /// RSA验证
        /// </summary>
        /// <param name="p_strKeyPublic">公钥</param>
        /// <param name="p_strHashbyteDeformatter">Hash描述</param>
        /// <param name="p_strDeformatterData">要为 rgbHash 验证的签名。</param>
        /// <returns></returns>
        public static bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
        {
            try
            {
                byte[] keyBytes = Convert.FromBase64String(p_strKeyPublic);
                byte[] Hashbyte;
                GetHash(p_strHashbyteDeformatter, ref p_strHashbyteDeformatter,out Hashbyte);
                byte[] rgbSignature = Convert.FromBase64String(p_strDeformatterData);
                using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                {
                    rsa.ImportCspBlob(keyBytes);
                    RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(rsa);
                    deformatter.SetHashAlgorithm("MD5");
                    if (deformatter.VerifySignature(Hashbyte, rgbSignature))
                    {
                        return true;
                    }
                    return false;
                }

            }
            catch
            {
                return false;
            }
        }

 

 

 

-------------------------------public-6、c# 解密----------------------------------------------

 

        /// <summary>
        /// RSA解密
        /// </summary>
        /// <param name="privatekey">私钥</param>
        /// <param name="content">密文</param>
        /// <returns></returns>
        public static string RSADecrypt(string privatekey, string content)
        {
            if (string.IsNullOrEmpty(content))
                return null;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            { 
                //加载密文
                byte[] dataEnc = Convert.FromBase64String(content);  
                //私钥
                byte[] keyBytes = Convert.FromBase64String(privatekey);
                rsa.ImportCspBlob(keyBytes);
                int keySize = rsa.KeySize / 8;
                byte[] buffer = new byte[keySize];
                MemoryStream msInput = new MemoryStream(dataEnc);
                MemoryStream msOuput = new MemoryStream();
                int readLen = msInput.Read(buffer, 0, keySize);
                while (readLen > 0)
                {
                    byte[] dataToDec = new byte[readLen];
                    Array.Copy(buffer, 0, dataToDec, 0, readLen);
                    byte[] decData = rsa.Decrypt(dataToDec, false);
                    msOuput.Write(decData, 0, decData.Length);
                    readLen = msInput.Read(buffer, 0, keySize);
                }
                msInput.Close();
                //得到明文
                byte[] result = msOuput.ToArray();
                msOuput.Close();
                rsa.Clear();
                return Encoding.UTF8.GetString(result);
            }
        }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值