AES / CBC / PKCS5Padding шифрование в PHP, дешифрование в Java

0

Я должен зашифровать одну строку с заданным ключом в PHP.

В Java у меня уже есть оба метода для дешифрования и шифрования.

Вот мой метод шифрования Java:

public static String encriptB64Aes(String value, String aesKey) {
    String result = null;
    try {

       Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

       //in PHP !?
       SecretKey secretKey = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
       IvParameterSpec ivParameterSpec = new IvParameterSpec(secretKey.getEncoded());

       encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);

       // Encrypt
       ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
       CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, encryptCipher);
       cipherOutputStream.write(value.getBytes());
       cipherOutputStream.flush();
       cipherOutputStream.close();
       byte[] encryptedBytes = outputStream.toByteArray();
       result = encodeBase64(encryptedBytes);

    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
       e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

Мне нужен метод, описанный выше в PHP-коде, используя mcrypt_module_open.

Я попробовал такой метод, но я не знаю, как рассчитать $ iv, как указано выше

function encrypt($str, $key) { 
      $str = pkcs5_pad($str);
      $iv = ????;                 
      $td = mcrypt_module_open('rijndael-128', '', 'cbc', '');
      mcrypt_generic_init($td, $key, $iv);
      $encrypted = mcrypt_generic($td, $str);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      return base64_encode($encrypted);
}

function pkcs5_pad ($text) {
      $blocksize = 16;
      $pad = $blocksize - (strlen($text) % $blocksize);
      return $text . str_repeat(chr($pad), $pad);
}

Я был бы очень признателен за любую помощь, которую вы можете мне дать.

благодаря

Теги:
encryption
cryptography

1 ответ

0

В коде Java ключ AES используется как IV. Соответственно, первый блок данных открытого текста XORed с ключом AES, который используется для шифрования. .getEncoded() просто возвращает представление byte [] в SecretKey. В вашем случае IV = $ key

Wbr, Юрис

  • 0
    Спасибо за ваш ответ! Но метод PHP не создает ту же строку, что и метод Java :(
  • 0
    Я немного озадачен тем, что String вы передаете как ключ к методу Java. Каково значение ключа String?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню