Unity发布软件与设备硬件绑定的加密方式

  1. unity中经常需要对软件进行设备硬件的绑定,这里提供一种思路,获取到硬件的设备信息作为加密的内容,然后配合自己定义的加密头拼接成字符串,进行加密后的激活码使用;
  2. 设置加密内容可写成一个单独的客户端进行授权,解密方法写在自己的软件内作为验证处理;

下面是代码部分,可供选择有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());
    }

}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity软件加密方式主要是对Assembly-CSharp.dll进行加密,这样可以保护Unity的主要代码逻辑不被反编译,以保护软件开发商的合法权益。同时,可以使用工具如DS Protector对Unity软件中的资源文件(如.ress和resources)进行加密,以防止这些资源被非法提取。 一种常用的对称加密体制是DES(Data Encryption Standard),它具有高安全性、低计算开销和快速处理速度的特点。特别适合用于对大量数据和大文件进行加密保护。DES加密算法的基本原理是将输入的明文数据按照一定规则进行加密转换,生成密文数据。 Unity软件加密的目的是为了保护软件的安全性,防止非法的访问和使用。虽然DES加密算法本身具有较高的安全性,但并不能保证绝对的安全性。然而,由于DES加密算法的强大健壮性和耗时的穷举法破解难度,攻击者很难通过对加密算法的破解来获取网络游戏数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [以unity3d为例解读:游戏数据加密](https://blog.csdn.net/flyTie/article/details/126068128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值