加密/解密 - 编码/解码PHP等效于JAVA

时间:2014-11-09 09:21:36

标签: java php encryption encoding

任何人都可以解释PHP代码并给我提示如何在Java中移植代码吗?

这是PHP代码:

function decode_string($encoded_string, $key) {
    $decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encoded_string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

    return $decoded;
}

1 个答案:

答案 0 :(得分:2)

好的,我会咬人,但我会让你做编码:

  • rtrim(x, "\0"):删除PHP使用的braindead零填充(0..15字节的零),这使得明文X倍于CBC所需的块大小。你必须自己编程,因为它不存在于Bouncy Castle中 - 所以不要使用任何填充模式。只需删除解密明文右侧的零值字节即可。
  • mcrypt_decrypt(MCRYPT_RIJNDAEL_256):可能有人认为这意味着AES-256,它不是。它是Rijndael,块大小为256位。您需要Java中的Bouncy Castle库来解密密码的非标准化部分
  • MD5($key)有人需要256位密钥材料,并认为MD5值的十六进制编码超过密码就足够了。它不是,因为它只提供一半的熵(每个字节2个十六进制字符)。那个以及MD5不是密码散列函数的事实使得这种情况充满了不诚实
  • base64_decode($encoded_string):好吧,期待base 64编码,如果如果密文需要作为ASCII兼容文本出现,那么
  • MCRYPT_MODE_CBC:没关系,但由于PHP主要用作网络语言,我希望该邮件易于填充oracle /纯文本oracle攻击,你当然应该期待任何密文的变更是不可检测的
  • md5(md5($key)):两次应用MD5并不能使它比零IV更安全,也不会忘记每个函数执行的十六进制转换;幸运的是,这确实意味着IV至少是256位而不是128位

所以你需要使用:

new BufferedBlockCipher(new RijndaelEngine(256))

在Bouncy Castle的轻量级API中。

快乐的编码,你在Java方面做得很好,所以这应该是轻而易举的。尽快升级远离这个彻头彻尾的垃圾。