zoukankan      html  css  js  c++  java
  • DES加密解密帮助类

        public class DESCrypto
        {
            /// <summary>
            /// 初始化des实例秘钥及向量
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            private static DESCryptoServiceProvider InitDESInstance(string key)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] salt = new byte[] { 0x0A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1 };
                byte[] keyByte = Encoding.UTF8.GetBytes(key);
                Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(keyByte, salt, 8);
                Rfc2898DeriveBytes rfcIv = new Rfc2898DeriveBytes("0987654321", salt, 8);
                des.Key = rfcKey.GetBytes(8);
                des.IV = rfcIv.GetBytes(8);
                return des;
            }
    
            #region 基于Base64的加密解密(不其他格式的加解密方法配合使用)
            /// <summary>
            /// 基于Base64
            /// </summary>
            /// <param name="plaintext"></param>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string DESEncryptBase64(string plaintext,string key)
            {
                DESCryptoServiceProvider des = InitDESInstance(key);
                byte[] dataByteArray = Encoding.UTF8.GetBytes(plaintext);
                string ciphertext = "";
                using (MemoryStream ms = new MemoryStream())
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(dataByteArray, 0, dataByteArray.Length);
                    cs.FlushFinalBlock();
                    ciphertext = Convert.ToBase64String(ms.ToArray());
                }
                return ciphertext;
            }
    
            /// <summary>
            /// 基于Base64
            /// </summary>
            /// <param name="encrypt"></param>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string DESDecryptBase64(string encrypt, string key)
            {
                DESCryptoServiceProvider des = InitDESInstance(key);
                byte[] dataByteArray = Convert.FromBase64String(encrypt);
                using (MemoryStream ms = new MemoryStream())
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(dataByteArray, 0, dataByteArray.Length);
                    cs.FlushFinalBlock();
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
            #endregion
    
            #region 基于2位十六进制格式的加密解密(不其他格式的加解密方法配合使用)
            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="plaintext">明文</param>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string DESEncrypt(string plaintext, string key)
            {
                DESCryptoServiceProvider des = InitDESInstance(key);
                StringBuilder sb = new StringBuilder();
                byte[] dataByteArray = Encoding.UTF8.GetBytes(plaintext);
                string ciphertext = "";
                using (MemoryStream ms = new MemoryStream())
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(dataByteArray, 0, dataByteArray.Length);
                    cs.FlushFinalBlock();
                    //输出加密文本
                    foreach (byte b in ms.ToArray())
                    {
                        sb.AppendFormat("{0:X2}", b);
                    }
                    ciphertext = sb.ToString();
                }
                return ciphertext;
    
            }
    
            /// <summary>
            /// 解密
            /// </summary>
            /// <param name="ciphertext">密文</param>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string DESDecrypt(string ciphertext, string key)
            {
                DESCryptoServiceProvider des = InitDESInstance(key);
                byte[] dataByteArray = new byte[ciphertext.Length / 2];
                for (int x = 0; x < ciphertext.Length / 2; x++)
                {
                    int i = (Convert.ToInt32(ciphertext.Substring(x * 2, 2), 16));
                    dataByteArray[x] = (byte)i;
                }
                using (MemoryStream ms = new MemoryStream())
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(dataByteArray, 0, dataByteArray.Length);
                    cs.FlushFinalBlock();
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
            #endregion
    
            #region 文件加密解密(不其他格式的加解密方法配合使用)
            /// <summary>
            /// 加密文件
            /// </summary>
            /// <param name="sourceFile">文件的物理路径</param>
            /// <param name="encryptFile">文件的物理路径</param>
            /// <param name="key"></param>
            public static void DESEncryptFile(string sourceFile, string encryptFile, string key)
            {
                if (string.IsNullOrEmpty(sourceFile) || string.IsNullOrEmpty(encryptFile)||!File.Exists(sourceFile)) return;
                
                DESCryptoServiceProvider des = InitDESInstance(key);
    
                using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
                using (FileStream encryptStream = new FileStream(encryptFile, FileMode.Create, FileAccess.Write))
                {
                    byte[] dataByteArray = new byte[sourceStream.Length];
                    sourceStream.Read(dataByteArray, 0, dataByteArray.Length);
                    using (CryptoStream cs = new CryptoStream(encryptStream, des.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(dataByteArray, 0, dataByteArray.Length);
                        cs.FlushFinalBlock();
                    }
                }
            }
    
            /// <summary>
            /// 解密文件
            /// </summary>
            /// <param name="encryptFile">文件的物理路径</param>
            /// <param name="decryptFile">文件的物理路径</param>
            /// <param name="key"></param>
            public static void DESDecryptFile(string encryptFile, string decryptFile, string key)
            {
                if (string.IsNullOrEmpty(encryptFile) || string.IsNullOrEmpty(decryptFile) || !File.Exists(encryptFile))return;
    
                DESCryptoServiceProvider des = InitDESInstance(key);
    
                using (FileStream encryptStream = new FileStream(encryptFile, FileMode.Open, FileAccess.Read))
                using (FileStream decryptStream = new FileStream(decryptFile, FileMode.Create, FileAccess.Write))
                {
                    byte[] dataByteArray = new byte[encryptStream.Length];
                    encryptStream.Read(dataByteArray, 0, dataByteArray.Length);
                    using (CryptoStream cs = new CryptoStream(decryptStream, des.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(dataByteArray, 0, dataByteArray.Length);
                        cs.FlushFinalBlock();
                    }
                }
            }
    
            /// <summary>
            /// 加密文本并输出到文件
            /// </summary>
            /// <param name="plaintext"></param>
            /// <param name="FileName">文件的物理路径</param>
            /// <param name="Key"></param>
            public static void DESEncryptTextToFile(string plaintext, string FileName, string key)
            {
                if (string.IsNullOrEmpty(FileName)) return;
    
                DESCryptoServiceProvider des = InitDESInstance(key);
                byte[] dataByteArray = Encoding.UTF8.GetBytes(plaintext);
    
                using (FileStream fStream = File.Open(FileName, FileMode.Create))
                using (CryptoStream cStream = new CryptoStream(fStream, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cStream.Write(dataByteArray, 0, dataByteArray.Length);
                    cStream.FlushFinalBlock();
                }
            }
    
            /// <summary>
            /// 解密文件中的密文并返回
            /// </summary>
            /// <param name="FileName"></param>
            /// <param name="Key"></param>
            /// <returns></returns>
            public static string DESDecryptTextFromFile(string FileName, string key)
            {
                if (string.IsNullOrEmpty(FileName)||!File.Exists(FileName)) return "";
    
                DESCryptoServiceProvider des = InitDESInstance(key);
    
                using (FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate))
                using (CryptoStream cStream = new CryptoStream(fStream, des.CreateDecryptor(), CryptoStreamMode.Read))
                using (StreamReader sReader = new StreamReader(cStream))
                {
                    string val = sReader.ReadToEnd();
                    return val;
                }
            }
            #endregion
        }
    View Code

    Tips:参考MSDN整理编写,比较全面。

  • 相关阅读:
    bzoj3109【CQOI2013】新数独
    HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)
    从头认识java-15.1 填充容器(3)-填充Map
    写一个python的服务监控程序
    javaScript定义函数的三种方式&amp;变量的作用域
    android开发中应该注意的问题
    某技术大牛的帖子(android项目总结)
    android命名规范
    GitHub使用教程for Eclipse
    Android内存性能优化(内部资料总结)
  • 原文地址:https://www.cnblogs.com/njl041x/p/3873174.html
Copyright © 2011-2022 走看看