Я пытаюсь зашифровать данные 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;
... и не должен этого делать вообще. Получение вашего IV из ключа шифрования - не очень разумная задача.
@ElliottFrisch Не могли бы вы подсказать, как я могу добиться этого в PHP?
@LukeJoshuaPark Я чувствовал, что это могло быть из-за случайных байтов, сгенерированных IV.




Вам действительно не нужно "подбирать" IV. IV вместе с HMAC должны быть добавлены к зашифрованному тексту. Пока PHP и JS анализируют IV и HMAC из строки зашифрованного текста, все будет в порядке.
IV - это на самом деле просто случайная строка определенной длины, которая используется для засева / соли вашего шифрования и не зависит от ключа.
HMAC - это хэш зашифрованного текста (который зависит от ключа), который используется для аутентификации зашифрованного текста перед расшифровкой. Этот HMAC добавляется к зашифрованному тексту вместе с IV. Перед расшифровкой вы будете хешировать зашифрованный текст и сравнивать его с хешем, добавленным к зашифрованному тексту. Если они совпадают, значит, ничего не было изменено. Если они не совпадают, вы должны считать данные скомпрометированными.
Я бы рекомендовал использовать библиотеку Libsodium для ваших нужд шифрования. Теперь он встроен в последнюю версию PHP, и вы также можете найти его для JS.
Вот хороший документ для начала.
Хорошее чтение шифрования / аутентификации
Спасибо @Joseph_J, я вызываю одну встроенную службу java, которая ожидает такую же зашифрованную строку, потому что они генерируют Hmac, используя зашифрованную строку и сопоставляя Hmac с их конца. Когда я расшифровываю свою зашифрованную строку, я вижу простой текст. И это не JS, это Java.
Ой, извините за смешение JS / Java, вы также можете найти Libsodium для Java. Мне жаль. Я не совсем понимаю ваш вопрос. В вашем коде я не вижу, где вы добавляете IV или HMAC к зашифрованному тексту во время шифрования. Я не вижу, где вы разбираете IV, или HMAC на расшифровку. Пожалуйста, изучите последнюю ссылку в моем ответе. Он показывает вам правильную обработку, вам просто нужно принять логику с криптографическими классами, которые вы выберете для использования ... Процесс тот же. Возможно, обновите свой вопрос, указав более точное описание вашей проблемы.
Обратите внимание, что код Java получает IV от
encryptionKey... вы не делаете этого в php.