Vấn đề của tôi là: những gì tôi mã hóa trong Java tôi có thể giải mã hoàn hảo trong Java, nhưng PHP mcrypt
không thể giải mã được. Những gì tôi mã hóa với mcrypt
Tôi có thể giải mã với mcrypt
, nhưng không thể bằng Java.Không thể trao đổi dữ liệu được mã hóa với AES-256 giữa Java và PHP
Tôi muốn gửi và nhận dữ liệu được mã hóa từ một ứng dụng Java đến một trang PHP, vì vậy tôi cần nó tương thích.
Dưới đây là những gì tôi có ...
JAVA ...
public static String crypt(String input, String key){
byte[] crypted = null;
try{
SecretKeySpec skey = new SecretKeySpec(Base64.decodeBase64(key), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
}catch(Exception e){
}
return Base64.encodeBase64String(crypted);
}
public static String decrypt(String input, String key){
byte[] output = null;
try{
SecretKeySpec skey = new SecretKeySpec(Base64.decodeBase64(key), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skey);
output = cipher.doFinal(Base64.decodeBase64(input));
}catch(Exception e){
}
return new String(output);
}
Chạy:
public static void main(String[] args) {
String key = "Zvzpv8/PXbezPCZpxzQKzL/FeoPw68jIb+NONX/LIi8=";
String data = "example";
System.out.println(Cpt.decrypt(Cpt.crypt(data, key), key));
}
Output:
example
PHP ...
function getEncrypt($sStr, $sKey) {
return base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$sKey,
$sStr,
MCRYPT_MODE_ECB
)
);
}
function getDecrypt($sStr, $sKey) {
return mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$sKey,
base64_decode($sStr),
MCRYPT_MODE_ECB
);
}
Chạy:
$crypt = getDecrypt(getEncrypt($str, $key), $key);
echo "<p>Crypt: $crypt</p>";
Output:
Crypt: example�������������������������
Sử dụng PHP để crypt "dụ" với chìa khóa "Zvzpv8/PXbezPCZpxzQKzL/FeoPw68jIb + NONX/LIi8 =" Tôi nhận được "YTYhgp4zC + w5IsViTR5PUkHMX4i7JzvA6NJT1FqhoGY = ". Sử dụng Java để mã hóa cùng một điều với cùng một khóa tôi nhận được "+ tdAZqTE7WAVPXhB3Tp5 + g ==".
Tôi mã hóa và giải mã thành base64 theo thứ tự đúng và tôi đã thử nghiệm mã hóa base64 và khả năng tương thích giải mã giữa Java và PHP và nó hoạt động.
Tôi thấy, tôi đã phát hiện ra điều đó, nhưng tôi nghĩ tôi đã sử dụng AES-128. Vì vậy, nó thực sự là 256. Về những dòng này, tôi đã làm điều đó bởi vì tôi chắc chắn rằng dữ liệu được mã hóa sẽ luôn luôn chỉ chứa các chuỗi và không có dữ liệu nhị phân. – LZZ