- unity中经常需要对软件进行设备硬件的绑定,这里提供一种思路,获取到硬件的设备信息作为加密的内容,然后配合自己定义的加密头拼接成字符串,进行加密后的激活码使用;
- 设置加密内容可写成一个单独的客户端进行授权,解密方法写在自己的软件内作为验证处理;
下面是代码部分,可供选择有DES加密方式和MD5加密;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetTime : MonoBehaviour
{
[Header("加密内容")]
public string EncryptTime;
[Header("加密主题")]
public string EncryptTitle;
[Header("加密头")]
public string EncryptHead;
// Start is called before the first frame update
void Start()
{
}
/// <summary>
/// 进行加密内容设置,可以自己定义加密的内容拼接;
/// </summary>
public void SetEncrypt()
{
//根据本机硬件的id和标识更新加密信息;
EncryptTime = SystemInfo.deviceUniqueIdentifier+EncryptHead;
//生成加密内容需要添加一个标识EncryptHead,解密内容时同样使用此标识;
string _encryptInfo = DesTool.EncryptString(EncryptTime, EncryptHead);
//加密内容写入电脑中作为注册信息,因为是经过特殊标识的加密,所以即使注册表里查看也无法破解和更改;
PlayerPrefs.SetString(EncryptTitle, _encryptInfo);
PlayerPrefs.Save();
Debug.Log("写入成功");
}
/// <summary>
/// 获取加密内容,如果获取到硬件的本地注册码和软件内部生成的一致,则验证通过。
/// </summary>
public void GetEncrypt()
{
//获取本机的注册信息;
string _tempInfo = PlayerPrefs.GetString(EncryptTitle);
if (string.IsNullOrEmpty(_tempInfo))
{
Debug.Log("验证失败,软件退出");
}
else
{
//根据标识EncryptHead进行解密;
string _decryptionInfo= DesTool.DecryptString(_tempInfo, EncryptHead);
//如果解密后的内容与自己获取的硬件信息一致则通过;
if (_decryptionInfo.Equals(SystemInfo.deviceUniqueIdentifier+EncryptHead))
{
Debug.Log("验证通过");
}else
{
Debug.Log("验证失败,软件退出");
}
}
}
// Update is called once per frame
void Update()
{
}
}
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>
/// DES加密
/// </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>
/// DES解密
/// </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;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public class MD5
{
public static string MD5SUM(string plain)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] plainBytes = Encoding.ASCII.GetBytes(plain);
byte[] hash = md5.ComputeHash(plainBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
sb.Append(hash[i].ToString("X2"));
return sb.ToString();
}
public static string MD5JM(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());
}
}