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

Java Discussion :

Utilisation de Java Cryptography Extension (JCE) avec Cipher


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Par défaut Utilisation de Java Cryptography Extension (JCE) avec Cipher
    Bonjour, voilà depuis un bout de temps j’essaie de faire fonctionner le code pour crypter une phrase. Pour utiliser le code, il a été recommandé de copier les jar "local_policy.jar" et "US_export_policy.jar" dans le dossier security de jre afin que SHA-256 puisse fonctionner. Mais malgré cela j’ai une erreur dont je comprend pas vraiment le sens. vu que je pense que les paramètres fournis sont corrects.
    Voilà le code (Je l’ai récupéré du site javacube)
    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
    import com.google.common.base.Charsets;  
    import org.apache.commons.codec.binary.Base64;  
    import org.slf4j.Logger;  
    import org.slf4j.LoggerFactory;  
    import org.springframework.stereotype.Component;
     
    import javax.crypto.Cipher;  
    import javax.crypto.spec.SecretKeySpec;  
    import java.util.Date;
     
    @Component
    public class CipherUtilSecret {
     
    	private final Logger log = LoggerFactory.getLogger(CipherUtilSecret.class);
     
        public static final String CIPHER_ALGORITHM = "AES";
        public static final String KEY_ALGORITHM = "AES";
        public static final byte[] SECRET_KEY = "16BYTESSECRETKEY" .getBytes(Charsets.UTF_8); // exactly 16 bytes to not use JCE (Java Cryptography Extension)
     
        public String decrypt(String encryptedInput) {
            try {
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(SECRET_KEY, KEY_ALGORITHM));
                return new String(cipher.doFinal(Base64.decodeBase64(encryptedInput)), Charsets.UTF_8);
     
            } catch (Exception e) {
                log.warn(e.getMessage(), e);
                throw new RuntimeException(e);
            }
        }
     
        public String encrypt(String str) {
            try {
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(SECRET_KEY, KEY_ALGORITHM));
                return Base64.encodeBase64URLSafeString(cipher.doFinal(str.getBytes(Charsets.UTF_8)));
     
            } catch (Exception e) {
                log.warn(e.getMessage(), e);
                throw new RuntimeException(e);
            }
        }
    }
    et voilà l’erreur que j’ai
    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
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    Exception in thread "main" java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size or default parameters
    	at CipherUtilTopSecret.encrypt(CipherUtilTopSecret.java:36)
    	at CipherUtilTopSecret.main(CipherUtilTopSecret.java:71)
    Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    	at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
    	at javax.crypto.Cipher.implInit(Cipher.java:801)
    	at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    	at javax.crypto.Cipher.init(Cipher.java:1249)
    	at javax.crypto.Cipher.init(Cipher.java:1186)
    	at CipherUtilTopSecret.buildCipher(CipherUtilTopSecret.java:56)
    	at CipherUtilTopSecret.encrypt(CipherUtilTopSecret.java:29)
    	... 1 more
    Quelqu’un aurait-il une petite idée?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si tu nous montrais vraiment le code qui provoque cette stacktrace ? Parce qu'on y voit qu'on passe par une méthode buildCipher (CipherUtilTopSecret.buildCipher(CipherUtilTopSecret.java:56)) qu'on ne trouve pas dans ton code (La classe ne porte pas le même nom d'ailleurs). Sinon, l'erreur provient d'un problème de taille de clef.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Par défaut
    Désolé, je me suis trompé de classe.
    Voilà le code qui génère l’erreur
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import com.google.common.base.Charsets;  
    import org.apache.commons.codec.binary.Base64;  
    import org.slf4j.Logger;  
    import org.slf4j.LoggerFactory;  
    import org.springframework.stereotype.Component;
     
    import javax.crypto.Cipher;  
    import javax.crypto.NoSuchPaddingException;  
    import javax.crypto.spec.SecretKeySpec;  
    import java.io.UnsupportedEncodingException;  
    import java.security.InvalidKeyException;  
    import java.security.Key;  
    import java.security.MessageDigest;  
    import java.security.NoSuchAlgorithmException;
     
    @Component
    public class CipherUtilTopSecret {
     
        private final Logger log = LoggerFactory.getLogger(CipherUtilTopSecret.class);
     
        public static final String CIPHER_ALGORITHM = "AES";
        public static final String KEY_ALGORITHM = "AES";
        public static final String PASS_HASH_ALGORITHM = "SHA-256";
        public static final String DEFAULT_PASS = "Your Default Security PassPhrase";
     
        public String encrypt(String data) {
            try {
                Cipher cipher = buildCipher(DEFAULT_PASS, Cipher.ENCRYPT_MODE);
                byte[] dataToSend = data.getBytes(Charsets.UTF_8);
                byte[] encryptedData = cipher.doFinal(dataToSend);
                return Base64.encodeBase64URLSafeString(encryptedData);
     
            } catch (Exception e) {
                log.warn(e.getMessage(), e);
                throw new RuntimeException(e);
            }
        }
     
        public String decrypt(String encryptedValue) {
            try {
                Cipher cipher = buildCipher(DEFAULT_PASS, Cipher.DECRYPT_MODE);
                byte[] encryptedData = Base64.decodeBase64(encryptedValue);
                byte[] data = cipher.doFinal(encryptedData);
                return new String(data, Charsets.UTF_8);
     
            } catch (Exception e) {
                log.warn(e.getMessage(), e);
                throw new RuntimeException(e);
            }
        }
     
        private Cipher buildCipher(String password, int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException {
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            Key key = buildKey(password);
            cipher.init(mode, key);
            return cipher;
        }
     
        private Key buildKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
            MessageDigest digester = MessageDigest.getInstance(PASS_HASH_ALGORITHM);
            digester.update(String.valueOf(password).getBytes(Charsets.UTF_8.name()));
            byte[] key = digester.digest();
            return new SecretKeySpec(key, KEY_ALGORITHM);
        }
     
     
        public static void main(String[] args) {
            CipherUtilTopSecret cipherUtil = new CipherUtilTopSecret();
            // Encryption
            String encryptedString = cipherUtil.encrypt("4,5,6 cueillir des cerises : " + String.valueOf(new Date().getTime()));
            // Before Decryption
            System.out.println("Avant decrypt : " + encryptedString);
            String s = cipherUtil.decrypt(encryptedString);
            System.out.println("Après decrypt : " + s);
        }
     
    }
    Je sais que l’erreur est du au faite qu’il ne retrouve pas les jar contenus dans le dossier JCE de java mais j’arrive pas à résoudre le problème. J’ai même essayé de créer un JRE pour eclispe en intégrant les jar de JCE mais toujours rien.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Le problème vient de la taille de la clef qui n'est pas supportée par défaut. Il faut en effet copier les jars téléchargeable sur la page "Java Cryptography Extension (JCE) Unlimited Strength" pour la version de JRE utilisée, et les mettre dans le dossier lib/security (remplacer ceux déjà présents). Ce qui pose un réel problème de déploiement (obligé de patcher la jre, et ce, à chaque mise à jour). Passe encore sur un serveur, mais pour des postes clients, c'est vraiment plutôt galère. Il y avait une bidouille en passant par de la réflexion, mais depuis la 8u102, elle n'est plus applicable semble-t-il. En Java 9, il parait qu'on pourra faire Security.setProperty("crypto.policy", "unlimited");.

    Si le problème de déploiement ne se pose pas, normalement la manipulation que tu as dû faire doit fonctionner. Encore faut-il que tu aies bien fait la manipulation.
    Citation Envoyé par romson2 Voir le message
    dans le dossier JCE de java
    Je ne sais pas ce que tu entends par dossier JCE de java. Le dossier où copier les jars est celui-ci :
    Nom : Capture.PNG
