任何人都可以解释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;
}
答案 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方面做得很好,所以这应该是轻而易举的。尽快升级远离这个彻头彻尾的垃圾。