C# 加解密之RSA

RSA,非对称加密,简单可以理解为现在有两把钥匙,一把只能用来开,一把只能用来关,所以这跟前面写的对称加密是不一样的;

原理和算法的话,不谈。。。还是自己去查吧,费脑子。

主要说下优缺点吧,首先就是RSA的安全性高,嗯,很高,比DES和AES要高很多,但由于密钥长度或者算法复杂度的提高就会带来性能的损失,所以RSA的效率就比较低,所以我们一般不会采用RSA加密一些大的数据,如果非要加密的话,可以采用混合加密,比如DES或者AES来加密数据,用RSA来加密密钥;或者采用分块加密的方式,即只加密其中一部分或者关键部分。

RSA一般公钥用来加密,私钥用来做解密,所以我们这里需要预先生成两把密钥。生成密钥的方式也有很多种,这里就采用最直接的方式了。

实现功能:

- 使用RSA加密方式加解密文本数据

开发环境:

开发工具: Visual Studio 2013

.NET Framework版本:4.5

实现代码:

  /// <summary>
        /// 生成公钥和私钥
        /// </summary>
        /// <returns></returns>
        public static RsaKey CreateKey()
        {
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
            RsaKey rsaKey = new RsaKey();

            rsaKey.PublicKey=rsaProvider.ToXmlString(false);
            rsaKey.PrivateKey = rsaProvider.ToXmlString(true);
            return rsaKey;
        }

        /// <summary>
        /// RSA加密
        /// </summary>
        /// <param name="rsaModel"></param>
        /// <returns></returns>
        public static byte[] Encrypt(RsaModel rsaModel)
        {
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
            byte[] result = null;
            try
            {
                rsaProvider.FromXmlString(rsaModel.Key);
                result = rsaProvider.Encrypt(rsaModel.Data, false);
            }
            catch { }
            return result;
        }

        /// <summary>
        /// RSA解密
        /// </summary>
        /// <param name="rsaModel"></param>
        /// <returns></returns>
        public static byte[] Decrypt(RsaModel rsaModel)
        {
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
            byte[] result = null;
            try
            {
                rsaProvider.FromXmlString(rsaModel.Key);
                result = rsaProvider.Decrypt(rsaModel.Data, false);
            }
            catch { }
            return result;
        }

        /// <summary>
        /// RSA加密字符串
        /// </summary>
        /// <param name="data">要加密的字符串</param>
        /// <param name="key">公钥</param>
        /// <returns></returns>
        public static string Encrypt(string data, string key)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            byte[] result = Encrypt(new RsaModel
            {
                Data = bytes,
                Key = key
            });
            if (result == null)
            {
                return "";
            }
            return Convert.ToBase64String(result);
        }

        /// <summary>
        /// RSA解密字符串
        /// </summary>
        /// <param name="data">要解密的字符串</param>
        /// <param name="key">私钥</param>
        /// <returns></returns>
        public static string Decrypt(string data, string key)
        {
            byte[] bytes = Convert.FromBase64String(data);
            byte[] result = Decrypt(new RsaModel
            {
                Data = bytes,
                Key = key
            });
            if (result == null)
            {
                return "";
            }
            return Encoding.UTF8.GetString(result);
        }

        public class RsaKey
        {
            /// <summary>
            /// 公钥
            /// </summary>
            public string PublicKey { get; set; }

            /// <summary>
            /// 私钥
            /// </summary>
            public string PrivateKey { get; set; }
        }

        public class RsaModel
        {
            /// <summary>
            /// 需要加密/解密的数据
            /// </summary>
            public byte[] Data { get; set; }

            /// <summary>
            /// 密钥(加密:公钥;解密:私钥)
            /// </summary>
            public string Key { get; set; }
        }
  RsaUtil.RsaKey rsaKey = new RsaUtil.RsaKey();
        private void btn_Rsa_Encrypt_Click(object sender, EventArgs e)
        {
            rsaKey = RsaUtil.CreateKey();
            string result = RsaUtil.Encrypt(textBox1.Text, rsaKey.PublicKey);
            textBox2.Text = result;
        }

        private void btn_Rsa_Decrypt_Click(object sender, EventArgs e)
        {
            string result = RsaUtil.Decrypt(textBox2.Text, rsaKey.PrivateKey);
            textBox1.Text = result;
        }

实现效果:

由简入繁,拿来即用

更多精彩,请持续关注公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值