Подтвердить что ты не робот

Шифрование и расшифровка большой строки в java с помощью RSA

Я пытаюсь реализовать PKI. Я хочу зашифровать большую строку с помощью RSA в java без использования надувного замка. Проблема, которую я получаю: данные не должны быть длиннее 117 байт. Я попробовал использовать для решения проблемы, где я потерпел неудачу. Я новичок в этом шифровании. Пожалуйста, помогите мне, предоставив большую строку в качестве примера и объясните ее.

4b9b3361

Ответ 1

Вы не можете использовать расшифровку шифрования RSA более чем на 128 байтов за раз. Вы должны разделить данные и сделать это в цикле, в значительной степени записывая байты в String/Array, когда вы идете. Если ваша единственная проблема - размер данных, у вас, вероятно, не так много всего. Просто разделите данные.

Отличный пример, возможно более полный для вас, имеющий дело с строками размером более 128 байт: http://coding.westreicher.org/?p=23

Если вам нужно больше объяснять шифрование RSA в целом:

Следующий код демонстрирует, как использовать KeyPairGenerator для генерации пары ключей RSA в Java:

// Get an instance of the RSA key generator
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
// Generate the keys — might take sometime on slow computers
KeyPair myPair = kpg.generateKeyPair();

Это даст вам объект KeyPair, который содержит два ключа: частный и публичный. Чтобы использовать эти ключи, вам необходимо создать объект Cipher, который будет использоваться в сочетании с SealedObject для шифрования данных, которые вы собираетесь завершить по сети. Вот как вы это делаете:

// Get an instance of the Cipher for RSA encryption/decryption
Cipher c = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

После инициализации Cipher были готовы зашифровать данные. Поскольку после шифрования результирующие данные не имеют большого смысла, если вы видите их "голыми", мы должны инкапсулировать их в другой объект. Java предоставляет это, по классу SealedObject. SealedObjects являются контейнерами для зашифрованных объектов, которые шифруют и расшифровывают их содержимое с помощью объекта Cipher.

В следующем примере показано, как создавать и шифровать содержимое файла SealedObject:

// Create a secret message
String myMessage = new String("Secret Message");
// Encrypt that message using a new SealedObject and the Cipher we created before
SealedObject myEncryptedMessage= new SealedObject( myMessage, c);

Получаемый объект может быть отправлен по сети без страха, поскольку он зашифрован. Единственный, кто может расшифровать и получить данные, - это тот, кто имеет закрытый ключ. Обычно это должен быть сервер. Чтобы расшифровать сообщение, необходимо повторно инициализировать объект Cipher, но на этот раз с другим режимом, дешифровать и использовать закрытый ключ вместо открытого ключа.

Вот как вы это делаете в Java:

// Get an instance of the Cipher for RSA encryption/decryption
Cipher dec = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate());

Теперь, когда Cipher готов к расшифровке, мы должны сказать SealedObject расшифровать сохраненные данные.

// Tell the SealedObject we created before to decrypt the data and return it
String message = (String) myEncryptedMessage.getObject(dec);
System.out.println("foo = "+message);

Остерегайтесь использования метода getObject, так как он возвращает экземпляр объекта (даже если это фактически экземпляр String), а не экземпляр класса, который он был до шифрования, поэтому вы должны отдать его его предыдущей формы.

Вышеописанное: http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

Ответ 2

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

BouncyCastle поддерживает два протокола для этого: S/MIME и PGP. Все разумные протоколы конфиденциальности используют асимметричные алгоритмы для передачи ключей или обмена ключами таким образом.

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