Affichages : 909
Taille : 20,7 Ko

    Sinon utiliser la bibliothèque BouncyCastle.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Par défaut
    Salut, oui la manipulation que j’ai effectué est correcte. Je viens de trouver le problème. J’avais omis un petit détail. Je suis sous debian et pour pouvoir copier les jar dans jre/lib/security je suis passé par le root. donc eclipse n’avait accès au local_policy.jar et US_export_policy.jar qu’en mode lecture. Là je viens d’ajouter les autorisations d’exécution et tout fonctionne comme sur des roulettes. Désolé pour cet oubli, ça m’a fait perdre près d’une semaine. Merci pour l’aide

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

Discussions similaires

  1. utiliser classe java avec jstl
    Par yacine.dev dans le forum Taglibs
    Réponses: 2
    Dernier message: 27/01/2010, 17h39
  2. ouvrir un fichier d'extension *.pyw avec java
    Par kinfo dans le forum GUI
    Réponses: 6
    Dernier message: 07/12/2009, 21h32
  3. utilisation de java avec c#
    Par TaymouWan dans le forum C#
    Réponses: 2
    Dernier message: 25/05/2009, 10h36
  4. [XPATH] Pouvoir utiliser les fonctions XPath 2.0 avec Java
    Par Phoennyx dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 08/11/2008, 21h53
  5. création archive d'extension bpr avec java?
    Par mina86 dans le forum Général Java
    Réponses: 2
    Dernier message: 27/05/2008, 11h46

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