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 ?
Réponses
Trop de publicités?
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);
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);
}