2015-03-13 4 views
0

На сервере (PHP код), мы имеем 2 метода для шифрования/дешифрования facebook идентификатор так:Как шифровать текст в Java, преобразовывая PHP-код?

private function encryptFacebookId($text) 
{ 
     $method = "AES-256-CBC"; 
     $iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC); 
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

     $encrypted = openssl_encrypt($text, $method, $this->_cryptKey, 0, $iv); 

     return base64_encode($iv . $encrypted); 
} 

public function decryptFacebookId($text) 
{ 
     $text = base64_decode($text); 
     $method = "AES-256-CBC"; 
     $iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC); 
     $iv = substr($text, 0, $iv_size); 

     $decrypted = openssl_decrypt(substr($text, $iv_size), $method, $this->_cryptKey, 0, $iv); 

     return $decrypted; 
} 

с _cryptKey = "1231238912389123asdasdklasdkjasd";

Это нормально с тем же значением ввода и вывода на сервере. Но когда я подключаюсь к серверу как клиент (Android/Java) по запросу HTTP (REST). Я пытаюсь преобразовать метод PHP-кода в Java-код по методу «encryptFacebookId ($ text)» и отправить текст шифрования на сервер, но результат метода decryptFacebookId ($ text) на сервере не совпадает с клиентом.

Это мой код на клиенте

String facebookId = "123456789"; 
     String keyCrypt = "1231238912389123asdasdklasdkjasd"; 

     try { 
      SecretKeySpec skeySpec = new SecretKeySpec(keyCrypt.getBytes(), 
        "AES"); 
      Cipher enCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      byte[] ivData = new byte[enCipher.getBlockSize()]; 
      IvParameterSpec iv = new IvParameterSpec(ivData); 
      enCipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 

      byte[] encryptedBytes = enCipher.doFinal(facebookId.getBytes()); 

      String ivEncrypted = new String(ivData) 
        + new String(encryptedBytes); 

      String strEncode = Base64 
        .encodeBase64String(ivEncrypted.getBytes()); 

      System.out.println(strEncode); 

     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

Пожалуйста, помогите мне найти правильный путь.

+0

Возможно, [это] (http://stackoverflow.com/questions/10451068/encryption-mismatch-between-java-and-php) может помочь вам – mrun

+0

Для начала вы не можете преобразовать двоичный байт []: new String (encryptedBytes). – Metatron

+0

Ваш PHP-код - большой беспорядок. Почему вы смешиваете функции mcrypt_ * и openssl_ *? AES имеет 128-битный блок/IV размер не 256. Почему CAST? –

ответ

0

1) Если вы хотите Concat двоичный байт [] не превратить его в строку использовать, например:

public static byte[] concat(byte[]... args) 
{ 
    int fulllength = 0; 
    for (byte[] arrItem : args) { 
     fulllength += arrItem.length; 
    } 
    byte[] outArray = new byte[fulllength]; 
    int start = 0; 
    for (byte[] arrItem : args) { 
     System.arraycopy(arrItem, 0, outArray, start, arrItem.length); 
     start += arrItem.length; 
    } 
    return outArray; 
} 

байт [] ivEncrypted = CONCAT (ivData, encryptedBytes);

2) Вы должны быть уверены, что кодеры Base64 совместимы.

Смежные вопросы