Невозможно сопоставить ответ зашифрованной строки полезной нагрузки в PHP и JAVA

Я пытаюсь зашифровать данные json в PHP и JAVA. Но не удалось сопоставить ответ обоих.

Можем ли мы сгенерировать значение IV (вектор инициализации) на основе определенного параметра? В PHP у нас есть функции. Я пытаюсь зашифровать данные с помощью функции ниже и передать $iv в качестве одного из параметров.

$secretKey= 'BDGAJDL7AGSNPBST';

PHP:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
                         (or)
$iv = bin2hex(openssl_random_pseudo_bytes(static::INIT_VECTOR_LENGTH / 2));

// Encrypt input text
$encryptedPayload = openssl_encrypt($plainText,static::CIPHER,$secretKey,OPENSSL_RAW_DATA,$iv);
                         (or)
$encryptedPayload = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secretKey, $plainText, MCRYPT_MODE_CBC, $iv);

Вышеупомянутая функция PHP всегда возвращает другое значение. IV предназначен для того, чтобы каждый раз предоставлять уникальные значения.

Я пытаюсь сопоставить возвращаемое значение ниже кода JAVA. Которая всегда возвращает одну и ту же зашифрованную строку.

ЯВА

try{    
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(UTF_8), "AES");   
     cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(encryptionKey.getBytes(UTF_8)));
     response = cipher.doFinal(convertPOJOtoJSON(user).getBytes(UTF_8));
}catch (Exception e) {
    //
}
return response;

Обратите внимание, что код Java получает IV от encryptionKey ... вы не делаете этого в php.

Elliott Frisch 22.07.2018 07:27

... и не должен этого делать вообще. Получение вашего IV из ключа шифрования - не очень разумная задача.

Luke Joshua Park 22.07.2018 08:07

@ElliottFrisch Не могли бы вы подсказать, как я могу добиться этого в PHP?

Nagendra 22.07.2018 16:14

@LukeJoshuaPark Я чувствовал, что это могло быть из-за случайных байтов, сгенерированных IV.

Nagendra 22.07.2018 16:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
148
1

Ответы 1

Вам действительно не нужно "подбирать" IV. IV вместе с HMAC должны быть добавлены к зашифрованному тексту. Пока PHP и JS анализируют IV и HMAC из строки зашифрованного текста, все будет в порядке.

IV - это на самом деле просто случайная строка определенной длины, которая используется для засева / соли вашего шифрования и не зависит от ключа.

HMAC - это хэш зашифрованного текста (который зависит от ключа), который используется для аутентификации зашифрованного текста перед расшифровкой. Этот HMAC добавляется к зашифрованному тексту вместе с IV. Перед расшифровкой вы будете хешировать зашифрованный текст и сравнивать его с хешем, добавленным к зашифрованному тексту. Если они совпадают, значит, ничего не было изменено. Если они не совпадают, вы должны считать данные скомпрометированными.

Я бы рекомендовал использовать библиотеку Libsodium для ваших нужд шифрования. Теперь он встроен в последнюю версию PHP, и вы также можете найти его для JS.

Libsodium - PHP

Либсодиум - JS

Вот хороший документ для начала.

Хорошее чтение шифрования / аутентификации

Спасибо @Joseph_J, я вызываю одну встроенную службу java, которая ожидает такую ​​же зашифрованную строку, потому что они генерируют Hmac, используя зашифрованную строку и сопоставляя Hmac с их конца. Когда я расшифровываю свою зашифрованную строку, я вижу простой текст. И это не JS, это Java.

Nagendra 22.07.2018 09:12

Ой, извините за смешение JS / Java, вы также можете найти Libsodium для Java. Мне жаль. Я не совсем понимаю ваш вопрос. В вашем коде я не вижу, где вы добавляете IV или HMAC к зашифрованному тексту во время шифрования. Я не вижу, где вы разбираете IV, или HMAC на расшифровку. Пожалуйста, изучите последнюю ссылку в моем ответе. Он показывает вам правильную обработку, вам просто нужно принять логику с криптографическими классами, которые вы выберете для использования ... Процесс тот же. Возможно, обновите свой вопрос, указав более точное описание вашей проблемы.

Joseph_J 22.07.2018 09:38

Другие вопросы по теме