par Oliv - jeu. 23 avr. 2020 19:29
- jeu. 23 avr. 2020 19:29
#202875
Hello world !
Et vous, qui allez, j'en suis sûr, répondre avec brio...
Voilà, j'ai un soucis lorsque j'exécute mon programme - un triolet de programme en fait - son résultat diffère en fonction de son mode de lancement, à savoir
soit depuis l'IDE sur lequel il est écrit avec comme arguments du Run configuration de Encrypt.java :
"Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "Aïe, aïe, ça écrit pô bien !"
output : GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA=
puis pour Decypher.java :
"Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA="
output : Aïe, aïe, ça écrit pô bien !
soit depuis l'invite de commande (Windows et variable environnement ad hoc) avec successivement :
soit depuis des fichiers batch (encodés en ANSI ou en UTF-8, même résultat) qui contiennent suucessivement :
Mais si je mets en second argument du Decypher.jar le message chiffré que j'aurais obtenu par une des deux autres méthode, l'encodage est ok, l'output est conforme.
D'où cela vient-il ? Comment y remédier ?
Voici le triolet de programme en question :
entre l'unicode de la JVM, le cp1252 de ses flux par défaut, et l'ANSI de Windows (est-ce vraimentà 100 % le cp1252 ?),
n'est vraiment pas ma tasse de thé, d'autant que je ne saisi pas où il se perd, ni même si c'est bien strictement un problèeme d'encodage de l'affichae console.
Et vous, qui allez, j'en suis sûr, répondre avec brio...
Voilà, j'ai un soucis lorsque j'exécute mon programme - un triolet de programme en fait - son résultat diffère en fonction de son mode de lancement, à savoir
soit depuis l'IDE sur lequel il est écrit avec comme arguments du Run configuration de Encrypt.java :
"Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "Aïe, aïe, ça écrit pô bien !"
output : GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA=
puis pour Decypher.java :
"Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA="
output : Aïe, aïe, ça écrit pô bien !
soit depuis l'invite de commande (Windows et variable environnement ad hoc) avec successivement :
Code : Tout sélectionner
output : GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA=
java -jar "C:\Users\moi\Encrypt.jar" "Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "Aïe, aïe, ça écrit pô bien !"
Code : Tout sélectionner
output : Aïe, aïe, ça écrit pô bien !java -jar "C:\Users\moi\Decypher.jar" "Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "GhpMryHkHJ6uZ87SZg816R4TbHwaliyYxSwzjJyyelA="
soit depuis des fichiers batch (encodés en ANSI ou en UTF-8, même résultat) qui contiennent suucessivement :
Code : Tout sélectionner
output : 5JaO3P+T0ZAEv4+Xbc/bbGvykgT1R0zO7vquGvHF150=
@echo off
java -jar "C:\Users\moi\Encrypt.jar" "Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "Aïe, aïe, ça écrit pô bien !"
pause
Code : Tout sélectionner
output : A´e, a´e, þa Úcrit p¶ bien !@echo off
java -jar "C:\Users\moi\Decypher.jar" "Eo6Uam3jA0-utTtI94bj2lPduuS4Jy9XPtkQG30JQzE=" "5JaO3P+T0ZAEv4+Xbc/bbGvykgT1R0zO7vquGvHF150="
pause
Mais si je mets en second argument du Decypher.jar le message chiffré que j'aurais obtenu par une des deux autres méthode, l'encodage est ok, l'output est conforme.
D'où cela vient-il ? Comment y remédier ?
Voici le triolet de programme en question :
Code : Tout sélectionner
class KeysGenerator {
public static void main(String _arguments[]) {
try {
KeyGenerator key_generator = KeyGenerator.getInstance("AES");
key_generator.init(256, SecureRandom.getInstanceStrong());
SecretKey _key = key_generator.generateKey();
System.out.println("Cle secrete (Base64) : ".concat(Base64.getUrlEncoder().encodeToString(_key.getEncoded())));
} catch(NoSuchAlgorithmException _e) {
System.err.println("Error when creating the key : ".concat(_e.getMessage()));
}
}
}
Code : Tout sélectionner
class Encrypt {
public static void main(String _arguments[]) {
String _key = _arguments[0];
SecretKeySpec _specification = new SecretKeySpec(Base64.getUrlDecoder().decode(_key), "AES");
try {
Cipher _encrypt = Cipher.getInstance("AES");
_encrypt.init(Cipher.ENCRYPT_MODE, _specification);
byte bytes[] = _encrypt.doFinal(_arguments[1].getBytes());
System.out.println("Message chiffre (Base64) : ".concat(Base64.getEncoder().encodeToString(bytes)));
} catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException _e) {
System.err.println("Erreur lors du chiffrement : ".concat(_e.getMessage()));
}
}
}
Code : Tout sélectionner
Merci de bien vouloir m'éclairer, : l'encodage,class AESDecypher {
public static void main(String _arguments[]) {
String _password = _arguments[0];
SecretKeySpec _specification = new SecretKeySpec(Base64.getUrlDecoder().decode(_password), "AES");
try {
Cipher _decypher = Cipher.getInstance("AES");
_decypher.init(Cipher.DECRYPT_MODE, _specification);
byte _bytes[] = _decypher.doFinal(Base64.getDecoder().decode(_arguments[1]));
System.out.println("Message déchiffre : " + new String(_bytes));
} catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException _e) {
System.err.println("Erreur lors du déchiffrement : ".concat(_e.getMessage()));
}
}
}
entre l'unicode de la JVM, le cp1252 de ses flux par défaut, et l'ANSI de Windows (est-ce vraimentà 100 % le cp1252 ?),
n'est vraiment pas ma tasse de thé, d'autant que je ne saisi pas où il se perd, ni même si c'est bien strictement un problèeme d'encodage de l'affichae console.