要在PHP 7中实现与Java AES加密兼容的加密和解密,你需要确保使用相同的加密算法、密钥长度、模式和填充方式。通常,Java中的AES加密使用的是AES/CBC/PKCS5Padding
模式。
以下是一个示例,展示如何在PHP 7中实现与Java AES加密兼容的加密和解密。
假设你在Java中使用以下代码进行AES加密:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESExample {
public static String encrypt(String key, String initVector, String value) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String decrypt(String key, String initVector, String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String key = "1234567890123456"; // 16 bytes key
String initVector = "1234567890123456"; // 16 bytes IV
String plaintext = "Hello, World!";
String encrypted = encrypt(key, initVector, plaintext);
System.out.println("Encrypted: " + encrypted);
String decrypted = decrypt(key, initVector, encrypted);
System.out.println("Decrypted: " + decrypted);
}
}
在PHP 7中,你可以使用openssl_encrypt
和openssl_decrypt
函数来实现与Java兼容的AES加密和解密。
<?php
function encrypt($key, $iv, $plaintext) {
// Ensure the key and IV are 16 bytes long
$key = substr(hash('sha256', $key, true), 0, 16);
$iv = substr(hash('sha256', $iv, true), 0, 16);
// Encrypt the plaintext
$ciphertext = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
// Return the base64 encoded ciphertext
return base64_encode($ciphertext);
}
function decrypt($key, $iv, $ciphertext) {
// Ensure the key and IV are 16 bytes long
$key = substr(hash('sha256', $key, true), 0, 16);
$iv = substr(hash('sha256', $iv, true), 0, 16);
// Decode the base64 encoded ciphertext
$ciphertext = base64_decode($ciphertext);
// Decrypt the ciphertext
$plaintext = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
return $plaintext;
}
$key = "1234567890123456"; // 16 bytes key
$iv = "1234567890123456"; // 16 bytes IV
$plaintext = "Hello, World!";
$encrypted = encrypt($key, $iv, $plaintext);
echo "Encrypted: " . $encrypted . "\n";
$decrypted = decrypt($key, $iv, $encrypted);
echo "Decrypted: " . $decrypted . "\n";
?>
AES/CBC/PKCS5Padding
对应PHP中的AES-128-CBC
模式,PHP会自动处理PKCS7填充(PKCS7是PKCS5的超集)。你可以将Java和PHP的加密结果进行对比,确保它们能够互相解密。
通过以上步骤,你可以在PHP 7中实现与Java AES加密兼容的加密和解密。