加密/解密-编码/解码与JAVA相当的PHP
有谁能解释一下PHP代码,并给我一些关于如何在Java中移植代码的提示吗 以下是PHP代码:加密/解密-编码/解码与JAVA相当的PHP,java,php,encryption,encoding,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 $d
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;
}
好的,我会咬人,但我会让你做编码:
:删除PHP使用的死板的零填充(0..15字节的零),这将使明文x倍于CBC所需的块大小。你必须自己编程,因为它不在Bouncy Castle中,所以不要使用任何填充模式。只需删除解密明文右侧的零值字节rtrim(x,“\0”)
:可能有人认为这意味着AES-256,但事实并非如此。它是Rijndael,块大小为256位。您需要Java中的Bouncy Castle LIB来解密密码的非标准部分mcrypt\u decrypt(mcrypt\u RIJNDAEL\u 256)
有人需要256位的密钥材料,认为MD5值在密码上的十六进制编码已经足够好了。它不是,因为它只提供一半的熵(每个字节2个十六进制字符)。MD5不是一个密码散列函数,这一事实充其量只能说明它是不真实的MD5($key)
:好吧,除了base64编码,如果密文需要以ASCII兼容文本的形式出现,这是可以的base64\u decode($encoded\u string)
:没关系,但由于PHP主要用作web语言,我预计该消息容易受到填充oracle/纯文本oracle攻击的攻击,当然,您应该预计密文的任何更改都无法检测到MCRYPT\u MODE\u CBC
:两次应用md5不会比零IV更安全,并且不要忘记每个函数执行的十六进制转换;幸运的是,这意味着IV至少是256位而不是128位md5(md5($key))
new BufferedBlockCipher(new RijndaelEngine(256))
在Bouncy Castle的轻量级API中
快乐的编码,你擅长Java,所以这应该是一件轻而易举的事。尽快升级,远离这一派胡言。鉴于您精通一种编程语言,这一被剪掉的代码的作用应该是相当明显的。任何不明显的函数调用。应该注意的是,编写此代码的人不了解密码,并且使用相同的IV加密多个项目-这使得加密有些无用。注意第二点:我猜Rijndael-256是一个扩展(12.)。只是javax没有为它提供实现。@ArtjomB。不,Rijndael-256由作者定义得很好——这不是问题所在,它还没有被NIST标准化为“高级加密标准”。请注意,您指的是提案。好的,标准化有点过分。除了建议之外,还有Rijndael的最终版本吗?+1用于升级,以摆脱这一派胡言。这是一种骇人听闻的密码滥用。@ArtjomB不是Rijndael的,但AES在NIST网站上提供的FIPS 197中是标准化的。