Pb Cipher encrypte/décrypte avec les clés d'un certificat
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 2013
-
8 mars 2011 à 15:29
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 2013
-
21 mars 2011 à 15:50
Bonjour amis codeurs,
Alors voilà mon problème, je cherche à vérifier que l’encryption RSA d'une donnée via un certificat s'est bien passée, en la décryptant grâce à la clé public dudit certificat. Essuyant de nombreux échecs j'en suis venu à pondre un petit bout de code qui résume mon problème, le voici :
/***********************************************************/
String message = "un message à encrypter";
String alias = "FAKE-alias";
// on load le keystore
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
// on récupère un certif, sa clé privée et sa clé publique
X509Certificate certificate = (X509Certificate)ks.getCertificate(alias);
PrivateKey privatekey = (PrivateKey)ks.getKey(alias, null);
PublicKey publickey = certificate.getPublicKey();
// on ciphe dans un sens
Cipher cipherencrypt = Cipher.getInstance("RSA");
cipherencrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encrypted = cipherencrypt.doFinal(message.getBytes());
// on ciphe dans l'autre sens
Cipher cipherdecrypt = Cipher.getInstance("RSA");
cipherdecrypt.init(Cipher.DECRYPT_MODE, publickey);
byte[] decrypted = cipherdecrypt.doFinal(encrypted);
System.out.println(new String(decrypted));
/***********************************************************/
Sur le dernier doFinal() j'ai l'exception suivante :
javax.crypto.BadPaddingException: Data must start with zero
(je vous passe le reste de la pile)
* Pour être sûr de pas écrire n'importe quoi j'ai tenté la même manip' avec une paire de clés générées par KeyPairGenerator, et j'obtiens bien la relation :
Message = Décrypte(Encrypte(Message, ClePrivée), CléPublique)
* J'ai également tenté différents Modes et Paddings pour l'instanciation des cipher (ex. : "RSA/ECB/PKCS1Padding")
Alors qu'est-ce que je rate ? y'a une notion qui m'échappe, nécessairement ...
Merci d'avance pour vos contributions à venir :)
PS : comment on change l'adresse mail de son compte cs ?
De souvenir je pointe vers une adresse à laquelle je n'accède plus, j'aimerais bien mettre ça à jour.
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 201312 16 mars 2011 à 10:02
Re salut,
Autre angle d'attaque du même problème, car je vois que le sujet présenté comme il l'est ne motive pas grand monde ^^
Je monte un objet de type javax.xml.crypto.dsig.XMLSignature (avec une XMLSignatureFactory, un SignedInfo et tout le tralala), puis que je fais appel à sa fonction sign(DOMSignContext). J'obtiens un une jolie signature XAdEs. Jusque là tout va bien (c'est l'atterrissage qui fait mal ^^).
Maintenant je reprends cette signature XML, je récupère la valeur de la signature via xmlSignature.getSignatureValue().getValue(). Je passe cette valeur dans un cipher RSA en DECRYPT_MODE avec la clé publique du certificat qui a servi à signer le doc. Magie ! ça passe ... mais le byte[] de sortie n'a aucun sens :(
Je tente de comparer à mes données, à mes données SHA-1-ées, et même SHA-256-ées, mais rien. D'ailleurs le charabia sorti du cipher taille 35 octets, ce qui correspond à aucun SHA (20 bytes pour le SHA-1 ou 32 bytes pour SHA-256).
Si ça vous parle plus ...
Je dois être à côté de la plaque sur certaines notions ...