2017-05-09 1 views
1

나는 잘 작동하는 PHP를 가지고 있으며, 같은 것을 복제하려고하며 자바를 사용하고 싶습니다.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())); 

내가 출력 아래에 무엇입니까 : 자바를 사용하여 암호화하는 동안 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); 

은 이미 코드 (new PKCS7Padding())에서 수행 PKCS # 7 패딩을 수행 할 수있는 병이 작성 시도 될 것으로 보인다.

그냥 의해 대체 :

plaintext.getBytes(StandardCharsets.US_ASCII) 

당신이 볼 수 있듯이,베이스 (64)의 첫 번째 부분은 PHP와 자바 모두 동일하다. PHP에는 PKCS # 7 패딩이 포함되어 있지 않으므로이 코드는 str_repeat을 사용하여 코딩 된 것입니다. 다시 byte[] 뒤쪽에만 데이터를 느슨하게 할 수


더욱이 encrypted 배열 직접적 encodeToString 방법에 투입되어야 제 String로 변환. 그래서 다음 코드 s을 제거 :이 자바의 암호화/AES 구현을 사용하려고 적어도하지 않는 단순한 이유를 위해 투표

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

내 권장 사항을 테스트 한 결과 제대로 작동하는 것 같습니다. 해피 코딩 :) –

+0

고마워요 @ 마틴, 그게 내가 정확히 무엇을 찾고 있었는지 :) –