C# 加密与解密

来源:互联网 发布:中科院 网络空间安全 编辑:程序博客网 时间:2024/05/01 10:45

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace MusicAndNet.utils {
class Security {

    /// <summary>    /// 加密数据    /// </summary>    /// <param name="input">加密前的字符串</param>    /// <returns>加密后的字符串</returns>    public static string DefaultEncrypt(string input) {        string saltValue = "saltValue";        string pwdValue = "pwdValue";        byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(input);        byte[] salt = System.Text.UTF8Encoding.UTF8.GetBytes(saltValue);        System.Security.Cryptography.AesManaged aes = new System.Security.Cryptography.AesManaged();        System.Security.Cryptography.Rfc2898DeriveBytes rfc = new System.Security.Cryptography.Rfc2898DeriveBytes(pwdValue, salt);        /*         * AesManaged - 高级加密标准(AES) 对称算法的管理类         * Rfc2898DeriveBytes - 通过使用基于 HMACSHA1 的伪随机数生成器,实现基于密码的密钥派生功能 (PBKDF2 - 一种基于密码的密钥派生函数)         * 通过 密码 和 salt 派生密钥         *          * AesManaged.BlockSize - 加密操作的块大小(单位:bit)         * AesManaged.LegalBlockSizes - 对称算法支持的块大小(单位:bit)         * AesManaged.KeySize - 对称算法的密钥大小(单位:bit)         * AesManaged.LegalKeySizes - 对称算法支持的密钥大小(单位:bit)         * AesManaged.Key - 对称算法的密钥         * AesManaged.IV - 对称算法的密钥大小         * Rfc2898DeriveBytes.GetBytes(int 需要生成的伪随机密钥字节数) - 生成密钥        */        aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;        aes.KeySize = aes.LegalKeySizes[0].MaxSize;        aes.Key = rfc.GetBytes(aes.KeySize / 8);        aes.IV = rfc.GetBytes(aes.BlockSize / 8);        // 用当前的 Key 属性和初始化向量 IV 创建对称加密器对象        System.Security.Cryptography.ICryptoTransform encryptTransform = aes.CreateEncryptor();        // 加密后的输出流        System.IO.MemoryStream encryptStream = new System.IO.MemoryStream();        // 将加密后的目标流(encryptStream)与加密转换(encryptTransform)相连接        System.Security.Cryptography.CryptoStream encryptor = new System.Security.Cryptography.CryptoStream            (encryptStream, encryptTransform, System.Security.Cryptography.CryptoStreamMode.Write);        // 将一个字节序列写入当前 CryptoStream (完成加密的过程)        encryptor.Write(data, 0, data.Length);        encryptor.Close();        // 将加密后所得到的流转换成字节数组,再用Base64编码将其转换为字符串        string encryptedString = Convert.ToBase64String(encryptStream.ToArray());        return encryptedString;    }    /// <summary>    /// 解密数据    /// </summary>    /// <param name="input">加密后的字符串</param>    /// <returns>加密前的字符串</returns>    public static string DefaultDecrypt(string input) {        // 盐值(与加密时设置的值一致)        string saltValue = "saltValue";        // 密码值(与加密时设置的值一致)        string pwdValue = "pwdValue";        byte[] encryptBytes = Convert.FromBase64String(input);        byte[] salt = System.Text.Encoding.UTF8.GetBytes(saltValue);        System.Security.Cryptography.AesManaged aes = new System.Security.Cryptography.AesManaged();        System.Security.Cryptography.Rfc2898DeriveBytes rfc = new System.Security.Cryptography.Rfc2898DeriveBytes(pwdValue, salt);        aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;        aes.KeySize = aes.LegalKeySizes[0].MaxSize;        aes.Key = rfc.GetBytes(aes.KeySize / 8);        aes.IV = rfc.GetBytes(aes.BlockSize / 8);        // 用当前的 Key 属性和初始化向量 IV 创建对称解密器对象        System.Security.Cryptography.ICryptoTransform decryptTransform = aes.CreateDecryptor();        // 解密后的输出流        MemoryStream decryptStream = new System.IO.MemoryStream();        // 将解密后的目标流(decryptStream)与解密转换(decryptTransform)相连接        System.Security.Cryptography.CryptoStream decryptor = new System.Security.Cryptography.CryptoStream(            decryptStream, decryptTransform, System.Security.Cryptography.CryptoStreamMode.Write);        // 将一个字节序列写入当前 CryptoStream (完成解密的过程)        decryptor.Write(encryptBytes, 0, encryptBytes.Length);        decryptor.Close();        // 将解密后所得到的流转换为字符串        byte[] decryptBytes = decryptStream.ToArray();        string decryptedString = System.Text.UTF8Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);        return decryptedString;    }    /// <summary>    /// MD5信息摘要加密    /// </summary>    /// <param name="EncryptString">加密前的字符串</param>加密前的字符串    /// <returns>加密后的字符串</returns>    public static string MD5Encrypt(string EncryptString) {        if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }        MD5 m_ClassMD5 = new MD5CryptoServiceProvider();        string m_strEncrypt = "";        try {            m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");        } catch (Exception ex) {            throw ex;        } finally {            m_ClassMD5.Clear();        }        return m_strEncrypt;    }    /// <summary>    /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合,密钥必须为8位)    /// </summary>    /// <param name="EncryptString">加密前的字符串</param>    /// <param name="EncryptKey">密钥必须为8位</param>    /// <returns>加密后的字符串</returns>    public static string DESEncrypt(string EncryptString, string EncryptKey) {        if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }        if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }        if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }        byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };        string m_strEncrypt = "";        DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();        try {            byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);            m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);            m_cstream.FlushFinalBlock();            m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_cstream.Close();            m_cstream.Dispose();        } catch (Exception ex) {            throw ex;        } finally {            m_DESProvider.Clear();        }        return m_strEncrypt;    }    /// <summary>    /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合,密钥必须为8位)    /// </summary>    /// <param name="DecryptString">加密后的字符串</param>    /// <param name="DecryptKey">密钥必须为8位</param>    /// <returns>加密前的字符串</returns>    public static string DESDecrypt(string DecryptString, string DecryptKey) {        if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }        if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }        if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }        byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };        string m_strDecrypt = "";        DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();        try {            byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);            m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);            m_cstream.FlushFinalBlock();            m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_cstream.Close();            m_cstream.Dispose();        } catch (Exception ex) {            throw ex;        } finally {            m_DESProvider.Clear();        }        return m_strDecrypt;    }    /// <summary>    /// RC2 加密(用变长密钥对大量数据进行加密,密钥必须为5-16位)    /// </summary>    /// <param name="EncryptString">加密前的字符串</param>    /// <param name="EncryptKey">密钥必须为5-16位</param>    /// <returns>加密后的字符串</returns>    public static string RC2Encrypt(string EncryptString, string EncryptKey) {        if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }        if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }        if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }        string m_strEncrypt = "";        byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };        RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();        try {            byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);            m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);            m_cstream.FlushFinalBlock();            m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_cstream.Close();            m_cstream.Dispose();        } catch (IOException ex) {            throw ex;        } finally {            m_RC2Provider.Clear();        }        return m_strEncrypt;    }    /// <summary>    /// RC2 解密(用变长密钥对大量数据进行加密,密钥必须为5-16位)    /// </summary>    /// <param name="DecryptString">加密后的字符串</param>    /// <param name="DecryptKey">密钥必须为5-16位</param>    /// <returns>加密前的字符串</returns>    public static string RC2Decrypt(string DecryptString, string DecryptKey) {        if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }        if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }        if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }        byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };        string m_strDecrypt = "";        RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();        try {            byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);            m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);            m_cstream.FlushFinalBlock();            m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_cstream.Close();            m_cstream.Dispose();        } catch (Exception ex) {            throw ex;        } finally {            m_RC2Provider.Clear();        }        return m_strDecrypt;    }    /// <summary>    /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高,密钥必须为8位)    /// </summary>    /// <param name="EncryptString">加密前的字符串</param>    /// <param name="EncryptKey1">加密秘钥1</param>    /// <param name="EncryptKey2">加密秘钥2</param>    /// <param name="EncryptKey3">加密秘钥3</param>    /// <returns>加密后的字符串</returns>    public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3) {        string m_strEncrypt = "";        try {            m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);            m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);            m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);        } catch (Exception ex) { throw ex; }        return m_strEncrypt;    }    /// <summary>    /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高,密钥必须为8位)    /// </summary>    /// <param name="EncryptString">加密后的字符串</param>    /// <param name="EncryptKey1">加密秘钥1</param>    /// <param name="EncryptKey2">加密秘钥2</param>    /// <param name="EncryptKey3">加密秘钥3</param>    /// <returns>加密前的字符串</returns>    public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3) {        string m_strDecrypt = "";        try {            m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);            m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);            m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);        } catch (Exception ex) { throw ex; }        return m_strDecrypt;    }    /// <summary>    /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)    /// </summary>    /// <param name="EncryptString">加密前的字符串</param>    /// <param name="EncryptKey">加密秘钥</param>    /// <returns>加密后的字符串</returns>    public static string AESEncrypt(string EncryptString, string EncryptKey) {        if (string.IsNullOrEmpty(EncryptString)) {            throw (new Exception("密文不得为空"));        }        if (string.IsNullOrEmpty(EncryptKey)) {            throw (new Exception("密钥不得为空"));        }        string m_strEncrypt = "";        byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");        Rijndael m_AESProvider = Rijndael.Create();        try {            byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);            m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);            m_csstream.FlushFinalBlock();            m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_csstream.Close();            m_csstream.Dispose();        } catch (Exception ex) {            throw ex;        } finally {            m_AESProvider.Clear();        }        return m_strEncrypt;    }    /// <summary>    /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)    /// </summary>    /// <param name="DecryptString">加密前的字符串</param>    /// <param name="DecryptKey">加密秘钥</param>    /// <returns>加密后的字符串</returns>    public static string AESDecrypt(string DecryptString, string DecryptKey) {        if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }        if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }        string m_strDecrypt = "";        byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");        Rijndael m_AESProvider = Rijndael.Create();        try {            byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);            MemoryStream m_stream = new MemoryStream();            CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);            m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);            m_csstream.FlushFinalBlock();            m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());            m_stream.Close();            m_stream.Dispose();            m_csstream.Close();            m_csstream.Dispose();        } catch (Exception ex) {            throw ex;        }finally {            m_AESProvider.Clear();        }        return m_strDecrypt;    }}

}