C#之Des加密解密

Des加密:对称可逆加密(公钥加密算法);

1.对称加密:含有一个加/解密钥(同一个密钥),在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密;

2.非对称加密:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进;

代码如下:
using System;
using System.IO;
using System.Security.Cryptography;

namespace Common.Helper.Crypto
{
    /// <summary>
    /// Des加密解密-对称可逆加密
    /// DES,全称Data Encryption Standard,是一种对称加密算法。
    /// 应用:文件传输,数据传输,加密速度快,秘钥是安全问题
    /// </summary>
    public static class DesCrypto
    {
        /// <summary>
        /// 检验密钥和向量是否有效长度【8】
        /// </summary>
        /// <param name="key">密钥</param>
        /// <returns>bool</returns>
        private static bool CheckKeyOrIv(string key,string iv)
        {
            if (string.IsNullOrWhiteSpace(key) || string.IsNullOrWhiteSpace(iv))
                return false;
            if (8.Equals(key.Length) && iv.Length.Equals(key.Length))
                return true;
            else
                return false;
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="palinData">明文</param>
        /// <param name="key">密钥:8位长度</param>
        /// <param name="iv">向量:8位长度</param>
        /// <param name="encodingType">编码方式</param>
        /// <returns>密文</returns>
        public static string Encrypt(string palinData, string key, string iv, EncodingStrOrByte.EncodingType encodingType = EncodingStrOrByte.EncodingType.UTF8)
        {
            if (string.IsNullOrWhiteSpace(palinData)) return null;
            if (!CheckKeyOrIv(key,iv)) return palinData;
            using (DESCryptoServiceProvider sp = new DESCryptoServiceProvider { Key = EncodingStrOrByte.GetBytes(key, encodingType), IV = EncodingStrOrByte.GetBytes(iv, encodingType) })
            {
                using (ICryptoTransform ct = sp.CreateEncryptor())
                {
                    byte[] bytes = EncodingStrOrByte.GetBytes(palinData, encodingType);
                    using (var ms = new MemoryStream())
                    {
                        using (var cs = new CryptoStream(ms, ct,CryptoStreamMode.Write))
                        {
                            cs.Write(bytes, 0, bytes.Length);
                            cs.FlushFinalBlock();
                        }
                        return Convert.ToBase64String(ms.ToArray());
                    }
                }
            }
        }

        /// <summary>  
        /// 解密
        /// </summary>  
        /// <param name="encryptedData">密文</param>  
        /// <param name="key">密钥:8位长度</param>  
        /// <param name="iv">向量:8位长度</param>  
        /// <param name="encodingType">编码方式</param>
        /// <returns>明文</returns>  
        public static string Decrypt(string encryptedData, string key, string iv, EncodingStrOrByte.EncodingType encodingType = EncodingStrOrByte.EncodingType.UTF8)
        {
            if (string.IsNullOrWhiteSpace(encryptedData)) return null;
            if (!CheckKeyOrIv(key, iv)) return encryptedData;
            using (DESCryptoServiceProvider sp = new DESCryptoServiceProvider { Key = EncodingStrOrByte.GetBytes(key, encodingType), IV = EncodingStrOrByte.GetBytes(iv, encodingType) })
            {
                using (ICryptoTransform ct = sp.CreateDecryptor())
                {
                    byte[] bytes = Convert.FromBase64String(encryptedData);
                    using (var ms = new MemoryStream())
                    {
                        using (var cs = new CryptoStream(ms, ct, CryptoStreamMode.Write))
                        {
                            cs.Write(bytes, 0, bytes.Length);
                            cs.FlushFinalBlock();
                        }
                        return EncodingStrOrByte.GetString(ms.ToArray(), encodingType);
                    }
                }
            }
        }
    }
}

编码处理类:同上Rsa加密解密;注:加/解密密钥和向量均为8位长度。

猜你喜欢

转载自blog.csdn.net/chaitsimplelove/article/details/80481421