unity MD5/AES加密

来源:互联网 发布:安卓限速软件 编辑:程序博客网 时间:2024/05/19 22:00
本文转载自https://hiramtan.wordpress.com



第一部分,MD5加密:
涉及到账号密码加密,以为是规定一个密钥,客户端根据密钥加密后传输给服务器,服务器根据密钥解密后验证密码是否正确,这样的话后端程序完全了解客户的帐号密码是多少.或者是已这种方式实现:客户端加密账号密码后发送给服务端,服务端存储玩家的账号密码的密文,登陆时验证玩家的密文就可以.

最常用的是md5加密,visual中代码如下:
using System.Text;
namespace Md5NamaSpace
{
    public class MyMd5
    {
        /// <summary>
        /// md5加密方法
        /// </summary>
        /// <param name=”tempString”>需要加密的字符串 </param>
        /// <returns></returns>
        public static string StringToMd5(string tempString)
        {
            System.Security.Cryptography. MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] bs = Encoding.UTF8.GetBytes(tempString);
            byte[] hs = md5.ComputeHash(bs);
            return System. BitConverter.ToString(hs).Replace( “-“, “”);
        }
    }
}
然后打包成dll,复制到unity的asset文加件下,在unity中引用命名空间,直接调用类中的方法就可以了:
using UnityEngine;
using System.Collections;
using Md5NamaSpace;
using System.Text;
public class test : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        string test = MyMd5.StringToMd5(“nihao”);
        Debug.Log(test);
    }
}
debug出来的信息就是nihao的md5加密后的值.
 
第二部分,AES加密:
使用unity中的socket传输游戏中的数据,必定要做加密解密功能,本次采用的是aes加密(des升级版),封装dll然后unity3d中调用使用.如下
usingSystem;
namespaceMyEncryptionNamespace
{
   ///<summary>
   ///aes 加密
   ///</summary>
   publicclassMyEncryption
    {
       ///<summary>
       ///32位密钥
       ///</summary>
       publicstaticstringkey;
       ///<summary>
       ///加密
       ///</summary>
       ///<param name=”toEncrypt”>被加密数据</param>
       ///<returns></returns>
       publicstaticstringEncrypt(stringtoEncrypt)
        {
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(key);
           Byte[] toEncryptArray =System.Text.UTF8Encoding.UTF8.GetBytes(toEncrypt);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateEncryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
           returnConvert.ToBase64String(resultArray, 0, resultArray.Length);
        }
       ///<summary>
       ///加密密码
       ///</summary>
       ///<param name=”toEncrypt”>被加密数据</param>
       ///<returns></returns>
       publicstaticstringEncryptPassword(stringtoEncrypt)
        {
           stringkeyForPassword =“qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq”;
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(keyForPassword);
           Byte[] toEncryptArray =System.Text.UTF8Encoding.UTF8.GetBytes(toEncrypt);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateEncryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
           returnConvert.ToBase64String(resultArray, 0, resultArray.Length);
        }
       ///<summary>
       ///解密
       ///</summary>
       ///<param name=”toDecrypt”>被解密数据</param>
       ///<returns></returns>
       publicstaticstringDecrypt(stringtoDecrypt)
        {
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(key);
           Byte[] toDecryptArray =Convert.FromBase64String(toDecrypt);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateDecryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
           returnSystem.Text.UTF8Encoding.UTF8.GetString(resultArray);
        }
    }
}
生成dll到untiy中,加密解密正常运行…
然后将加密类型修改为加密byte[]类型,代码如下:
usingSystem;
namespaceHiAES
{
   publicclassMyAES
    {    ///<summary>
       ///32位密钥
       ///</summary>
       publicstaticstringkey;
       ///<summary>
       ///加密
       ///</summary>
       ///<param name=”toEncrypt”>需要被加密的数据</param>
       ///<returns></returns>
       publicstaticbyte[] Encrypt(byte[] toEncrypt)
        {
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(key);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateEncryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
           returnresultArray;
        }
       ///<summary>
       ///加密
       ///</summary>
       ///<param name=”toEncrypt”>需要被加密的数据</param>
       ///<returns></returns>
       publicstaticbyte[] EncryptPassword(byte[] toEncrypt)
        {
           stringkeyForPassword =“qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq”;
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(keyForPassword);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateEncryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
           returnresultArray;
        }
       ///<summary>
       ///解密
       ///</summary>
       ///<param name=”toDecrypt”>需要被解密的数据</param>
       ///<returns></returns>
       publicstaticbyte[] Decrypt(byte[] toDecrypt)
        {
           Byte[] keyArray =System.Text.UTF8Encoding.UTF8.GetBytes(key);
            System.Security.Cryptography.RijndaelManagedaes =newSystem.Security.Cryptography.RijndaelManaged();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography.CipherMode.ECB;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            System.Security.Cryptography.ICryptoTransformcTransform = aes.CreateDecryptor();
           Byte[] resultArray = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
           returnresultArray;
        }
    }
}
在unity3d中添加命名空间myaesencryption调用如下:
    voidStart()
    {
       MyEncryption.key =“00000000000000000000000000ww00qq”;
       stringtemp =“i am client”;
       byte[] data =System.Text.Encoding.UTF8.GetBytes(temp);
       byte[] tempdata =MyEncryption.Encrypt(data);//加密
       byte[] tempdata2 =MyEncryption.Decrypt(tempdata);//解密
       Debug.Log(System.Text.Encoding.UTF8.GetString(tempdata2));
    }
加密解密过程运算正常…
support: hiramtan@qq.com
Advertisements
原创粉丝点击