DesTool.cs Des工具类脚本
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System;
public class DesTool
{
#region 密钥
//private static string key = "abcd1234"; //密钥(长度必须8位以上)
#endregion
#region DES加密
/// <summary>
///
/// </summary>
/// <param name="pToEncrypt">加密内容</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public static string EncryptString(string pToEncrypt, string key)
{
//des加密算法类
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//因为内容包含中文 以utf8子节方式存储
byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
//对称加密 设置密钥和初始化矢量(ASCII码)
des.Key = Encoding.UTF8.GetBytes(key);
des.IV = Encoding.UTF8.GetBytes(key);
//创建一个内存流存储加密后的数据
MemoryStream ms = new MemoryStream();
//实现一个加密转换流,其中包含要将加密后的内容写入的内存流对象,用DESCrytoServiceProvider创建的加密器,模式为写入数据
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);
}
ret.ToString();
return ret.ToString();
}
#endregion
#region DES解密
/// <summary>
///
/// </summary>
/// <param name="pToDecrypt">需要解密的字符串</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public static string DecryptString(string pToDecrypt, string key)
{
//实现一个加密服务的类的对象,这个类提供了DES加密算法
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//实现一个二进制数组保存将需要解密的字符转换为二进制后的数据,因为加密后的数据用16位字符保存,所以定义的大小为源字符串一半
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
//将解密内容转换为32位整数,然后存储在二进制数组里
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
//设置秘钥和初始化向量
des.Key = Encoding.UTF8.GetBytes(key);
des.IV = Encoding.UTF8.GetBytes(key);
//用来存储解密内容的内存流
MemoryStream ms = new MemoryStream();
//加密转换流
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
//转换后写入数据
cs.Write(inputByteArray, 0, inputByteArray.Length);
//更新存储,清理缓存
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return Encoding.UTF8.GetString(ms.ToArray());
}
#endregion
}
客户端代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
/// <summary>
/// 加密UI界面
/// </summary>
public class Encipherment : MonoBehaviour
{
//加密 解密、复制按钮
[SerializeField] Button enciphermentBtn;
[SerializeField] Button decodeBtn;
[SerializeField] Button copyBtn;
//密钥 内容InputField
//[SerializeField] InputField key;
string key;
[SerializeField] InputField content;
//结果Text
[SerializeField] Text result;
string resultContent;
void Start()
{
key = ConfigFile.LoadString("PrivateKey");
//按钮点击事件
enciphermentBtn.onClick.AddListener(EnciphermentEvent); //加密
decodeBtn.onClick.AddListener(DecodeEvent); //解密
copyBtn.onClick.AddListener(CopyContent); //复制
}
bool isCopy=false;
private void OnGUI()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
Application.Quit();
}
if (isCopy)
{
isCopy = false;
GUIUtility.systemCopyBuffer = resultContent;
}
}
#region 加密方法
void EnciphermentEvent()
{
try
{
resultContent = DesTool.EncryptString(content.text, key);
result.text = resultContent + " 加密成功!";
Debug.Log(resultContent);
}
catch (System.Exception ex)
{
result.text = ex.ToString();
throw;
}
}
#endregion
#region 解码方法
void DecodeEvent()
{
try
{
resultContent = DesTool.DecryptString(content.text, key);
result.text = resultContent + " 解密成功!";
Debug.Log(result.text);
}
catch (System.Exception ex)
{
result.text = ex.ToString();
throw;
}
}
#endregion
#region 复制
void CopyContent()
{
if (resultContent != string.Empty)
{
//System.Windows.Forms.Clipboard.SetDataObject(resultContent);
isCopy = true;
result.text = resultContent + "\n" + "复制成功!!";
}
else
{
Debug.Log("内容为空");
}
}
#endregion
}
MD5加密
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class MD5Tool
{
//private string key = "12348578902223367877723456789012"; //32位
/// <summary>
/// 加密 返回加密后的结果
/// </summary>
/// <param name="toE">需要加密的数据内容</param>
/// <returns></returns>
public static string EncryptString(string toE,string key)
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toE);
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// 解密 返回解密后的结果
/// </summary>
/// <param name="toD">加密的数据内容</param>
/// <returns></returns>
public static string DecryptString(string toD,string key)
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] toEncryptArray = Convert.FromBase64String(toD);
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
}
注意:Des密钥需要8位以上 MD5需要32位