真爱无限的知识驿站

学习积累技术经验,提升自身能力

DES、3DES、AES、RSA加密算法对比

DES-非机密数据加密标准,可用于兼容旧系统,新系统不建议使用

3DES-DES的加强版,DES到AES之间的过渡算法

AES-高级加密标准,替代DES

RSA-非对称加密解密算法,多用于签名验证,加密解决速度慢,不建议用于大量数据的加密解密

目前跨系统间的加密数据通讯,一般是RSA与AES两种加密算法结合使用,RSA用于对AES密钥进行加密解密,AES用于对交易数据进行加密解密


算法代码:

    public class EncryptHelper
    {
        //DES算法8位加密key,一般存在数据库或文件中
        private static string defaultDesKey = "j5ca9aEn";
        //DES算法8位加密向量,一般存在数据库或文件中
        private static string defaultDesIv = "GTRSQ96C";
        //3DES算法12位加密向量,一般存在数据库或文件中
        private static string defaultTripleDesIV = "68Hfwj3kfX=T";
        //3DES算法32位加密key,一般存在数据库或文件中
        private static string defaultTripleDesKey = "QdpQGoa+8SA9dxhVs6DSXLfUGqw+Ahtd";

        /// <summary>
        /// Aes加解密钥必须32位,一般存在数据库或文件中
        /// </summary>
        private static string defaultAesKey = "ZdpQGoa+0SA1dxhVs7DSXLfUGqw-Ahtg";

        #region DES加密解密-非机密数据的正式数据加密标准(DES Data Encryption Standard)
        //默认密钥向量
        //private static readonly byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

        #region DES加密

        /// <summary> 
        /// 加密数据 
        /// </summary> 
        /// <param name="input">需要加密的字符串</param> 
        /// <param name="sKey">加密秘钥,不传则默认为指定的值</param> 
        /// <param name="sIv">加密向量,不传则默认为指定的值</param> 
        /// <returns></returns> 
        public static string DESEncrypt(string input, string sKey = "", string sIv = "")
        {
            if (string.IsNullOrEmpty(input))
                return String.Empty;
            if (string.IsNullOrEmpty(sKey)) sKey = defaultDesKey;
            else if (sKey.Length > 8) sKey = sKey.Substring(0, 8);
            if (string.IsNullOrEmpty(sIv)) sIv = defaultDesIv;
            else if (sIv.Length > 8) sIv = sIv.Substring(0, 8);

            var des = new DESCryptoServiceProvider();
            MemoryStream ms = null;
            CryptoStream encStream = null;
            StreamWriter sw = null;
            string result;

            try
            {
                var key = Encoding.UTF8.GetBytes(sKey);
                var iv = Encoding.UTF8.GetBytes(sIv);
                ms = new MemoryStream();

                encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);

                sw = new StreamWriter(encStream);

                sw.Write(input);

                sw.Flush();
                encStream.FlushFinalBlock();
                ms.Flush();


                result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, System.Globalization.CultureInfo.InvariantCulture));
            }
            finally
            {
                if (sw != null)
                    sw.Close();
                if (encStream != null)
                    encStream.Close();
                if (ms != null)
                    ms.Close();
            }

            return result;
        }

        #endregion

        #region DES解密
        /// <summary> 
        /// 解密数据 
        /// </summary> 
        /// <param name="input">需要解密的字符串</param> 
        /// <param name="sKey">加密秘钥,不传则默认为指定的值</param> 
        /// <param name="sIv">加密向量,不传则默认为指定的值</param> 
        /// <returns></returns> 
        public static string DESDecrypt(string input, string sKey = "", string sIv = "")
        {
            byte[] buffer;
            try
            {
                buffer = Convert.FromBase64String(input);
            }
            catch (System.ArgumentNullException)
            {
                return String.Empty;
            }
            catch (System.FormatException)
            {
                return String.Empty;
            }

            var des = new DESCryptoServiceProvider();
            MemoryStream ms = null;
            CryptoStream encStream = null;
            StreamReader sr = null;
            var result = String.Empty;
            if (string.IsNullOrEmpty(sKey)) sKey = defaultDesKey;
            else if (sKey.Length > 8) sKey = sKey.Substring(0, 8);
            if (string.IsNullOrEmpty(sIv)) sIv = defaultDesIv;
            else if (sIv.Length > 8) sIv = sIv.Substring(0, 8);

            try
            {
                ms = new MemoryStream(buffer);

                var key = Encoding.UTF8.GetBytes(sKey);
                var iv = Encoding.UTF8.GetBytes(sIv);
                encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
                sr = new StreamReader(encStream);
                result = sr.ReadToEnd();
            }
            finally
            {
                if (sr != null)
                    sr.Close();
                if (encStream != null)
                    encStream.Close();
                if (ms != null)
                    ms.Close();
            }
            return result;
        }
        #endregion

        #endregion

        #region 3DES加密解密-DES增强版
        /// <summary> 
        /// 加密数据-3DES
        /// </summary> 
        /// <param name="input">需要加密的字符串</param> 
        /// <param name="sKey">加密秘钥,不传则默认为指定的值</param> 
        /// <param name="sIv">加密向量,不传则默认为指定的值</param> 
        /// <returns></returns> 
        public static string TripleDESEncrypt(string input, string sKey = "", string sIv = "")
        {
            if (string.IsNullOrEmpty(input))
                return String.Empty;
            if (string.IsNullOrEmpty(sKey)) sKey = defaultTripleDesKey;
            else if (sKey.Length > 32) sKey = sKey.Substring(0, 32);
            if (string.IsNullOrEmpty(sIv)) sIv = defaultTripleDesIV;
            else if (sIv.Length > 12) sIv = sIv.Substring(0, 12);

            //创建一个内存流,用于存放密文
 &

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright 2024-2027 pukuimin Rights Reserved.
粤ICP备17100155号