Java(Android)およびPHPで同じ暗号化/復号化を実行し、クライアント/サーバー通信。Base64エンコーディングを使用したAES-128暗号化は、JavaおよびPHPで長い文字列を使用しても同じ動作をしません
私は以下のコードを暗号化に使用していますが、何が問題なのか分かりません。同じキーと小さな文字列で両方を実行すると同じ暗号化値が生成されますが、長い文字列では2つの異なる結果が得られます。 PHP:
$str = 'test1234test1234';
$key = 'TESTKEYTESTKEY12';
$block = mcrypt_get_block_size('des', 'ecb');
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB));
とJavaで(Android上):
public static String encryptTest() {
String cleartext = "test1234test1234";
String key = "TESTKEYTESTKEY12";
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted;
encrypted = cipher.doFinal(cleartext.getBytes());
return new String(Base64.encode(encrypted,Base64.DEFAULT));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
がString test1234
でこれを実行するには与える:両方の実装で8i4KEe82TQl0Zdlc14fwAg==
を。 文字列ではtest1234test1234
ですが、PHPで4s5a0edsvwWt/3/enRe0wgJQD/0zL45NRb/r3p6L/Is=
、Javaで4s5a0edsvwWt/3/enRe0wgA0jk78zwWJr1xsosZbYUA=
と表示されます。私は何が間違っているのか分かりませんし、私は暗号について十分知識がありません。
これを言うためにPHPを変更するとどうなりますか? $ str。= str_repeat(chr(0)、$ pad); – Sparky