Почему openssl_public_encrypt не может обработать этот открытый текст?

openssl_public_encrypt очевидно, не может справиться с произвольным открытым текстом.

<?php

$msg = '{"args":["argxx","argyy"],"data":"xx\nyyy\n","symkey":"0a6e860640413acfe6e4e461a28fab3fad3aff78ef95c962c5e63bef7e2b3439"}';

# If you uncomment this line, the function succeeds.
# $msg = 'test';

$pub = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC80g7AA5XexMCiJW3tKr/eeN8Q
EMNfGYG0qiUuLS/dtir7c3c1MmpNzrE8R+xqleOLNVkbbSZqqQ2qUJtPhwbLhQyL
yilRH5WMz9Pabx62v7k+vm81/6Xa9fnIV7DE0DZhMO5vQvBE3+5jkXbfU4yBZRv5
UOty5gqGXXaR6bim4QIDAQAB
-----END PUBLIC KEY-----';if (openssl_public_encrypt ($msg, $enc, $pub))
{
print bin2hex ($enc);

exit (0);
}
else
{
print "Could not encrypt message.\n";
}
?>

Это выводы Could not encrypt message. на Ubuntu PHP 7.

Почему это терпит неудачу на этом $msg?

3

Решение

Если мы проверим эту ситуацию эмпирически, мы увидим, что все, что длиннее 117 байт, потерпит неудачу:

$msg = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm';

Строка выше представляет 117 символов и всего 117 байтов. Это работает при шифровании с открытым ключом, который вы предоставили.

Если я добавлю еще один символ, nСбой шифрования:

$msg = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmn';

То же самое относится и к другим символам Юникода. Допустим, я пытаюсь зашифровать это длиной 85 символов, но ровно 117 байтов:

$msg = ' i ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui  u';

Это зашифровано отлично. Но если я добавлю еще один байт, произойдет сбой (86 символов, 118 байтов):

$msg = ' i ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui  uZ';

.. openssl_public_encrypt() Функция потерпит неудачу, если вы передадите ей более 117 символов для шифрования.

Снайдер, Крис, Майер, Томас, Саутуэлл, Майкл, ISBN 978-1-4302-3318-3

Далее в книге сказано:

Поскольку RSA является дорогим и никогда не предназначался для шифрования большого количества данных, если вы шифруете то, что обычно длиннее 56 символов, вы должны планировать шифрование ваших данных с использованием быстрого и эффективного симметричного алгоритма, такого как AES, со случайно сгенерированным ключом. ,

1

Другие решения

Фактический ключ имеет длину 128 байт (1024 бита), это обычный минимально допустимый размер ключа. 128 — 11 байтов заполнения = 117 допустимых байтов данных для шифрования.

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

2

По вопросам рекламы [email protected]