unity3d与flash交互、aes加密解密

众所周知,unity在2013年就放弃flash了,但是有时候,真的会需要到flash,比如web端需要unity web player插件,很多浏览器都拦截了,flash倒不会,因为他是微软的。

u3d在打包flash的时候api是不可以修改的,默认就是flash的api,打包出来就是as(ActionScript代码)编译。所以很多net2.0的api都不能使用,比如System.Security.Cryptography这个库,注:这个库是C#集成好的加密解密

u3d导出flash会报错,因为不支持

资源加密在任何平台任何程序下都是常见的,我这里使用的AES加密。大部分平台都集成了加密解密库,

flash的as加密解密库,下载地址:as crypt 其中很多种方式加密解密。比如
aes、des等等,我使用的aes加密解密

在assets下新建ActionScript文件夹,把下载as加密解密库的放进去,

测试用例,

c#代码

using UnityEngine;
using System.Collections;

[NotConverted]
[NotRenamed]
public static class AesCtypt {
	[NotRenamed]
	public static string response = "5";
	[NotRenamed]
	public static byte[] AESDecrypt(byte[] cipherText, string strKey,byte[] _key1)
	{
return null;
}

这个是u3d的脚本语言,解密用,

[NotConverted]

[NotRenamed]

这个标示说明当前类打包编译的时候,不编译成打包环境脚本,保留原脚本,但是这个也不会被执行,下边说为什么不执行

package
{

	import flash.utils.ByteArray;
	import System.CLIArrayFactory;
	import System.CLIByteArray;
	import com.hurlant.util.Hex;
	import com.hurlant.crypto.symmetric.IPad;
	import com.hurlant.crypto.symmetric.ICipher;
	import com.hurlant.crypto.symmetric.IVMode;
	import com.hurlant.crypto.symmetric.NullPad;
	import com.hurlant.crypto.Crypto;

	public class AesCtypt
	{
		public static var response : String = "";
		public function AesCtypt()
		{
		}

		public static function AESDecrypt(DesByteData:CLIByteArray,SECRET_KEY:String,SECRET_IV:CLIByteArray):CLIByteArray
		{
   			var inputBA:ByteArray= DesByteData.elements;
    		var key:ByteArray = Hex.toArray(Hex.fromString(SECRET_KEY));
    		var pad:IPad = new NullPad();
    		var aes:ICipher = Crypto.getCipher("aes-cbc", key, pad);
    		var ivmode:IVMode = aes as IVMode;
    		ivmode.IV = SECRET_IV.elements;
    		aes.decrypt(inputBA);
    		var aesbytedata:CLIByteArray = new CLIByteArray();
			aesbytedata.elements= inputBA;
    		return  aesbytedata;
		}
	}
}

这是flash端的as脚本,跟C#端的脚本方法变量完全相同,因为打包完成后,会调用as脚本,不会再调用C#的东西了,在unity实现脚本,就是为了不报错,和本地测试使用,打出包后,他调用的就是as代码了。加密跟解密一样直接调用aes.encrypt方法就可以了

测试用例

using UnityEngine;
using System.Collections;

public class LoadFlashAssets : MonoBehaviour {
	string str = "";
	public void OnGUI()
	{
		if(GUI.Button(new Rect(220,10,100,25), "Calculate"))
		{
			string path = "http://100.0.0.0:10001/assets/test.u3d”;//资源路径地址
				StartCoroutine(LoadFlashAsset(path));
		}
		GUI.Label(new Rect(220,100,200,200),str);
	}
	private string key_3D = “你的密码”;
	IEnumerator LoadFlashAsset(string path)
	{
		WWW loader = new WWW(path);
		yield return loader;
		if (loader.error == null && loader.isDone)
		{
			AssetBundleCreateRequest request = null;
			AssetBundle bundle = null;

			byte[] _key1 = { 这里是你的iv密匙 };
			byte[] decryptedDatas = AesCtypt.AESDecrypt(loader.bytes, key_3D,_key1);
			int length = System.Convert.ToInt32(decryptedDatas[decryptedDatas.Length - 1]);
			byte[] decryptedData = new byte[decryptedDatas.Length - 1 - length];
			for(int i = 0; i < decryptedData.Length; i ++)
			{
				decryptedData[i] = decryptedDatas[i];
			}
			request = AssetBundle.CreateFromMemory(decryptedData);
			yield return request;
			bundle = request.assetBundle;
			if (bundle != null)
			{
				GameObject obj = GameObject.Instantiate(bundle.mainAsset) as GameObject;
			}
		}
	}

}

这样u3d导出flash的时候,就能实现u3d在flash环境下的加密解密,研究了大概三天才搞定,语言表达能力有限,写的看不明白的朋友大家留言交流

时间: 2024-08-06 05:00:58

unity3d与flash交互、aes加密解密的相关文章

AJAX+REA实现前后台数据交互的加密解密

AJAX+REA实现前后台数据交互的加密解密 1.创建js文件Encryption.js /**  * 加密解密  */ /** RSA加密用 生成key */ function bodyRSA(){ /** 1024位的key参数写130,2014位的key参数写260 */ setMaxDigits(130); /** ajax 调用后台方法,取回公钥 */ var keyR ;     $.ajax({      url: "/GHGL/Key/pk",//请求后台的url,本例

非对称技术栈实现AES加密解密

非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的,这就要求在前端和后端不同的技术栈上完成信息的加密解密.当然我们通常完成这样专业的功能都会考虑使用相应的框架或者程序库来完成功能,前端或者NodeJS平台通常是JavaScript语言,JavaScript主流的加密解密库分别是SjclJS和CryptoJS, 本文以CryptoJS为例进行讨论.另

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

AES加密解密&amp;amp;&amp;amp;SHA1、SHA加密&amp;amp;&amp;amp;MD5加密

AES加密解密 SHA1.SHA加密 MD5加密 二话不说立即附上代码: package com.luo.util; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.

java使用AES加密解密 AES-128-ECB加密

http://www.cnblogs.com/chen-lhx/p/5817161.html ************************************************* import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * * @author Administrator * */ pub

C# AES加密解密

完整代码: /****************************************************************** * 创建人:HTL * 创建时间:2015-04-17 17:36:35 * 说明:C# AES加密解密 * Email:[email protected] *******************************************************************//* using System; using System

JAVA中使用AES加密解密

技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info("[rsaTest获取请求:{}]", str); try { String encryptResult = AESUtil.encrypt(str, "123456"); log.info("[AES加密后的参数为:{}]", encryptResult

Java 关于密码处理的工具类[MD5编码][AES加密/解密]

项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从编码后的字符串反推回去的. MD5的方法是基于散列的.本身信息不全.理论上是不能还原成唯一字符串的. 网上所谓的解密,也只是拥有一个足够大的字典映射,将编码前的源字符和编码后的目标字符关联起来而已,大多数常见的还行,复杂点的估计就会话费很长时间,有兴趣的可以试试. 至于MD5的用法,在初次录入的时候

ruby AES加密解密

最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以就自己写了加密解密方法. AES 加密 def aes_encrypt(key, encrypted_string) aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB") aes.encrypt aes.key = key txt = aes.u