我正在研究一个将数据传递给第 3 方应用程序的加密系统。加密是用 Java 完成的,解密是用 PHP 完成的。尽管进行了多次尝试,但我无法让 PHP 应用程序打开加密的字符串。
出于测试目的,我创建了一个同样加密数据的 PHP 脚本,因此我可以比较 Java 和 PHP 加密的字符串。结果匹配到第 21 个字符,然后它们就不同了。这是我的:
// Java - Encrypt
private String EncryptAES(String text,String key) throws Exception
{
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(text.getBytes());
String encrypttext = new BASE64Encoder().encode(encrypted);
return encrypttext;
}
RESULT: TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==
和
// PHP - Encrypt
<?php
$encrypt = $crypt = openssl_encrypt($toCrypt,"AES256","key-32-char-long");
echo $encrypt;
?>
RESULT: TeUZAFxoFoQy/roPm5tXyC05wta1Z5YOXcq4OtgFoSbfVi/bHAuD6B5tDthT8EcGXQir08UAx0QvcqRJ2fJmbQ==
很明显,有些事情是正确的,因为部分字符串匹配,但显然不是所有的都是正确的,因为其余部分不匹配。此外,如果我尝试在 PHP 中解密 Java 字符串,则没有任何反应:
// PHP - Decrypt
<?php
$toDecrypt = "TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==";
$decrypt = openssl_decrypt($toDecrypt,"AES256","<key-32-char-long>");
echo $decrypt;
?>
RESULT: <nothing>
有人知道会发生什么吗?
最佳答案
由于两个加密字符串都以相同的字符开头,所以看起来您在一个中使用 ECB 而在另一个中使用 CBC。
关于java - Java 和 PHP 之间的加密不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10451068/