Chiffrement Java RSA
Je suis en train de coder une simple Chaîne de caractères "test" d'avant en arrière.
public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] byteData = data.getBytes(); //convert string to byte array
Cipher cipher = Cipher.getInstance(ALGORITHM); //create conversion processing object
cipher.init(Cipher.ENCRYPT_MODE, publicKey); //initialize object's mode and key
byte[] encryptedByteData = cipher.doFinal(byteData); //use object for encryption
return new String(encryptedByteData); //convert encrypted byte array to string and return it
}
public static String decode(Key privateKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] byteData = data.getBytes(); //convert string to byte array
Cipher cipher = Cipher.getInstance(ALGORITHM); //create conversion processing object
cipher.init(Cipher.DECRYPT_MODE, privateKey); //initialize object's mode and key
System.out.println(byteData.length);
byte[] decryptedByteData = cipher.doFinal(byteData); //use object for decryption
return new String(decryptedByteData); //convert decrypted byte array to string and return it
}
Cependant, bien que le cryptage fonctionne très bien (ALGORITHME "RSA"), en essayant de décrypter la chaîne, j'ai juste pris du chiffrement "test", je reçois de l'exception suivante:
javax.crypto.IllegalBlockSizeException: les Données ne doivent pas être de plus de 256 octets
Dois-je diviser les octets chiffrés en blocs de 256 afin d'être capable de le décrypter?
source d'informationauteur arik
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas convertir fiable octets aléatoires à un
String
. Les résultats dépendent de ce que votre codage de caractères par défaut est sur l'ordinateur sur lequel vous exécutez cette. Avec de nombreux encodages, le texte chiffré est endommagé, et les informations seront perdues.Modifier votre code pour utiliser un
byte[]
au lieu (le résultat de la " doFinal()` méthode.Si vous avez besoin de convertir le
byte[]
à une chaîne de caractères, utilisez un encodage comme Base 64.De ici:
Si vous avez un long données, vous devez les diviser pour les blocs de données qui s'adapte et crypter /décrypter chacun d'eux (pas une bonne idée) ou crypter /décrypter à l'aide d'un algorithme symétrique (AES /DES /RC4 /etc.), chiffrer la clé symétrique avec la clé publique RSA et de les envoyer de l'autre côté. (bien meilleure idée).
La deuxième approche est une approche très commune, puisque les algorithmes de chiffrement asymétrique sont beaucoup plus chers que les algorithmes symétriques (à la fois pour le chiffrement et le déchiffrement).