Ce petit bout de code permet d'encoder des données avec une clef publique :
Citation :
public cryptData(data: object): string {
const encrypt = new JSEncrypt();
encrypt.setPublicKey(this.publicKey); //la clef est contenue dans une chaine initialisée par ailleurs
return encrypt.encrypt(JSON.stringify(data));
}
|
De l'autre côté on décode avec notre clef privée, ça fonctionne sans souci.
Mes années de développement sont trèèèès loin derrière moi mais par curiosité e"t pour aider un client j'ai voulu recoder la même routine en Java.
Citation :
public static String encryptStringWithPublicKey(String s, String keyFilename) throws Exception {
Cipher cipher = Cipher.getInstance("RSA" );
PublicKey pubkey = readPublicKeyFromPem(keyFilename);//la clef est contenue dans un fichier, cette routine va la lire.
cipher.init(Cipher.ENCRYPT_MODE, pubkey);
String enc = Base64.getEncoder().encodeToString(cipher.doFinal(s.getBytes("UTF-8" )));
return enc;
}
|
Ce n'est pas tellement plus compliqué et ça fonctionne bien.
Ou pas.
En effet, après plusieurs tests je suis tombé sur cette erreur :
Citation :
javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
at java.base/com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:347)
at java.base/com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:392)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2205)
at TestProductMessage.encryptStringWithPublicKey(TestProductMessage.java:139)
at TestProductMessage.main(TestProductMessage.java:97)
|
qui n'en est pas vraiment une, car la librairie Java refuse d'encoder un message plus long que 245 bytes pour les raisons expliquées là :
https://cryptographyprogramming.blo [...] excep.html
Question :
Javascript l'autorise et pas Java, est-ce seulement car Javascript est plus permissif ?
---------------
Dieu se rit des hommes qui déplorent les effets dont ils chérissent les causes.