【发布时间】:2013-01-28 12:36:25
【问题描述】:
到目前为止一直在逃避我的快速(漫长的夜晚)。我正在比较 PHP 与 Java 中的 AES256 并注意到差异。为简单起见,请忽略 ascii 键和 null IV,它们将在生产中被替换。但我需要先克服这个问题,但我不知道我错在哪里:
PHP:
echo base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
"1234567890ABCDEF1234567890ABCDEF",
"This is a test",
MCRYPT_MODE_CBC,
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
)
);
Java
byte[] key = "1234567890ABCDEF1234567890ABCDEF".getBytes("UTF-8");
byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec newKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
byte[] results = cipher.doFinal("This is a test".getBytes("UTF-8"));
return Base64.encodeToString(results,Base64.DEFAULT);
PHP 输出:0KwK+eubMErzDaPU1+mwTQ==
Java 输出:DEKGJDo3JPtk48tPgCVN3Q==
不完全是我所期待的 o_O !
我也尝试过MCRYPT_MODE_CBC、MCRYPT_MODE_CFB、MCRYPT_MODE_ECB、MCRYPT_MODE_NOFB 等。它们都没有生成 Java 字符串。
【问题讨论】:
-
你试过把
Cipher.getInstance("AES");改成Cipher.getInstance("AES/CBC/NoPadding"); -
Yezzir, "AES/CBC/NoPadding" 产生 IllegalBlockSizeException:数据未对齐块大小。 “AES/CBC/PKCS5Padding”产生“DEKGJDo3JPtk48tPgCVN3Q==”,“AES/CBC/PKCS7Padding”也是如此。
-
这对我来说太愚蠢了,如果没有填充,您必须确保您提供的是块大小的倍数。我将发布一个我认为是解决方案的答案。
标签: java php encryption aes