Chiffrement RSA - Problème avec des caractères accentués
Chiffrement RSA - Problème avec des caractères accentués
Bonjour,
Novice dans l'utilisation de RSA, j'ai développé une petite fonction de chiffrement de mots de passe qui ne fonctionne pas quand le mot de passe contient des caractères accentués. Évidemment, il y a un moyen simple de « contourner » le problème en remplaçant systématiquement les caractères accentués côté serveur et côté client, mais ce n'est pas très propre et j'aimerais comprendre.
J'imagine qu'il s'agit d'un problème d'encodage. Cependant, je ne trouve pas l'endroit précis où je dois spécifier UTF-8 dans les bibliothèques Bountycastle du côté client et java.security.* du côté serveur.
Je vois des tonnes de classes pour transformer les chaînes en HEX ou en Base64, faire de l'encodage (encodings) et faire du remplisssage (padding)... J'y comprends rien.
Est-ce que cela pourrait m'aider?
Merci
Un code chiffré n'est pas du texte! (Ciphertext is not text!)
En cherchant sur le Web pour régler mon problème, j'ai trouvé un très bon article sur le sujet (Cryptography with International Character Sets)l et aussi (Storing and representing ciphertext)
Règle 1: Un code chiffré n'est pas du texte! (Ciphertext is not text!)
Règle 2: Travailler avec des bytes pas des chaînes de textes ("Work with bytes not text strings")
Règle 3: Ne jamais mettre des bytes chiffrés directement dans une chaîne de texte ("Do not put ciphertext bytes directly into a string type")
J'ai aussi compris pourquoi utiliser l'encodage BASE64 ou HEX pour transférer les données chiffrées entre les plateformes. : « Store ciphertext either as a raw binary file or convert it to base64 or hexadecimal format.»
Mon problème n'est pas encore réglé, mais j'ai des pistes sérieuses...
Remarquez que j'avais déjà essayé de convertir mes bytes chiffrés en HEX mais sans grand succès, puis j'ai abandonné... Probablement que j'avais un problème ailleurs.
Le seul problème que je vois avec ces deux excellents articles, c'est qu'ils contiennent du code en C, en C++, en C# et en VB.NET, VB6 et même VBA MAIS PAS UNE LIGNE DE JAVA... à n'en pas douter ils émanent d'un disciple du grand Bill... Dommage!
Je vous tiens informé de mes progrès... à moins que le manque de temps ne m'oblige à filtrer / remplacer les caractères multibytes. Dans ce cas, honte sur moi!
Effectivement il fallait convertir en Hex (ou encore Base64)
private String encrypterMotDePasse(String motDePasse, ClePublique clePublique) {
String motDePasseChiffreStringHex = "";
// Conversion du mot de passe du format String => bytes[]
byte[] motDePasseEnBytes = motDePasse.getBytes();
if ( null != clePublique) { // Initialisation du moteur de chiffrement
BigInteger modulo = new BigInteger(clePublique.getModulo());
BigInteger pubExp = new BigInteger(clePublique.getExposant());
RSAKeyParameters pubParameters = new RSAKeyParameters(false,
modulo, pubExp);
AsymmetricBlockCipher moteurDeChiffrement = new RSAEngine();
moteurDeChiffrement.init(true, pubParameters);
// Chiffrement du mot de passe
byte[] motDePasseChiffreEnBytes = null;
try
{ motDePasseChiffreEnBytes = moteurDeChiffrement.processBlock(motDePasseEnBytes,
0,motDePasseEnBytes.length);
}
catch (Exception e)
{ displayStatus("Failed - exception " + e.toString(),"errorMsg");
}
// Conversion mot de passe chiffre de bytes[] vers bytes[] Hex
byte[] motDePasseChiffreEnBytesHex = Hex.encode(motDePasseChiffreEnBytes);
// Conversion mot de passe chiffre de bytes[] Hex vers String
Hex motDePasseChiffreStringHex = new
String(motDePasseChiffreEnBytesHex);
}
return motDePasseChiffreStringHex; }