Мне нужно подключиться из приложения 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));
}
}
На сервере я получаю правильные данные, но когда я пытаюсь расшифровать логин, вывод не совпадает.
Я не могу изменить код на стороне сервера, вы можете мне помочь?
PHP mcrypt не поддерживает заполнение PKCS5, только заполнение нулями. Вам нужно будет выбрать отсутствие заполнения в Java и заполнить нулями входные данные при шифровании, кратные размеру блока, и удалить значения null при расшифровке в Java.
В коде сервера PHP mcrypt используется режим ECB, который небезопасен, для совместимости Java также необходимо указать режим ECB, а не режим CBC. Режим ECB не использует IV.
Других решений пока нет …