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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值