Шифрование с Java и дешифрование на PHP (RIJNDAEL)

Мне нужно подключиться из приложения Java Desktop и приложения Android к веб-сервису. Мне нужно отправить логин в зашифрованном виде с помощью RIJNDAEL, но у меня возникли проблемы.

Код на Java:

public static String getEncryptedLogin(String loginID, String encryptionKey) {
byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "RIJNDAEL");

AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] result = cipher.doFinal(loginID.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(result);
}

И называется так.

String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY)+"&language=en";

На WS_ENCKEY есть строка с ключом (32 символа) для шифрования.

Когда я выполняю код Java, я получаю сообщение об ошибке исключения «Недопустимый размер ключа», поэтому после прочтения других постов на этом веб-сайте RIJNDAEL требуется 128-битный ключ, поэтому я изменяю способ вызова метода шифрования на

String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY.substring(0,16))+"&language=en";

На стороне сервера у меня есть этот код PHP для расшифровки:

<?php
class Encrypter {
public static function encrypt($text,$key) {
$textenc = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB);
return base64_encode($textenc);
}
public static function decrypt($text,$key) {
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_ECB));
}
}

На сервере я получаю правильные данные, но когда я пытаюсь расшифровать логин, вывод не совпадает.

Я не могу изменить код на стороне сервера, вы можете мне помочь?

-1

Решение

PHP mcrypt не поддерживает заполнение PKCS5, только заполнение нулями. Вам нужно будет выбрать отсутствие заполнения в Java и заполнить нулями входные данные при шифровании, кратные размеру блока, и удалить значения null при расшифровке в Java.

В коде сервера PHP mcrypt используется режим ECB, который небезопасен, для совместимости Java также необходимо указать режим ECB, а не режим CBC. Режим ECB не использует IV.

0

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

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

По вопросам рекламы [email protected]