Я пытаюсь зашифровать данные 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. IV вместе с HMAC должны быть добавлены к зашифрованному тексту. Пока PHP и JS анализируют IV и HMAC из зашифрованной текстовой строки, все будет в порядке.
На самом деле IV — это просто случайная строка определенной длины, которая используется для заполнения / засоления вашего шифрования и не зависит от ключа.
HMAC — это хэш текста шифра (который зависит от ключа), который используется для проверки подлинности текста шифра перед расшифровкой. Этот HMAC добавляется к зашифрованному тексту вместе с IV. Перед расшифровкой вы хешируете зашифрованный текст и сравниваете его с хешем, добавленным к зашифрованному тексту. Если они совпадают, то ничто не было подделано. Если они не совпадают, вы должны считать данные скомпрометированными.
Я бы порекомендовал использовать библиотеку Libsodium для ваших нужд шифрования. Теперь он является родным для последней версии PHP, и вы также можете найти его для JS.
Вот хороший документ, с которого можно начать.
Других решений пока нет …