IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Java Discussion :

Cryptage / déctyptage PBEEncryptor


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut Cryptage / déctyptage PBEEncryptor
    Bonjour à tous, je viens vers vous afin de solliciter une aide de votre part sur l'usage d'une class disponible sur ce site.

    J'utilise la class PBEEncryptor pour encrypter un fichier avec un mot de passe, puis pour le décrypter.

    Pour le cryptage cette class semble fonctionner sans problème, mais lors du décryptage je rencontre un problème voici le code utilisé et l'erreur rencontrée :

    Pour le cryptage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    String mdp = "password";
    char[] password = mdp.toCharArray();
     
    SecretKey cle = PBEEncryptor.generateKey(password);
    try {
    PBEEncryptor cryptage = new PBEEncryptor(cle);
    cryptage.encryptFile(compressFile, crypteFile);
    } catch (InvalidKeyException e1) {
    e1.printStackTrace();
    } catch (FileNotFoundException e1) {
    e1.printStackTrace();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    Pour le décryptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    String mdp = "password";
    char[] password = mdp.toCharArray();
     
    SecretKey cle = PBEEncryptor.generateKey(password);
    try {
    PBEEncryptor decryptage = new PBEEncryptor(cle);
    decryptage.decryptFile(crypteFile,compressFile);
     
    } catch (InvalidKeyException e1) {
    e1.printStackTrace();
    } catch (FileNotFoundException e1) {
    e1.printStackTrace();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    L'erreur rencontrée au décryptage est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    javax.crypto.BadPaddingException: Given final block not properly padded
        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
        at com.sun.crypto.provider.SunJCE_ab.b(DashoA13*..)
        at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineDoFinal(DashoA13*..)
        at javax.crypto.Cipher.doFinal(DashoA13*..)
        at org.cosmopol.crypto.CipherEncryptor.crypt(CipherEncryptor.java:70)
        at org.cosmopol.crypto.PBEEncryptor.decryptStream(PBEEncryptor.java:351)
        at org.cosmopol.crypto.StreamEncryptor.decryptFile(StreamEncryptor.java:100)
        at org.test.Application$1.actionPerformed(Application.java:323)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

    Mon fichier pèse 1 754 Ko ( environ )

    Ps : pour le mot de passe la c'est pour le test cela va de soit
    Merci à vous

  2. #2
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Erreur de padding = erreur de bourrage. En gros ça doit être un chiffrement par bloc et qui dit bloc dit blocs de longueurs identiques ce qui signifie que s'il manque des bytes pour avoir des blocs de longueur identiques sur le dernier bloc, ce dernier est complété par des caractères par défaut (ça dépend du padding utilisé.).

    Voilà en gros pour l'explication.

    Maintenant pour trouver concrètement le problème il faudrait avoir le code source des méthodes encryptFile() et decryptFile().

    EDIT : au fait on dit chiffrement et pas cryptage qui n'existe pas.

  3. #3
    Membre confirmé Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    La classe utilisée :

    http://www.developpez.net/forums/m2495734-75/

    La superclasse :

    http://www.developpez.net/forums/m2474125-73/

    La classe encryptFile() et decryptFile()

    http://www.developpez.net/forums/m2587386-76/

    ----------

    Merci pour la correction cryptage / chiffrement

  4. #4
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    La classe CipherEncryptor doit être bugguée lors du déchiffrement pour la gestion du padding. Lors du chiffrement normalement le Cipher fait le padding tout seul mails comme il fait tout à la mimine et que je ne vois aucune notion de padding dans la méthode crypt() de CipherEncryptor ...

    D'ailleurs il le dit lui même dans ses posts :
    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.
    Utilises un autre exemple de code que celui-ici, visiblement il marche mal.

    Par exemple regarde du côté de BouncyCastle dont voici un exemple de chiffrement AES :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    package chapter2;
     
    import java.security.Security;
     
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
     
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
     
     
    /**
     * Basic symmetric encryption example
     */
    public class SimpleSymmetricExample
    {   
        public static void main(
            String[]    args)
            throws Exception
        {
        	Security.addProvider(new BouncyCastleProvider());
     
            byte[]        input = new byte[] { 
                    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
                    (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb,
                    (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff };
            byte[]        keyBytes = new byte[] { 
                    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
     
            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
     
            Cipher        cipher = Cipher.getInstance("AES/ECB/NoPadding", "BC");
     
     
            System.out.println("input text : " + Utils.toHex(input));
     
            // encryption pass
     
            byte[] cipherText = new byte[input.length];
     
            cipher.init(Cipher.ENCRYPT_MODE, key);
     
            int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
     
            ctLength += cipher.doFinal(cipherText, ctLength);
     
            System.out.println("cipher text: " + Utils.toHex(cipherText) + " bytes: " + ctLength);
     
            // decryption pass
     
            byte[] plainText = new byte[ctLength];
     
            cipher.init(Cipher.DECRYPT_MODE, key);
     
            int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
     
            ptLength += cipher.doFinal(plainText, ptLength);
     
            System.out.println("plain text : " + Utils.toHex(plainText) + " bytes: " + ptLength);
        }
    }
    La classe utilitaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package chapter2;
     
    /**
     * General utilities for the second chapter examples.
     */
    public class Utils
    {
        private static String	digits = "0123456789abcdef";
     
        /**
         * Return length many bytes of the passed in byte array as a hex string.
         * 
         * @param data the bytes to be converted.
         * @param length the number of bytes in the data block to be converted.
         * @return a hex representation of length bytes of data.
         */
        public static String toHex(byte[] data, int length)
        {
            StringBuffer	buf = new StringBuffer();
     
            for (int i = 0; i != length; i++)
            {
                int	v = data[i] & 0xff;
     
                buf.append(digits.charAt(v >> 4));
                buf.append(digits.charAt(v & 0xf));
            }
     
            return buf.toString();
        }
     
        /**
         * Return the passed in byte array as a hex string.
         * 
         * @param data the bytes to be converted.
         * @return a hex representation of data.
         */
        public static String toHex(byte[] data)
        {
            return toHex(data, data.length);
        }
    }
    C'est quand même plus simple !

  5. #5
    Membre confirmé Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par défaut
    Merci de prendre le temps de m'aider, concernant les classes j'ai demandé à Razgriz ( auteur de ces classes ) les dernières modifications, ce dernier m'a fait parvenir les sources sans problème, mais l'erreur reste présente.

    En ce qui concerne ton exemple certes il est plus simple mais sauf erreur de ma part il oblige à installer jce_policy-6 (unlimited strength cryptography) ce que je ne peux pas faire.

  6. #6
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    En ce qui concerne ton exemple certes il est plus simple mais sauf erreur de ma part il oblige à installer jce_policy-6 (unlimited strength cryptography) ce que je ne peux pas faire.
    Effectivement c'est le cas.

    Malheureusement je ne peux pas aller plus loin dans l'aide. C'est une erreur de padding c'est certain, il y a plusieurs padding différents, il te faut trouver lequel est utilisé par défaut pour l'algorithme de chiffrement que du utilise puis respecter les règles du padding lors du déchiffrement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cryptage de fichier
    Par :GREG: dans le forum Composants VCL
    Réponses: 6
    Dernier message: 18/12/2008, 09h43
  2. Cryptage de colonnes sous Oracle
    Par Julian Roblin dans le forum SQL
    Réponses: 9
    Dernier message: 28/11/2006, 18h24
  3. Cryptage
    Par Claythest dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 04/06/2003, 15h20
  4. cryptage
    Par giminik dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 22h46
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo