unity 3 dとflashのインタラクション、aes暗号解読

3804 ワード

周知のように、unityは2013年にflashを放棄したが、時には本当にflashが必要になることがある.例えば、web側にはunity web playerプラグインが必要で、多くのブラウザがブロックされている.flashはマイクロソフトだからだ.
u 3 dはflashをパッケージングする際にapiは修正できませんが、デフォルトはflashのapiで、パッケージングするとas(ActionScriptコード)コンパイルになります.だから多くのnet 2.0のapiはSystemなど使用できません.Security.Cryptographyこのライブラリ、注意:このライブラリはC#統合された暗号解読です
u 3 d 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;
}
u 3 dのスクリプト言語で、復号用です.
[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;
			}
		}
	}

}

このようにu 3 dがflashを導出する時、u 3 dのflash環境の下での暗号化の解読を実現することができて、大体3日間研究して完成して、言語の表現能力は有限で、書くのは分からない友达のみんなの伝言の交流を見ます