Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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_Base64_Aes - Fatal编程技术网

Java中PHP加密的替代方案

Java中PHP加密的替代方案,java,php,encryption,base64,aes,Java,Php,Encryption,Base64,Aes,我有一个PHP,这是工作良好,我想复制相同的,并希望用java来做它。 我的PHP代码使用MCRYPT_RIJNDAEL_256: $iv = "42309842389462374623784692423642"; $key = "asfuyjkdhfabcdef"; $text = "0007"; $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $padding = $b

我有一个PHP,这是工作良好,我想复制相同的,并希望用java来做它。 我的PHP代码使用MCRYPT_RIJNDAEL_256:

 $iv = "42309842389462374623784692423642";
   $key = "asfuyjkdhfabcdef";
   $text = "0007";    

  $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
  $padding = $block - (strlen($text) % $block);
  $text .= str_repeat(chr($padding), $padding);
  $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
  $crypttext64=base64_encode($crypttext);

  echo $crypttext64;
它返回:
KdL2lWUGqy+uqlxbe9vts6ocgvnjfn1jtmgkj1434a=

但在使用java加密时:

  byte[] sessionKey = "asfuyjkdhfabcdef".getBytes(Charset.forName("ASCII"));

  byte[] iv = "42309842389462374623784692423642".getBytes(Charset.forName("ASCII"));

            String plaintext="0007";

            String data = new String(new char[28]).replace("\0", Character.toString ((char) 28));

            String newdata = plaintext+data;
            newdata = newdata.substring(0,32);
            byte [] dataBytes = newdata.getBytes(Charset.forName("ASCII"));
            System.out.println(dataBytes);

            PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
                new CBCBlockCipher(new RijndaelEngine(256)),new PKCS7Padding());



            cipher.init(true, new ParametersWithIV(new KeyParameter(sessionKey), iv));


            byte[] encrypted  = new byte[cipher.getOutputSize(dataBytes.length)];

            int oLen = cipher.processBytes(dataBytes, 0, dataBytes.length, encrypted, 0);
            cipher.doFinal(encrypted, oLen);   
             String s = new String(encrypted);
            System.out.println(Base64.getEncoder().encodeToString(s.getBytes()));
我得到以下输出:

KdL2lWUGqy+UqLxbe9VTS6OCgvnJFn1jtMCgkj1434DMpLehN7ve0AhnMOQtT1fLcZIUfM9rF/iVOKj6UtgwyA==

两种输出都不同。
请给出建议,这样我也可以在JAVA中获得相同的输出。

您似乎尝试了两次填充:

String data = new String(new char[28]).replace("\0", Character.toString ((char) 28));

String newdata = plaintext+data;
newdata = newdata.substring(0,32);
byte [] dataBytes = newdata.getBytes(Charset.forName("ASCII"));
System.out.println(dataBytes);
执行PKCS#7填充的尝试似乎写得不好,您已经在代码中执行了此操作(
new PKCS7Padding()

只需将其替换为:

plaintext.getBytes(StandardCharsets.US_ASCII)
如您所见,base 64的第一部分在PHP和Java中都是相同的。请注意,PHP不包含PKCS#7填充,这就是为什么使用
str#u repeat
对其进行编码的原因


此外,
加密的
数组应直接放入
encodeToString
方法中,首先转换为
字符串
,然后再转换回
字节[]
,这样只会丢失数据。因此,去掉以下代码中的
s

String s = new String(encrypted);
System.out.println(Base64.getEncoder().encodeToString(s.getBytes()));

投赞成票的原因很简单,至少您没有尝试使用Java的Cipher/AES实现来实现这一点。快乐编码:)谢谢@Maarteen,这正是我想要的:)