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
?
Если мы проверим эту ситуацию эмпирически, мы увидим, что все, что длиннее 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, со случайно сгенерированным ключом. ,
Фактический ключ имеет длину 128 байт (1024 бита), это обычный минимально допустимый размер ключа. 128 — 11 байтов заполнения = 117 допустимых байтов данных для шифрования.
Открытый ключ в вопросе закодирован и имеет дополнительные строки верхнего и нижнего колонтитула и, следовательно, длиннее 128 байт.