Я пытаюсь защитить связь между JS-интерфейсом и PHP-интерфейсом с помощью симметричного и асимметричного шифрования. Я создаю симметричный ключ на клиенте и шифрую его с помощью открытого ключа сервера с помощью JSEncrypt и отправляю его на сервер для будущего использования. Тем не менее, я застреваю, когда я получаю данные на стороне сервера. openssl_open требует конверт для расшифровки симметричного ключа, и я даже не уверен, какие данные должны быть в конверте. У меня сложилось впечатление, что конверт — это симметричный ключ, который был зашифрован открытым ключом, но его использование не помогло. Я также пробовал разные комбинации декодирования, так как я читал, что JSEncrypt кодирует сообщение в базе 64 и ключ в шестнадцатеричном виде, но эти попытки также бесплодны.
Код шифрования JS:
let pub = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----";
//I have a function that just creates a random string of characters
let key = generateKey(32);
let aesData = CryptoJS.AES.encrypt( "test", key );
let symKey = aesData.key + ":::" + aesData.iv;
let msg = aesData.toString();
let rsa = new JSEncrypt();
rsa.setPublicKey( pub );
let cryptKey = rsa.encrypt( symKey );
//I'm passing the data through a hidden form field
$("#key").val(cryptKey + ":::" + msg);
Код расшифровки PHP:
$key = openssl_get_privatekey( file_get_contents( $_SERVER["PRIV_KEY"]) );
$encryptedKey = explode( ":::", $msg )[0];
$realMsg = base64_decode(explode( ":::", $msg )[1]);
openssl_open($realMsg, $decrypted, $encryptedKey, $key);
return $decrypted;
Приведенный выше код ничего не выводит, потому что вызов openssl_open завершается неудачно (возвращает false). Когда я на основе 64 декодирую переменную $ encryptedKey, я получаю:
�vEi���pΕ��d_���@����욲JE��
но симметричный ключ меняется каждый раз, поэтому выход также меняется каждый раз. Как я уже сказал, я пробовал разные комбинации кодирования, но все они возвращают одинаковую чепуху. Как показывает код JS, я зашифровал сообщение «test».
Я никогда раньше не реализовывал шифрование, так что, возможно, я не в курсе, но после изучения этого кода в течение нескольких дней любая информация будет оценена.
Изменить: у меня проблемы с расшифровкой с моим закрытым ключом в PHP, а не с симметричным ключом
Догадаться!!! Итак, я обнаружил, что в PHP есть функция для расшифровки без необходимости использования конверта openssl_private_decrypt который использует закрытый ключ для расшифровки сообщения. Используя эту функцию и базу 64, декодирующую зашифрованный ключ, я могу дешифровать симметричный ключ на стороне сервера и, надеюсь, теперь смогу дешифровать сообщение симметрично. Для тех, кто заинтересован, мой код на стороне сервера:
$key = openssl_get_privatekey( file_get_contents( $_SERVER['PRIV_KEY'] ) );
$encryptedKey = base64_decode(explode( ":::", $msg )[0]);
if( openssl_private_decrypt($encryptedKey, $decrypted, $key) )
{
return $decrypted;
}
return $encryptedKey;
А на стороне клиента мой код такой же, как был выше. Надеюсь, это поможет кому-то!
Других решений пока нет …