PHP RSA шифрование openssl вопрос - PullRequest
2 голосов
/ 28 мая 2019

Я ломал голову.Я использую последнюю версию php 7. Я могу заставить rsa работать с коротким текстом, однако длинный текст, кажется, не работает.Я прочитал, чтобы использовать openssl_seal / open .. когда я продемонстрировал код на тестовой странице, он прекрасно работает .. когда я применяю его на практике с mysql, он не работает так, как это должно быть ..

Код шифрования:

$messageiv = openssl_random_pseudo_bytes(32);
openssl_seal($_POST[$_SESSION['message']], $encryptedmessage, $ekeys, array($_SESSION['recipient_publickey']), "AES256", $messageiv);
openssl_seal($_POST[$_SESSION['subject']], $encryptedsubject, $ekeys, array($_SESSION['recipient_publickey']), "AES256", $messageiv);

Вышеприведенное затем затем base91_encoded и сохраняется в blobs / varchar.

Для расшифровки

openssl_open(base91_decode($row['messagesubject']), $decryptedsubject, $ekeys[0], $_SESSION['privatersakey'], "AES256", base91_decode($row['messageiv']));              
    openssl_open(base91_decode($row['messagebody']), $decryptedbody, $ekeys[0], $_SESSION['privatersakey'], "AES256", base91_decode($row['messageiv']));

Перечисленные выше переменные $ decryptedsubject и $ decryptedmessage являются пустыми.

У меня была эта проблема до того, как я использовал openssl_public / private key encrypt / decrypt и добавил заполнение, это работало, однако с длинным текстом оно не будет шифровать / дешифровать ....

Любая помощьбыло бы здорово ...

1 Ответ

2 голосов
/ 28 мая 2019

Я могу заставить rsa работать с коротким текстом, однако длинный текст, похоже, не работает.

Это ожидается.RSA работает только на коротких входах.Если вы хотите зашифровать длинное сообщение с помощью RSA, вам нужно сделать одну из двух вещей:

  1. Разбейте ваше сообщение на несколько отдельных частей и зашифруйте их отдельно.Это медленно, неэффективно и небезопасно.(Злоумышленники могут отбрасывать или переупорядочивать фрагменты.)
  2. Используйте безопасную конструкцию, сочетающую RSA и AES, примерно так .

Таким образом, вы получите что-то вродеthis:

  • Шифрование
    1. Создание случайного 32-байтового ключа, k.
    2. Шифрование k с вашим открытым ключом RSA для получения C.
    3. Рассчитайте HMAC-SHA256 (C, k), чтобы получить ключ сообщения m.
    4. Зашифруйте ваше сообщение (P) с помощью m, используяAES-256-GCM для получения D.
    5. Возврат C и D.
  • Расшифровка
    1. Генерация случайного фиктивного ключа, который мы назовем k'.
    2. Расшифровать C, используя ваш закрытый ключ RSA, чтобы получить k (одноразовый ключ AES).
    3. Если шаг 2 не выполнен,используйте алгоритм постоянного времени для замены k на k'.
    4. . Вычислите HMAC-SHA256 (C, k), чтобы получить ключ сообщения m.
    5. Расшифровать D, используя m.
    6. Вернуть расшифрованный открытый текст (или сбой из-за тега аутентификации).

Я прочитал, чтобы использовать openssl_seal / open .. Когда я продемонстрировал код на тестовой странице, он прекрасно работает ..когда я применяю это на практике с mysql, он не работает так, как предполагалось ..

Сначала рассмотрим с использованием libsodium вместо .

Независимо от того, вы или нетпродолжайте использовать OpenSSL, вы, вероятно, захотите закодировать в base64 свои выходные данные (и убедитесь, что вы храните данные в текстовом поле, а не в коротком varchar).

...