iOS プロジェクトを Android に拡張しています。私の既存のアプリケーションは、AES 暗号化システムを使用して PHP 経由でサーバーと通信します。
PHP側で使用している関数は次のとおりです。
暗号化する
function cryptAESEncrypt($string,$key) {
$key = md5($key);
$iv = "1234567890123436"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
$data = $data = base64_encode($string);
$algorythm = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_ECB;
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);
return base64_encode($encrypted);
}
復号化
function cryptAESDecrypt($string,$key) {
$key = md5($key);
$iv = "1234567890123436"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
$data = base64_decode($string);
$algorythm = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_ECB;
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);
return base64_decode($decrypted);
}
プロセスの一般的な流れは次のとおりです。
- md5 ハッシュ
$key
(関係なく 16 文字にします) - Base64 エンコード
$string
- ECB モード (IV なし) で 128Bit AES/RIJNDAEL を使用して Base64'ed を暗号化します。
- 暗号化されたデータを Base64 し、文字列として返します。
復号化は同じように機能しますが、逆になります。
今、私はサンプルで遊んでいますが、あまり運がないようです. "test"
その関数を使用してPHPで文字列を暗号化しました("test"
キーもMD5に変換されました098f6bcd4621d373cade4e832627b4f6
)"ijzLe/2WgbaP+n3YScQSgQ=="
.
キーの長さが正しくないというエラーが発生したため、Java で試したことは機能しませんでしたが、前のスニペットの方がうまくいきました。とにかく私が持っていたものは次のとおりです。
String key = "test";
String in = "ijzLe/2WgbaP+n3YScQSgQ==";
SecretKeySpec skeySpec = new SecretKeySpec(md5(key).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encryptedByteArray = Base64.decode(in.getBytes(),0);
byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray);
String decryptedData = new String(Base64.decode(decryptedByteArray, 0));
Log.v("NOTE","Data: "+decryptedData);
私が言ったように、それはうまくいきません。私の質問は、私のJavaコードを提供されたPHPコードで動作させるのを手伝ってくれる人はいますか?