3DES 加密与解密
时间:2022-04-27
本文章向大家介绍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(" ", "").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
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法