Довольно прямой ответ m0skit0 , конечно, хорошо, но есть несколько вещей, на которые следует обратить внимание.
Следует избегать исключений в максимально возможной степени (в выпущенном коде ). Повторное шифрование одного и того же сообщения не будет работать, поскольку вы получите то же исключение, поэтому для этого конкретного сообщения у вас не будет выбора. Если вы используете гибридную криптографию (следующий пункт), то вы легко можете избежать этой проблемы.
RSA не предназначен для передачи больших объемов данных. Узнайте, как можно объединить AES / GCM и RSA / OAEP для создания гибридной криптосистемы , которая может эффективно шифровать / дешифровать любой объем данных.
Экземпляры класса Cipher
как правило легкий . Они относительно дешевы для создания и инициализации и не несут много состояния . Таким образом, простое создание нового экземпляра намного менее подвержено ошибкам, чем повторное использование старого.
Это означает, например, что вы должны хранить ключи в полях класс , а не Cipher
сам экземпляр . Поскольку ключи являются неизменяемыми, это означает, что состояние класса остается действительным, что бы ни происходило с Cipher
экземплярами.
О коде / криптографии:
kpg.initialize(1024);
То есть не считается достаточно хорошим размером ключа больше. Попробуйте 3072 или выше. Или go для криптографии Ellipti c Curve (E CC).
encrypter = Cipher.getInstance("RSA");
никогда не забывайте указывать алгоритм full и не использовать значения по умолчанию. Выше указано использование "RSA/ECB/PKCS1Padding"
, но OAEP должен быть предпочтительным (но имеет еще больше накладных расходов).
String.getBytes()
и new String(byte[])
: всегда указывайте набор символов из StandardCharsets
, если вы не связаны с кодировка платформы по умолчанию (и последующие ошибки декодирования на другой платформе).