68 votes

obtenir une IllegalBlockSizeException : les données ne doivent pas dépasser 256 octets lors de l'utilisation de rsa

J'utilise la clé rsa pour crypter une longue chaîne que j'enverrai à mon serveur (la cryptera avec la clé publique du serveur et ma clé privée) mais cela lève une exception comme javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes Je pense que je n'ai pas bien compris le fonctionnement de rsa jusqu'à présent (l'utilisation des bibliothèques intégrées en est la cause). Quelqu'un peut-il expliquer pourquoi cette exception est levée. N'est-il pas du tout possible d'envoyer une longue chaîne cryptée ?

3voto

William Points 5270

Pour faire suite à la réponse de John Snow ci-dessus, j'ai créé une simple bibliothèque de chiffrement symétrique aléatoire que vous pouvez utiliser pour chiffrer simplement n'importe quelle longueur de données à l'aide d'une clé privée.

Vous pouvez trouver la bibliothèque sur GitHub - random-symmetric-crypto

  final RandomSymmetricCipher cipher = new RandomSymmetricCipher();

 // Encrypt the data and the random symmetric key.
 final CryptoPacket cryptoPacket = cipher.encrypt(inputData, PRIVATE_KEY_BASE64);

 // Convert the CryptoPacket into a Base64 String that can be readily reconstituted at the other end.
 final CryptoPacketConverter cryptoPacketConverter = new CryptoPacketConverter();
 final String base64EncryptedData = cryptoPacketConverter.convert(cryptoPacket);
 System.out.println("Base64EncryptedData=" + base64EncryptedData);

 // Decrypt the Base64 encoded (and encrypted) String.
 final byte[] outputData = cipher.decrypt(base64EncryptedData, PUBLIC_KEY_BASE64);

-3voto

Carl Points 197

vous devez diviser vos données par la clé publique

 int keyLength = publicKey.getModulus().bitLength() / 16;
String[] datas = splitString(data, keyLength - 11);
String mi = ""//the data after encrypted;
for (String s : datas) {
    mi += bcd2Str(cipher.doFinal(s.getBytes()));
}
return mi;


public static String bcd2Str(byte[] bytes) {
    char temp[] = new char[bytes.length * 2], val;

    for (int i = 0; i < bytes.length; i++) {
        val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
        temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

        val = (char) (bytes[i] & 0x0f);
        temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
    }
   return new String(temp);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X