我正在研究一种加密系统,可以将数据传递给第三方应用程序。加密是用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>有没有人知道可能会发生什么?
发布于 2012-05-04 23:32:36
由于两个加密字符串都以相同的字符开头,因此看起来您在一个字符串中使用ECB,而在另一个字符串中使用CBC。
发布于 2012-05-04 22:50:21
以下是一些备注:
This document可以帮助您:您拥有密码/块密码模式/填充模式/密钥大小的所有有效组合。
发布于 2012-05-04 22:58:51
下面这个(在PHP中解密)怎么样:
$toDecrypt = "TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==";
$decrypt = openssl_decrypt(base64_decode($toDecrypt),"AES256","key-32-char-long");
echo $decrypt;您应该解密base64解码的字符串,对于解密,您应该调用openssl_decrypt而不是openssl_encrypt :-)
https://stackoverflow.com/questions/10451068
复制相似问题