专栏首页DT乱“码”3DES 加密与解密

3DES 加密与解密

     /// <summary>
     /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码)
     /// </summary>
     public class Crypto3DES
     {
         /// <summary>
         /// 默认密钥
         /// </summary>
         private string Keys;
        /// <summary>
         /// 密钥与加密字符串不足8字符时的填充字符
         /// </summary>
         private char paddingChar = ' ';
        /// <summary>
         /// 实例化 Crypto3DES 类
         /// </summary>
         /// <param name="key">密钥</param>
         public Crypto3DES(string key)
         {
             this.Keys = key;
         }
        /// <summary>
         /// 获取密钥,不足8字符的补满8字符,超过8字符的截取前8字符
         /// </summary>
         /// <param name="key">密钥</param>
         /// <returns></returns>
         private string GetKeyCode(string key)
         {
             if (key.Length > 8)
                 return key.Substring(0, 8);
             else
                 return key.PadRight(8, paddingChar);
         }
        /// <summary>
         /// 获取加密字符串,不足8字符的补满8字符
         /// </summary>
         /// <param name="strString">The STR string.</param>
         /// <returns></returns>
         private string GetString(string strString)
         {
             if (strString.Length < 8)
                 return strString.PadRight(8, paddingChar);
             return strString;
         }
        /// <summary>
         /// 加密
         /// </summary>
         /// <param name="strString">加密字符串</param>
         /// <returns></returns>
         public string Encrypt(string strString)
         {
             try
             {
                 strString = this.GetString(strString);
                 DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                 DES.Key = Encoding.UTF8.GetBytes(this.GetKeyCode(this.Keys));
                 DES.Mode = CipherMode.ECB;
                 DES.Padding = PaddingMode.Zeros;
                 ICryptoTransform DESEncrypt = DES.CreateEncryptor();
                 byte[] Buffer = Encoding.UTF8.GetBytes(strString);
                 return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
             }
             catch (Exception ex) { return ex.Message; }
         }
        /// <summary>
         /// 解密
         /// </summary>
         /// <param name="strString">解密字符串</param>
         /// <returns></returns>
         public string Decrypt(string strString)
         {
             try
             {
                 DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                 DES.Key = Encoding.UTF8.GetBytes(this.GetKeyCode(this.Keys));
                 DES.Mode = CipherMode.ECB;
                 DES.Padding = PaddingMode.Zeros;
                 ICryptoTransform DESDecrypt = DES.CreateDecryptor();
                 byte[] Buffer = Convert.FromBase64String(strString);
                 return UTF8Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)).Replace("\0", "").Trim();
             }
             catch (Exception ex) { return ex.Message; }
         }
        #region DESEnCode DESDeCode
         /// <summary>
         /// 加密 与Java通用加密
         /// </summary>
         /// <param name="pToEncrypt">需要加密的字符</param>
         /// <param name="cryptKey">密钥,8位的ASCII字符</param>
         /// <returns></returns>
         public string DESEnCode(string pToEncrypt)
         {
             if (string.IsNullOrEmpty(pToEncrypt)) return string.Empty;
            try
             {
                 pToEncrypt = System.Web.HttpContext.Current.Server.UrlEncode(pToEncrypt);
                 string key = this.Keys;
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                 byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);
                 des.Key = ASCIIEncoding.ASCII.GetBytes(key);
                 des.IV = ASCIIEncoding.ASCII.GetBytes(key);
                 System.IO.MemoryStream ms = new System.IO.MemoryStream();
                 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                 cs.Write(inputByteArray, 0, inputByteArray.Length);
                 cs.FlushFinalBlock();
                 StringBuilder ret = new StringBuilder();
                 foreach (byte b in ms.ToArray())
                 {
                     ret.AppendFormat("{0:X2}", b);
                 }
                cs.Close();
                 cs.Dispose();
                 ms.Close();
                 ms.Dispose();
                return ret.ToString();
             }
             catch (System.Exception ex)
             {
                 return ex.Message;
             }
        }
         /// <summary> 
         /// 解密数据  与Java通用解密
         /// </summary> 
         /// <param name="pToEncrypt">解密的字符</param>
         /// <param name="cryptKey">密钥,8位的ASCII字符</param>
         /// <returns></returns> 
         public string DESDeCode(string pToEncrypt)
         {
             if (string.IsNullOrEmpty(pToEncrypt)) return string.Empty;
            try
             {
                 DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                int len = pToEncrypt.Length / 2;
                 byte[] inputByteArray = new byte[len];
                 int x, i;
                for (x = 0; x < len; x++)
                 {
                     i = Convert.ToInt32(pToEncrypt.Substring(x * 2, 2), 16);
                     inputByteArray[x] = (byte)i;
                 }
                string key = this.Keys;
                des.Key = ASCIIEncoding.ASCII.GetBytes(key);
                 des.IV = ASCIIEncoding.ASCII.GetBytes(key);
                 System.IO.MemoryStream ms = new System.IO.MemoryStream();
                 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                 cs.Write(inputByteArray, 0, inputByteArray.Length);
                 cs.FlushFinalBlock();
                string ret = System.Web.HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
                cs.Close();
                 cs.Dispose();
                 ms.Close();
                 ms.Dispose();
                return ret;
             }
             catch (System.Exception ex)
             {
                 return ex.Message;
             }
         }
         #endregion
     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原 mysql开启日志记录

    用户1220053
  • Memcached使用实例

    package com.memcached.util; import java.io.BufferedWriter; import java.io.FileW...

    用户1220053
  • TensorFlow实现卷积神经网络

    1.卷积神经网络简介 卷积神经网络(convolutional neural network, CNN),最早是19世纪60年代,生物学家对猫视觉皮层研究发...

    用户1220053
  • Redis-Java项目应用(Jedis、SpringBoot整合、工具类模板)

    怎么解决上面客户端乱码?可能是序列化方式不一样(默认Jdk),我们需要把对象序列化,自定义redisTemplate,使用Jackson来序列化。

    唔仄lo咚锵
  • SpringBoot整合Redis-RedisTemplate

    HUC思梦
  • SpringBoot入门建站全系列(十四)集成Redis缓存

    本地缓存,就是使用应用内使用本地内存将数据暂缓存储,一般数据库的查询如果不怎么改动,可以用本地缓存暂存。

    品茗IT
  • SpringBoot整合redis(含彩蛋)

    但是我在官网溜达了一圈根本没发现,有下载windows的版本。(听it大佬说redis不维护windos版本了,现在微软自己维护呢。)

    猿码优创
  • 【C#】工具类-FTP操作封装类FTPHelper

    转载:http://blog.csdn.net/gdjlc/article/details/11968477

    跟着阿笨一起玩NET
  • Python ssh 远程执行shell

    py3study
  • Spring-Data-Redis

    2、需要在spring-data-redis中开启redis事务,只需要添加如下一条语句即可

    爱撒谎的男孩

扫码关注云+社区

领取腾讯云代金券