unity MD5/AES加密

本文转载自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中调用使用.如下
using System;
namespace MyEncryptionNamespace
{
    /// <summary>
    /// aes 加密
    /// </summary>
    public class MyEncryption
    {
        /// <summary>
        /// 32位密钥
        /// </summary>
        public static string key;
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name=”toEncrypt”> 被加密数据 </param>
        /// <returns></returns>
        public static string Encrypt( string toEncrypt)
        {
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(key);
            Byte [] toEncryptArray = System.Text. UTF8Encoding .UTF8.GetBytes(toEncrypt);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateEncryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert .ToBase64String(resultArray, 0, resultArray.Length);
        }
        /// <summary>
        /// 加密密码
        /// </summary>
        /// <param name=”toEncrypt”> 被加密数据 </param>
        /// <returns></returns>
        public static string EncryptPassword( string toEncrypt)
        {
            string keyForPassword = “qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq” ;
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(keyForPassword);
            Byte [] toEncryptArray = System.Text. UTF8Encoding .UTF8.GetBytes(toEncrypt);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateEncryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert .ToBase64String(resultArray, 0, resultArray.Length);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name=”toDecrypt”> 被解密数据 </param>
        /// <returns></returns>
        public static string Decrypt( string toDecrypt)
        {
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(key);
            Byte [] toDecryptArray = Convert .FromBase64String(toDecrypt);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateDecryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
            return System.Text. UTF8Encoding .UTF8.GetString(resultArray);
        }
    }
}
生成dll到untiy中,加密解密正常运行…
然后将加密类型修改为加密byte[]类型,代码如下:
using System;
namespace HiAES
{
    public class MyAES
    {     /// <summary>
        /// 32位密钥
        /// </summary>
        public static string key;
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name=”toEncrypt”> 需要被加密的数据 </param>
        /// <returns></returns>
        public static byte [] Encrypt( byte [] toEncrypt)
        {
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(key);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateEncryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
            return resultArray;
        }
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name=”toEncrypt”> 需要被加密的数据 </param>
        /// <returns></returns>
        public static byte [] EncryptPassword( byte [] toEncrypt)
        {
            string keyForPassword = “qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq” ;
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(keyForPassword);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateEncryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toEncrypt, 0, toEncrypt.Length);
            return resultArray;
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name=”toDecrypt”> 需要被解密的数据 </param>
        /// <returns></returns>
        public static byte [] Decrypt( byte [] toDecrypt)
        {
            Byte [] keyArray = System.Text. UTF8Encoding .UTF8.GetBytes(key);
            System.Security.Cryptography. RijndaelManaged aes = new System.Security.Cryptography. RijndaelManaged ();
            aes.Key = keyArray;
            aes.Mode = System.Security.Cryptography. CipherMode .ECB;
            aes.Padding = System.Security.Cryptography. PaddingMode .PKCS7;
            System.Security.Cryptography. ICryptoTransform cTransform = aes.CreateDecryptor();
            Byte [] resultArray = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
            return resultArray;
        }
    }
}
在unity3d中添加命名空间myaesencryption调用如下:
     void Start()
    {
        MyEncryption .key = “00000000000000000000000000ww00qq” ;
        string temp = “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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值