我有一個不同的結果之間java和php方法在做AES128零填充和沒有IV加密。不同的AES128與零填充加密結果之間的PHP和Java
這裏PHP代碼:
<?php
$ptaDataString = "secretdata";
$ptaDataString = encryptData($ptaDataString);
$ptaDataString = base64_encode($ptaDataString);
function encryptData($input) {
$ptaKey = 'secret';
$iv = "\0";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $ptaKey, $input, MCRYPT_MODE_CBC, $iv);
return $encrypted;
}
echo $ptaDataString;
?>
這裏是Java代碼:
public static String encrypt() throws Exception {
try {
String data = "secretdata";
String key = "secret0000000000";
String iv = "0000000000000000";
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
return new sun.misc.BASE64Encoder().encode(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
PHP導致:kjgE5p/3qrum6ghdjiVIoA ==
的Java由此而來:zLKhVMksRRr1VHQigmPQ2Q ==
任何幫助,將不勝感激,謝謝
最好不要使用mcrypt,它已經放棄了近十年的時間了。因此它已被棄用,並將在PHP 7.2中從核心和PECL中刪除。它不支持標準的PKCS#7(néePKCS#5)填充,只有非標準的null填充甚至不能用於二進制數據。 mcrypt有許多可以追溯到2003年的突出錯誤。相反,考慮使用[defuse](https://github.com/defuse/php-encryption)或[RNCryptor](https://github.com/RNCryptor),它們提供了一個完整的解決方案,正在維護和正確。 – zaph 2017-01-25 16:31:06