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

Я должен зашифровать одну строку с заданным ключом в 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);
}

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

Спасибо

0

Решение

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

WBR,
Juris

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector