2017-05-09 1 views
1

私はうまく動作しているPHPを持っています。私は同じものを複製したいと思って、javaを使ってやりたいと思います。JavaのPHP暗号化に代わるもの

$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 + UqLxbe9VTS6OCgvnJFn1jtMCgkj1434DMpLehN7ve0AhnMOQtT1fLcZIUfM9rF/iVOKj6UtgwyA:

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())); 

は、私は、出力の下に取得しています:Javaを使用して暗号化しながら、KdL2lWUGqy+UqLxbe9VTS6OCgvnJFn1jtMCgkj1434A=

をしかし 私のPHPコードがMCRYPT_RIJNDAEL_256使用しています==

両方の出力が異なります。 私はJAVAでも同じ出力を得ることができるように提案してください。

+1

。 –

答えて

2

あなたは二回パディングを試してみて、実行するように見える:

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) 

あなたが見ることができるように、ベース64の最初の部分は、PHPとJavaの両方で同じです。 PHPにはPKCS#7のパディングが含まれていないことに注意してください。これはstr_repeatを使用してコード化された理由です。


はさらにencryptedアレイは直接第一缶のみ緩いデータ再びbyte[]に次いでStringに変換し、encodeToString方法に入れなければなりません。したがって、次のコードでsを取り除く:あなたは、少なくともこのためのJavaの暗号/ AESの実装を使用しようとしていない単純な理由のためにアップ投票

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

私の推奨事項をテストしたところ、正常に動作しているようです。ハッピーコーディング:) –

+0

ありがとう@Maarteen、まさに私が探していたものです:) –