TL; DR: вы не должны генерировать пару ключей RSA из заданного пароля
Похоже, что OpenSSL и phpseclib были созданы с учетом этого.Это неудивительно, поскольку о самом решении можно многое сказать.Кроме того, существует много проблем с реализацией, , особенно для RSA .
. Если вы все еще хотите реализовать эту необдуманную схему, то вам следует поискать реализацию PHP длягенерация ключа и затем сохраните его вместе с решением .Причина этого заключается в том, что в противном случае генерация случайных чисел, поиск простых чисел или метод генерации ключей RSA могут измениться внутренне (при обновлении библиотеки) и создать другую пару ключей.Я бы не использовал это решение на Java, даже если оно делает , позволяя вам вставить свой собственный ГСЧ, чтобы разрешить генерацию пары детерминированных ключей , что является техническим термином того, что вы пытаетесьdo.
Существуют и другие способы обеспечения безопасности своего личного ключа, например, шифрование на основе пароля ключа.Это требует хранения зашифрованного ключа, но, по крайней мере, это обычная практика и у нее гораздо меньше причин для отказа.
Вам понадобится какая-то гибридная криптография, если вы хотите зашифровать сообщения произвольного размера - так же, как вына самом деле, пришлось бы иметь дело с любой другой парой ключей RSA.
Обратите внимание, что ситуация немного хуже для криптографии с эллиптической кривой.Вы можете объединить PBKDF2 с SHA-256 для создания закрытого ключа, а затем получить открытый ключ, выполнив умножение точки базовой точки G на значение этого закрытого ключа.Это гораздо меньше шансов на провал.Вы можете использовать ECIES для шифрования с помощью эллиптических кривых, поскольку EC не может напрямую зашифровать сообщения или ключами.
Однако у вас все еще будет проблемаНикогда не можете изменить пароль, и что вы должны использовать постоянную соль, чтобы всегда генерировать один и тот же закрытый ключ и открытый ключ.Из-за этого я все равно не рекомендую эту схему, поскольку она позволяет автономным, многоцелевым атакам найти пароль с использованием значения открытого ключа или зашифрованного текста.
Чтобы быть уверенным, что пароль не может быть найденоно должно быть действительно сильным - настолько сильным, что вам, вероятно, придется его где-то хранить.