2017-05-09 53 views
1

我有一個PHP工作正常,我想複製相同的,並希望使用Java來做到這一點。 我的PHP代碼使用MCRYPT_RIJNDAEL_256:在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+UqLxbe9VTS6OCgvnJFn1jtMCgkj1434A=

但同時使用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中獲得相同的輸出。

+1

投票了,原因很簡單,你是至少不會嘗試使用加密/ AES的Java實現這一點。 –

回答

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陣列應該直接放入encodeToString方法中,首先轉化爲String然後回到byte[]再次只能鬆散的數據。因此,在下面的代碼去掉s

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

測試了我的建議,似乎工作正常。快樂編碼:) –

+0

感謝@Maarteen,那就是我一直在尋找的:) –