我有一段PHP代码
function encrypt($data){
$data = "{\"userId\":11,\"email\":\"ssss.bansa11l1989@gmail.com\",\"firstName\":\"Ankit\",\"lastName\":\"Bansal\",\"displayName\":\"banank1989\",\"visitorId\":\"1222222234455\"}";
$td = mcrypt_module_open('rijndael-128', '', 'cbc', $this->iv);
mcrypt_generic_init($td, $this->key, $this->iv);
$encrypted = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return bin2hex($encrypted);
}
现在,当我尝试在Java中编写相同的代码时,它会为我提供不同的输出
public String encrypt(String value) {
try {
value="{\"userId\":11,\"email\":\"ssss.bansa11l1989@gmail.com\",\"firstName\":\"Ankit\",\"lastName\":\"Bansal\",\"displayName\":\"banank1989\",\"visitorId\":\"1222222234455\"}";
String initVector = "fedcba9876111111";
String key = "012345678911111";
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 new String(Base64.encodeBase64(encrypted));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
现在的问题是,对于相同的JSON,两个代码都给了我不同的结果。
我无法更改PHP代码,因此必须更改JAVA代码。
答案 0 :(得分:1)
Java和PHP代码不同:
mcrypt
的默认填充(请参见here)。相反,在Java代码中使用PKCS7-Padding(在Java中也称为PKCS5)。要在Java代码中使用零字节填充,请首先通过将AES/CBC/PKCS5PADDING
替换为AES/CBC/NoPadding
来停用PKCS7填充。其次,手动实现零字节填充,即将n
0值(带有0 <= n < 16
)添加到消息的字节序列中,直到长度对应于块大小的整数倍(16字节)。 通过这些更改,如果使用相同的密钥和相同的IV,则Java和PHP代码将产生相同的结果(顺便说一下,Java代码中的密钥长度为15个字节,这导致{{1 }}。
请注意mcrypt
is deprecated和Zero-Byte-Padding isn't reliable。如果您选择更改填充,则最好使用PKCS7。
答案 1 :(得分:-1)
您可以将代码运行的结果与http://www.maidoupig.cn/encode/aes的结果进行比较