web-dev-qa-db-fra.com

Chiffrer et déchiffrer une chaîne de grande taille en Java à l'aide de RSA

J'essaie d'implémenter PKI. Je veux crypter une grande chaîne à l'aide de RSA en Java sans utiliser de château gonflable. Le problème que j'obtiens est que les données ne doivent pas dépasser 117 octets. J'ai essayé de rechercher la solution là où j'ai échoué. Je suis débutant dans ce cryptage. Veuillez m'aider en donnant une grande chaîne comme exemple et en l'expliquant.

17
Mahesh Vemuri

Vous ne pouvez pas utiliser un décryptage de cryptage RSA sur plus de 128 octets à la fois. Vous devez diviser les données et le faire en boucle en écrivant les octets dans String/Array au fur et à mesure. Si votre seul problème est la taille des données, vous n'avez probablement plus grand-chose à faire. Il suffit de diviser les données.

Un excellent exemple, peut-être plus complet pour vous, traitant des chaînes de plus de 128 octets: http://coding.westreicher.org/?p=2

Si vous avez besoin de plus d'explications sur le chiffrement RSA en général:

Le code suivant montre comment utiliser KeyPairGenerator pour générer une paire de clés RSA en 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();

Cela vous donnera un objet KeyPair, qui contient deux clés: une privée et une publique. Pour utiliser ces clés, vous devrez créer un objet Cipher, qui sera utilisé en combinaison avec SealedObject pour crypter les données que vous allez mettre fin au réseau. Voici comment procéder:

// 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()); 

Après avoir initialisé le chiffrement, nous sommes prêts à chiffrer les données. Étant donné qu'après le cryptage, les données résultantes n'auront pas beaucoup de sens si vous les voyez "nues", nous devons les encapsuler dans un autre objet. Java fournit cela, par la classe SealedObject. Les SealedObjects sont des conteneurs pour les objets chiffrés, qui chiffrent et déchiffrent leur contenu à l'aide d'un objet Cipher.

L'exemple suivant montre comment créer et crypter le contenu d'un 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);

L'objet résultant peut être envoyé sur le réseau sans crainte, car il est crypté. Le seul qui peut déchiffrer et obtenir les données est celui qui détient la clé privée. Normalement, cela devrait être le serveur. Pour décrypter le message, nous devons réinitialiser l'objet Cipher, mais cette fois avec un mode différent, décrypter et utiliser la clé privée au lieu de la clé publique.

Voici comment procéder en 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());

Maintenant que le chiffrement est prêt à déchiffrer, nous devons dire au SealedObject de déchiffrer les données détenues.

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

Méfiez-vous lorsque vous utilisez la méthode getObject, car elle renvoie une instance d'un objet (même s'il s'agit en fait d'une instance de String), et non une instance de la classe qu'elle était avant le chiffrement, vous devrez donc la convertir en son forme antérieure.

Ce qui précède est de: http://andreas.louca.org/2008/03/20/Java-rsa-encryption-an-example/

32
msj121

RSA n'est pas destiné au chiffrement de données en masse. Utilisez plutôt un chiffrement symétrique, comme AES, pour crypter votre "grande chaîne". Ensuite, chiffrez la clé symétrique utilisée pour AES avec la clé RSA.

BouncyCastle prend en charge deux protocoles pour ce faire: S/MIME et PGP. Tous les protocoles de confidentialité sensibles utilisent des algorithmes asymétriques pour le transport ou l'échange de clés de cette manière.

La taille du message qui peut être chiffrée avec RSA dépend du module de la clé, moins quelques octets requis pour le remplissage sécurisé du message.

9
erickson