PHP使用AES256(cbc)加密JAVA应该怎么解密

wrxangeline 2016-07-13 09:38:14
PHP中使用AES256(cbc)给数据加密,方法是mcrypt_generic,我的java解密代码:

public class Aes256Encryptor {

private static final byte[] iv = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

private static final String transform = "AES/CBC/NoPadding";

private static final String algorithm = "AES";

private static SecretKeySpec keySpec;

private static BASE64Decoder base64Decoder = new BASE64Decoder();

private static BASE64Encoder base64Encoder = new BASE64Encoder();


/**
*/
public static String decrypt(String pHexText, String key) throws Exception {

Cipher cipher = Cipher.getInstance(transform);

keySpec = new SecretKeySpec(key.getBytes(), algorithm);

byte[] encryptedBytes = base64Decoder.decodeBuffer(pHexText);

cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));

byte[] decryptedBytes = cipher.doFinal(encryptedBytes);


String result = new String(decryptedBytes); // encryptedBytes

return result.trim();

}
}


我使用相同的密钥解密后是乱码,不知道问题出在哪了?
...全文
1409 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrxangeline 2016-07-13
  • 打赏
  • 举报
回复
引用 1 楼 qq_15915835 的回复:
查查2个地方 1. base64解码直接的二进制是否是php加密的二进制数据(base64有可能因为标准不同编码/解码的数据不一样 2. php的aes cbc算法用的是什么填充模式。看你代码java这面试nopadding的。
php中是用 chr(0)填充的,iv向量是我觉得最奇怪的地方,PHP中是32位,而java里必须是16位的,这里不太明白,在网上也查了好多资料,但还是没弄懂,您知道是什么原因吗?
qq_15915835 2016-07-13
  • 打赏
  • 举报
回复
还有你的iv向量用的是一样的吗。你这里怎么直接写死了一个向量
qq_15915835 2016-07-13
  • 打赏
  • 举报
回复
查查2个地方 1. base64解码直接的二进制是否是php加密的二进制数据(base64有可能因为标准不同编码/解码的数据不一样 2. php的aes cbc算法用的是什么填充模式。看你代码java这面试nopadding的。
qq_15915835 2016-07-13
  • 打赏
  • 举报
回复
算法和语言没有关系。算法都是固定的。 这里有2个地方不同了我觉得是影响结果的地方。 一是填充模式,加密的时候使用了0填充,而解密的时候用了nopadding,要求解密的数据必须的对齐的,这样解密的数据可能需要你手动处理一下把填充的数据去掉。 二是你的iv向量不一样啊。php不了解,没有16的?要不用一下ECB算法试一下。这个不用向量。看看能不能解密出来

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