zoukankan      html  css  js  c++  java
  • DES算法加密解密

      1     /// <summary>
      2     /// DES算法加密解密
      3     /// </summary>
      4     public class DESProvider
      5     {
      6         private DESProvider()
      7         {
      8         }
      9         //默认的初始化密钥
     10         private static string key = "netskycn";
     11 
     12         /// <summary>
     13         /// 对称加密解密的密钥
     14         /// </summary>
     15         public static string Key
     16         {
     17             get
     18             {
     19                 return key;
     20             }
     21             set
     22             {
     23                 key = value;
     24             }
     25         }
     26         #region 加密
     27         /// <summary>
     28         /// 采用DES算法对字符串加密
     29         /// </summary>
     30         /// <param name="encryptString">要加密的字符串</param>
     31         /// <param name="key">加密的密钥</param>
     32         /// <returns></returns>
     33         public static string EncryptString(string encryptString, string key)
     34         {
     35             //加密加密字符串是否为空
     36             if (string.IsNullOrEmpty(encryptString))
     37             {
     38                 throw new ArgumentNullException("encryptString", "不能为空");
     39             }
     40             //加查密钥是否为空
     41             if (string.IsNullOrEmpty(key))
     42             {
     43                 throw new ArgumentNullException("key", "不能为空");
     44             }
     45             //将密钥转换成字节数组
     46             byte[] keyBytes = Encoding.UTF8.GetBytes(key);
     47             //设置初始化向量
     48             byte[] keyIV = keyBytes;
     49             //将加密字符串转换成UTF8编码的字节数组
     50             byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
     51             //调用EncryptBytes方法加密
     52             byte[] resultByteArray = EncryptBytes(inputByteArray, keyBytes, keyIV);
     53             //将字节数组转换成字符串并返回
     54             return Convert.ToBase64String(resultByteArray);
     55         }
     56 
     57         /// <summary>
     58         /// DES加密
     59         /// </summary>
     60         /// <param name="encryptString">要加密的字符串</param>
     61         /// <returns></returns>
     62         public static string EncryptString(string encryptString)
     63         {
     64             return EncryptString(encryptString, key);
     65         }
     66         /// <summary>
     67         /// 采用DES算法对字节数组加密
     68         /// </summary>
     69         /// <param name="sourceBytes">要加密的字节数组</param>
     70         /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param>
     71         /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param>
     72         /// <returns></returns>
     73         public static byte[] EncryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV)
     74         {
     75             if (sourceBytes == null || keyBytes == null || keyIV == null)
     76             {
     77                 throw new ArgumentNullException("sourceBytes和keyBytes", "不能为空。");
     78             }
     79             else
     80             {
     81                 //检查密钥数组长度是否是8的倍数并且长度是否小于64
     82                 keyBytes = CheckByteArrayLength(keyBytes);
     83                 //检查初始化向量数组长度是否是8的倍数并且长度是否小于64
     84                 keyIV = CheckByteArrayLength(keyIV);
     85                 DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
     86                 //实例化内存流MemoryStream
     87                 MemoryStream mStream = new MemoryStream();
     88                 //实例化CryptoStream
     89                 CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
     90                 cStream.Write(sourceBytes, 0, sourceBytes.Length);
     91                 cStream.FlushFinalBlock();
     92                 //将内存流转换成字节数组
     93                 byte[] buffer = mStream.ToArray();
     94                 mStream.Close();//关闭流
     95                 cStream.Close();//关闭流
     96                 return buffer;
     97             }
     98         }
     99         #endregion
    100         #region 解密
    101         public static string DecryptString(string decryptString, string key)
    102         {
    103             if (string.IsNullOrEmpty(decryptString))
    104             {
    105                 throw new ArgumentNullException("decryptString", "不能为空");
    106             }
    107             if (string.IsNullOrEmpty(key))
    108             {
    109                 throw new ArgumentNullException("key", "不能为空");
    110             }
    111             byte[] keyBytes = Encoding.UTF8.GetBytes(key);
    112             byte[] keyIV = keyBytes;
    113             //将解密字符串转换成Base64编码字节数组
    114             byte[] inputByteArray = Convert.FromBase64String(decryptString);
    115             //调用DecryptBytes方法解密
    116             byte[] resultByteArray = DecryptBytes(inputByteArray, keyBytes, keyIV);
    117             //将字节数组转换成UTF8编码的字符串
    118             return Encoding.UTF8.GetString(resultByteArray);
    119         }
    120 
    121         /// <summary>
    122         /// DES解密
    123         /// </summary>
    124         /// <param name="decryptString">要解密的字符串</param>
    125         /// <returns></returns>
    126         public static string DecryptString(string decryptString)
    127         {
    128             return DecryptString(decryptString, key);
    129         }
    130 
    131         /// <summary>
    132         /// 采用DES算法对字节数组解密
    133         /// </summary>
    134         /// <param name="sourceBytes">要加密的字节数组</param>
    135         /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param>
    136         /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param>
    137         /// <returns></returns>
    138         public static byte[] DecryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV)
    139         {
    140             if (sourceBytes == null || keyBytes == null || keyIV == null)
    141             {
    142                 throw new ArgumentNullException("soureBytes和keyBytes及keyIV", "不能为空。");
    143             }
    144             else
    145             {
    146                 //检查密钥数组长度是否是8的倍数并且长度是否小于64
    147                 keyBytes = CheckByteArrayLength(keyBytes);
    148                 //检查初始化向量数组长度是否是8的倍数并且长度是否小于64
    149                 keyIV = CheckByteArrayLength(keyIV);
    150                 DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
    151                 MemoryStream mStream = new MemoryStream();
    152                 CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
    153                 cStream.Write(sourceBytes, 0, sourceBytes.Length);
    154                 cStream.FlushFinalBlock();
    155                 //将内存流转换成字节数组
    156                 byte[] buffer = mStream.ToArray();
    157                 mStream.Close();//关闭流
    158                 cStream.Close();//关闭流
    159                 return buffer;
    160             }
    161         }
    162         #endregion
    163         /// <summary>
    164         /// 检查密钥或初始化向量的长度,如果不是8的倍数或长度大于64则截取前8个元素
    165         /// </summary>
    166         /// <param name="byteArray">要检查的数组</param>
    167         /// <returns></returns>
    168         private static byte[] CheckByteArrayLength(byte[] byteArray)
    169         {
    170             byte[] resultBytes = new byte[8];
    171             //如果数组长度小于8
    172             if (byteArray.Length < 8)
    173             {
    174                 return Encoding.UTF8.GetBytes("12345678");
    175             }
    176             //如果数组长度不是8的倍数
    177             else if (byteArray.Length % 8 != 0 || byteArray.Length > 64)
    178             {
    179                 Array.Copy(byteArray, 0, resultBytes, 0, 8);
    180                 return resultBytes;
    181             }
    182             else
    183             {
    184                 return byteArray;
    185             }
    186         }
    187     }
  • 相关阅读:
    文档_word常用设置-操作
    Java NIO总结 整理
    Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    Lock和synchronized比较详解
    SpringBoot如何将类中属性与配置文件中的配置进行绑定
    简述MyBatis的一级缓存、二级缓存原理
    服务器端filter解决ajax简单请求跨域访问问题
    Spring Boot异步执行程序
    程序猿和hr面试时的巅峰对决
    数据库三大范式详解(通俗易懂)
  • 原文地址:https://www.cnblogs.com/xzitluyang/p/5898666.html
Copyright © 2011-2022 走看看