RSAHelper.cs 6.86 KB
using HHECS.BllModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace HHECS.Infrastructure.CommonHelper
{
    public class RSAHelper
    {
        /// <summary>
        /// 创建RSA公钥私钥
        /// 输出到字符串
        /// </summary>
        public static void CreateRSAKey(out string privateKey, out string publicKey)
        {
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                privateKey = rsa.ToXmlString(true);
                publicKey = rsa.ToXmlString(false);
            }
        }

        /// <summary>
        /// 创建RSA公钥私钥
        /// 输出到XML文件
        /// </summary>
        public static void CreateRSAKey(string privateKeyPath, string publicKeyPath)
        {
            string privateKey = null;
            string publicKey = null;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                privateKey = rsa.ToXmlString(true);
                publicKey = rsa.ToXmlString(false);
            }
            //文件内包含公钥和私钥
            File.WriteAllText(privateKeyPath, privateKey);
            //文件内只包含公钥
            File.WriteAllText(publicKeyPath, publicKey);
        }

        ///// <summary>
        ///// RSA加密
        ///// 从文件中读取公钥
        ///// </summary>
        ///// <param name="data"></param>
        ///// <param name="publicKeyPath"></param>
        ///// <returns></returns>
        //public static BllResult<string> Encrypt(string data, string publicKeyPath)
        //{
        //    try
        //    {
        //        if (string.IsNullOrEmpty(data) || string.IsNullOrWhiteSpace(publicKeyPath))
        //        {
        //            return BllResultFactory.Error<string>("未传入参数");
        //        }
        //        if(!File.Exists(publicKeyPath))
        //        {
        //            return BllResultFactory.Error<string>("文件路径对应的文件不存在");
        //        }

        //        string publicKey = File.ReadAllText(publicKeyPath);

        //        string publicStr = null;
        //        using (RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider())
        //        {
        //            rsaPublic.FromXmlString(publicKey);

        //            byte[] publicValue = rsaPublic.Encrypt(Encoding.Unicode.GetBytes(data), false);
        //            publicStr = Convert.ToBase64String(publicValue);
        //        }
        //        return BllResultFactory.Success(publicStr,"成功");
        //    }
        //    catch(Exception ex)
        //    {
        //        return BllResultFactory.Error<string>($"异常:{ex.Message}");
        //    }
        //}

        /// <summary>
        /// RSA加密
        /// 直接传入公钥
        /// </summary>
        /// <param name="data"></param>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        public static BllResult<string> Encrypt(string data, string publicKey)
        {
            try
            {
                if (string.IsNullOrEmpty(data) || string.IsNullOrWhiteSpace(publicKey))
                {
                    return BllResultFactory.Error<string>("未传入参数");
                }
                byte[] publicValue;
                //创建RSA对象并载入[公钥]
                using (RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider())
                {
                    rsaPublic.FromXmlString(publicKey);

                    byte[] bytedata = Encoding.Unicode.GetBytes(data);
                    //对数据进行加密
                    publicValue = rsaPublic.Encrypt(bytedata, false);
                }
                return BllResultFactory.Success(Convert.ToBase64String(publicValue), "成功");
            }
            catch(Exception ex)
            {
                return BllResultFactory.Error<string>($"异常:{ex.Message}");
            }
        }

        ///// <summary>
        ///// RSA解密
        ///// 从文件中读取秘钥
        ///// </summary>
        ///// <param name="data"></param>
        ///// <param name="privateKeyPath"></param>
        ///// <returns></returns>
        //public static BllResult<string> Decrypt(string data, string privateKeyPath)
        //{
        //    try
        //    {
        //        if (string.IsNullOrEmpty(data) || string.IsNullOrWhiteSpace(privateKeyPath))
        //        {
        //            return BllResultFactory.Error<string>("未传入参数");
        //        }
        //        if (!File.Exists(privateKeyPath))
        //        {
        //            return BllResultFactory.Error<string>("文件路径对应的文件不存在");
        //        }

        //        string privateKey = File.ReadAllText(privateKeyPath);

        //        string privateStr = null;

        //        using (RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider())
        //        {
        //            rsaPrivate.FromXmlString(privateKey);

        //            byte[] bytedata = Convert.FromBase64String(data);

        //            byte[] privateValue = rsaPrivate.Decrypt(bytedata, false);
        //            privateStr = Encoding.Unicode.GetString(privateValue);
        //        }
        //        return BllResultFactory.Success(privateStr,"成功");
        //    }
        //    catch(Exception ex)
        //    {
        //        return BllResultFactory.Error<string>($"异常:{ex.Message}");
        //    }
        //}

        /// <summary>
        /// RSA解密
        /// 直接传入秘钥
        /// </summary>
        /// <param name="data"></param>
        /// <param name="privateKey"></param>
        /// <returns></returns>
        public static BllResult<string> Decrypt(string data, string privateKey)
        {
            try
            {
                if (string.IsNullOrEmpty(data) || string.IsNullOrWhiteSpace(privateKey))
                {
                    return BllResultFactory.Error<string>("未传入参数");
                }
                byte[] privateValue;
                //创建RSA对象并载入[私钥]
                using (RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider())
                {
                    rsaPrivate.FromXmlString(privateKey);

                    //使用Base64将string转换为byte
                    byte[] bytedata = Convert.FromBase64String(data);
                    //对数据进行解密
                    privateValue = rsaPrivate.Decrypt(bytedata, false);
                }
                return BllResultFactory.Success(Encoding.Unicode.GetString(privateValue),"成功");
            }
            catch(Exception ex)
            {
                return BllResultFactory.Error<string>($"异常:{ex.Message}");
            }
        }
    }
}