スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ActionscriptでAES暗号化してPHPで復号する

ActionscriptでAES暗号をかけて、PHP側で復号します。
さくっと終わるだろうと思ってたら意外とてこずりました。
暗号とか証明書関係のプログラムを組んでいると、バイナリが行き交うので内部で何やってるんだかよくわからなくなるんですよね。ほんの1バイトの違いで結果が全然かわってくるんで、どの段階で失敗したのかわかりにくいです。
以下プログラムです。

Actionscript

import com.hurlant.crypto.*;
import com.hurlant.crypto.symmetric.*;
import com.hurlant.util.*;

public function encrypt(name:String, k:String, s:String):String {
var key:ByteArray = Hex.toArray(Hex.fromString(k));
var data:ByteArray = Hex.toArray(Hex.fromString(s));
var pad:IPad = new PKCS5();
var cipher:ICipher = Crypto.getCipher(name, key, pad);
pad.setBlockSize(cipher.getBlockSize());
cipher.encrypt(data);
if(cipher is IVMode){
var ivmode:IVMode = cipher as IVMode;
return Base64.encodeByteArray(Hex.toArray(Hex.fromArray(data) + Hex.fromArray(ivmode.IV)));
} else {
return Base64.encodeByteArray(data);
}
}


PHP

function decode($text, $key) {
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$bytes = base64_decode($text);
$bytes_size = strlen($bytes);
$iv = substr($bytes, $bytes_size - $size);
$src = substr($bytes, 0, $bytes_size - $size);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $src, MCRYPT_MODE_CBC, $iv);
return rtrim( pkcs5_unpad($decrypted) );
}

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);
}

初期化ベクトルと暗号文を常に渡すのはめんどうだったので、暗号文の後ろに初期化ベクトルを付けました。
これでお互いやりとりする時に、二つのパラメーターでなく一つのパラメーターだけで済むようになります。

actionscriptのencryptの第一引数は文字列で"aes-128-cbc"です。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。