我正在寻找一种在 Java 中加密字符串并在 PHP 中解密的方法。我发现this http://www.logikdev.com/2010/11/01/encrypt-with-php-decrypt-with-java/在 Stackoverflow 上的某个答案中,我修改了它以执行完全相反的操作。
这是我用 Java 加密的代码:
public static String encrypt(String data, String initialVectorString, String secretKey) {
String encryptedData = null;
try {
SecretKeySpec skeySpec = new SecretKeySpec(md5(secretKey).substring(0, 16).getBytes(), "AES");
IvParameterSpec initialVector = new IvParameterSpec(initialVectorString.getBytes());
Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, initialVector);
byte[] encrypted = cipher.doFinal(data.getBytes());
byte[] base64encrypted = (new org.apache.commons.codec.binary.Base64()).encode(encrypted);
encryptedData = new String(base64encrypted, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return encryptedData;
}
这是我用 PHP 解密的代码:
function decrypt($message, $initialVector, $secretKey) {
return (
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
substr(md5($secretKey), 0, 16),
base64_decode($message),
MCRYPT_MODE_CFB,
$initialVector
)
);
}
密钥和初始向量每次都会改变。
该代码在 90% 的情况下都有效,但有时它只能部分解密字符串,其余字符不可读,如下所示:Microsoft Windows [Version 10.0.1��×
应该说Microsoft Windows [Version 10.0.14393]
。我修改代码有什么错误吗?
编辑:我可能需要添加使用上面链接中的代码在 Java 中解密确实有效。
EDIT2:找到答案,这是一个愚蠢的错误,PHP 将 Base64 加密字符串中的 + 作为空格。感谢您的所有帮助,我仍然会使用它。