Ответ 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/