Unity中添加AES加密

using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// AES加密算法
/// </summary>
public class AESEncryption : MonoBehaviour {

    /// <summary>
    /// 默认密钥向量
    /// </summary>
    private static byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

    /// <summary>
    /// AES加密算法
    /// </summary>
    /// <param name="plainText">明文字符串</param>
    /// <param name="strKey">密钥</param>
    /// <returns>返回加密后的密文字节数组</returns>
    public static byte[] AESEncrypt(string plainText, string strKey)
    {
        //分组加密算法
        SymmetricAlgorithm des = Rijndael.Create();
        des.Padding = PaddingMode.None;
        byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
        int covering = (inputByteArray.Length + 1) % 16;
        int coveringLength = 0;
        if (covering != 0)//手动补位
        {
            coveringLength = 16 - covering;
        }
        int dataLength = (inputByteArray.Length + 1) + coveringLength;
        byte[] dataArray = new byte[dataLength];
        Buffer.BlockCopy(inputByteArray, 0, dataArray, 0, inputByteArray.Length);
        dataArray[dataArray.Length - 1] = Convert.ToByte(coveringLength);
        //设置密钥及密钥向量
        des.Key = Encoding.UTF8.GetBytes(strKey);
        des.IV = _key1;
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(dataArray, 0, dataArray.Length);
        cs.FlushFinalBlock();
        byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组
        cs.Close();
        ms.Close();
        return cipherBytes;

    }

    /// <summary>
    /// AES加密算法
    /// </summary>
    /// <param name="inputByteArray">明文</param>
    /// <param name="strKey">密钥</param>
    /// <returns>返回加密后的密文字节数组</returns>
    public static byte[] AESEncrypt(byte[] inputByteArray, string strKey)
    {
        //分组加密算法
        SymmetricAlgorithm des = Rijndael.Create();
        des.Padding = PaddingMode.None;
        int covering = (inputByteArray.Length + 1) % 16;
        int coveringLength = 0;
        if (covering != 0)//手动补位
        {
            coveringLength = 16 - covering;
        }
        int dataLength = (inputByteArray.Length + 1) + coveringLength;
        byte[] dataArray = new byte[dataLength];
        Buffer.BlockCopy(inputByteArray, 0, dataArray, 0, inputByteArray.Length);
        dataArray[dataArray.Length - 1] = Convert.ToByte(coveringLength);
        //设置密钥及密钥向量
        des.Key = Encoding.UTF8.GetBytes(strKey);
        des.IV = _key1;
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(dataArray, 0, dataArray.Length);
        cs.FlushFinalBlock();
        byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组
        cs.Close();
        ms.Close();
        return cipherBytes;
    }
    /// <summary>
    /// AES解密
    /// </summary>
    /// <param name="cipherText">密文字节数组</param>
    /// <param name="strKey">密钥</param>
    /// <returns>返回解密后的字符串</returns>
    public static byte[] AESDecrypt(byte[] cipherText, string strKey)
    {
        SymmetricAlgorithm des = Rijndael.Create();
        des.Key = Encoding.UTF8.GetBytes(strKey);
        des.IV = _key1;
        des.Padding = PaddingMode.None;
        byte[] decryptBytes = new byte[cipherText.Length];
        MemoryStream ms = new MemoryStream(cipherText);
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);
        cs.Read(decryptBytes, 0, decryptBytes.Length);
        int length = Convert.ToInt32(decryptBytes.Length - 1);
        byte[] databytes = new byte[decryptBytes.Length - 1 - length];
        Buffer.BlockCopy(decryptBytes, 0, databytes, 0, databytes.Length);
        cs.Close();
        ms.Close();
        return databytes;
    }

}
using UnityEngine;
using System.Collections;

public class StartGame : MonoBehaviour {

    /// <summary>
    /// 密钥(系统自动随机的密钥)
    /// </summary>
    string keys = "";
    /// <summary>
    /// 注册码(玩家输入的注册码)
    /// </summary>
    string inputLicense = "";

    string numChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    void Awake()
    {
        #region 获取随机秘钥
        for (int i = 0; i < 16; i++)
        {
            keys += numChar.Substring(Random.Range(0, 61), 1);
        }
        Debug.Log("keys: " + keys);
        #endregion
    }

	// Use this for initialization
	void Start ()
    {

        #region 系统根据密钥自动得出的注册码
        string outLicense = "";
        for (int i = 0; i < 16; i++)
        {
            outLicense += AESEncryption.AESEncrypt("AEROSPACE", keys)[i].ToString("X");
        }
        Debug.Log("outLicense: " + outLicense);
        #endregion

        #region 注册码进行对比
        if (inputLicense == outLicense)
        {
            Debug.Log("验证通过");            
        }
        else
        {
            Debug.Log("验证未通过");
        }
        #endregion

    }
	
	// Update is called once per frame
	void Update () {
	
	}
}


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是UnityAES加密和解密的示例代码: 加密代码: ```csharp using System.Security.Cryptography; using UnityEngine; public static class AESEncryption { private static readonly byte[] Key = new byte[16] { 215, 254, 100, 91, 10, 69, 23, 146, 12, 175, 237, 65, 38, 205, 85, 111 }; private static readonly byte[] IV = new byte[16] { 183, 221, 44, 251, 126, 7, 77, 234, 154, 150, 97, 24, 165, 2, 153, 201 }; public static string Encrypt(string plainText) { byte[] encrypted; using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Key; aesAlg.IV = IV; ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (System.IO.MemoryStream msEncrypt = new System.IO.MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (System.IO.StreamWriter swEncrypt = new System.IO.StreamWriter(csEncrypt)) { swEncrypt.Write(plainText); } encrypted = msEncrypt.ToArray(); } } } return System.Convert.ToBase64String(encrypted); } } ``` 解密代码: ```csharp using System.Security.Cryptography; using UnityEngine; public static class AESEncryption { private static readonly byte[] Key = new byte[16] { 215, 254, 100, 91, 10, 69, 23, 146, 12, 175, 237, 65, 38, 205, 85, 111 }; private static readonly byte[] IV = new byte[16] { 183, 221, 44, 251, 126, 7, 77, 234, 154, 150, 97, 24, 165, 2, 153, 201 }; public static string Decrypt(string cipherText) { byte[] cipherBytes = System.Convert.FromBase64String(cipherText); using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Key; aesAlg.IV = IV; ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (System.IO.MemoryStream msDecrypt = new System.IO.MemoryStream(cipherBytes)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (System.IO.StreamReader srDecrypt = new System.IO.StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } } } ``` 注意:这个示例代码的密钥和向量都是为了演示而写死的,请根据实际需求使用更安全的方式生成密钥和向量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值