実際にはそれほど楽しくはありませんでしたが、なんとかできました(これは私だけではなかったので、私たちと言うべきです)。暗号化は私の得意分野ではありません。えー、すべてがあなたの得意分野になるわけではないので、私はそれを受け入れます。ハッシュ関数、公開鍵、対称暗号など、学ぶべきことが多すぎます。私たちがやりたかったのは、As3 側でデータを暗号化し、php 側で復号化することでした。 as3corelib にいくつかの暗号アルゴリズムがあることは知っていましたが、それらのどれも (MD5、SHA-1) は私たちのニーズに適合しませんでした。もう 1 つ優れた暗号化ライブラリがあり、それが as3Crypto です。問題は、移動するのが少し難しいことであり、選択肢がたくさんあります。私たちは AES (Advanced Encryption Standard) に落ち着きました。動作させるために 2 時間試した後、Google グループでこの素晴らしい投稿を見つけました(ページの中央あたり)。人々が見つけやすいように、ここにコンテンツをコピーします。この投稿のすべての功績は、コードを投稿した Jason Foglia に与えなければなりません。
As3 クラスは次のとおりです:
package{ import flash.display.Sprite; import flash.utils.ByteArray; import com.hurlant.crypto.symmetric.ICipher; import com.hurlant.crypto.symmetric.IVMode; import com.hurlant.crypto.symmetric.IMode; import com.hurlant.crypto.symmetric.NullPad; import com.hurlant.crypto.symmetric.PKCS5; import com.hurlant.crypto.symmetric.IPad; import com.hurlant.util.Base64; import com.hurlant.util.Hex; import com.hurlant.crypto.Crypto; public class CryptoCode extends Sprite { private var type:String='simple-des-ecb'; private var key:ByteArray; public function CryptoCode() { init(); } private function init():void { key = Hex.toArray(Hex.fromString('TESTTEST'));// can only be 8 characters long trace(encrypt('TEST TEST')); trace(decrypt(encrypt('TEST TEST')); } private function encrypt(txt:String = ''):String { var data:ByteArray = Hex.toArray(Hex.fromString(txt)); var pad:IPad = new PKCS5; var mode:ICipher = Crypto.getCipher(type, key, pad); pad.setBlockSize(mode.getBlockSize()); mode.encrypt(data); return Base64.encodeByteArray(data); } private function decrypt(txt:String = ''):String { var data:ByteArray = Base64.decodeToByteArray(txt); var pad:IPad = new PKCS5; var mode:ICipher = Crypto.getCipher(type, key, pad); pad.setBlockSize(mode.getBlockSize()); mode.decrypt(data); return Hex.toString(Hex.fromArray(data)); } } }
php クラスは次のとおりです:
<?class Crypt{ var $key = NULL; var $iv = NULL; var $iv_size = NULL; function Crypt() { $this->init(); } function init($key = "") { $this->key = ($key != "") ? $key : ""; $this->algorithm = MCRYPT_DES; $this->mode = MCRYPT_MODE_ECB; $this->iv_size = mcrypt_get_iv_size($this->algorithm, $this->mode); $this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND); } function encrypt($data) { $size = mcrypt_get_block_size($this->algorithm, $this->mode); $data = $this->pkcs5_pad($data, $size); return base64_encode(mcrypt_encrypt($this->algorithm, $this->key, $data, $this->mode, $this->iv)); } function decrypt($data) { return $this->pkcs5_unpad(rtrim(mcrypt_decrypt($this->algorithm, $this->key, base64_decode($data), $this->mode, $this->iv))); } function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); }} ?>
1 つの暗号化メソッドを使用すると、データをもう 1 つのメソッドに送信し、同じキーを使用すれば他の言語で復号化できます。まるで魔法のように機能します。キーの長さは 8 文字のみであるという記述がありますが、私はそれをテストしていません。