Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加密/解密-编码/解码与JAVA相当的PHP_Java_Php_Encryption_Encoding - Fatal编程技术网

加密/解密-编码/解码与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

有谁能解释一下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;
}

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

  • rtrim(x,“\0”)
    :删除PHP使用的死板的零填充(0..15字节的零),这将使明文x倍于CBC所需的块大小。你必须自己编程,因为它不在Bouncy Castle中,所以不要使用任何填充模式。只需删除解密明文右侧的零值字节
  • mcrypt\u decrypt(mcrypt\u RIJNDAEL\u 256)
    :可能有人认为这意味着AES-256,但事实并非如此。它是Rijndael,块大小为256位。您需要Java中的Bouncy Castle LIB来解密密码的非标准部分
  • MD5($key)
    有人需要256位的密钥材料,认为MD5值在密码上的十六进制编码已经足够好了。它不是,因为它只提供一半的熵(每个字节2个十六进制字符)。MD5不是一个密码散列函数,这一事实充其量只能说明它是不真实的
  • base64\u decode($encoded\u string)
    :好吧,除了base64编码,如果密文需要以ASCII兼容文本的形式出现,这是可以的
  • MCRYPT\u MODE\u CBC
    :没关系,但由于PHP主要用作web语言,我预计该消息容易受到填充oracle/纯文本oracle攻击的攻击,当然,您应该预计密文的任何更改都无法检测到
  • md5(md5($key))
    :两次应用md5不会比零IV更安全,并且不要忘记每个函数执行的十六进制转换;幸运的是,这意味着IV至少是256位而不是128位
因此,您需要使用:

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中是标准化的。