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 :

Chiffrage 3DES 128 bits en Java 5.0


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Par défaut Chiffrage 3DES 128 bits en Java 5.0
    Bonjour à tous,

    Je dois intégrer dans notre application Java (simple war sous JOnAS) le chiffrage d'une donnée en "Triple DES 128 bits" (3DES).

    Je suis en Java 5.0.

    Si j'ai bien compris ce qui est dit dans les docs et exemples décrivant le cryptage 3DES, le JDK 5.0 standard ne permet pas des clés de plus de 24 bits.
    En effet, si elles sont plus grandes, j'ai une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.security.InvalidKeyException: Invalid key length: 128 bytes


    Il faut donc que je télécharge le "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 5.0" (http://"http://java.sun.com/javase/d...ndex_jdk5.jsp", lien en bas de la page) qui me fournit une nouvelle version des fichiers US_export_policy.jar et local_policy.jar à installer sous <java-home>\lib\security.

    Mais apparemment ce n'est pas suffisant. J'ai cette fois l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.security.InvalidKeyException: Wrong key size


    Dans la doc "JavaTM Cryptography Extension (JCE) Reference Guide" (http://java.sun.com/j2se/1.5.0/docs/...tml#ExemptApps), il est dit qu'il faut :
    - modifier le code (ajouter ExemptionMechanism),
    - ajouter un fichier cryptoPerms (permission policy file),
    - signer le jar de l'application.

    Mais cette doc ne parle pas du téléchargement du "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 5.0", je pensais donc que celui-ci suffisait.

    Est-ce que quelqu'un a mis en oeuvre en Java le chiffrage 3DES ?
    Faut-il en passer obligatoirement par la signature du jar et tout et tout ... ?

    Merci d'avance à tous.

  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 : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    A priori tu n'utilises pas une longueur de clef valide pour 3DES.

    Fais voir ton code stp.

    EDIT : Sinon tu es bien certain d'avoir écrasé les 2 fichiers jar ? Tu es certain d'avoir fait ça dans le bon dossier du JRE ?

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Par défaut
    Le voilà :

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.spec.InvalidKeySpecException;
     
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESedeKeySpec;
    import javax.crypto.spec.SecretKeySpec;
     
    public class TestSimple {
     
    	/**
             * @param args
             * @throws NoSuchAlgorithmException 
             * @throws InvalidKeySpecException 
             * @throws NoSuchPaddingException 
             * @throws InvalidKeyException 
             * @throws BadPaddingException 
             * @throws IllegalBlockSizeException 
             */
    	public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    		// TODO Auto-generated method stub
     
    		// Clé 3DES au format "transparent"
    		byte[] tripleDesCleData = new byte[24] ;
    		for ( int i=0; i < tripleDesCleData.length; i++) {
    			tripleDesCleData[i] = 5; // Valeur au hasard
    		}
     
    		// Transformation du format "transparent" au format "opaque"
    		SecretKey tripleDesCle = new SecretKeySpec(tripleDesCleData, "DESede");
     
    		// Transformation du format "opaque" au format "transparent"
    		SecretKeyFactory desEdeFactory = SecretKeyFactory.getInstance("DESede");
    		DESedeKeySpec desEdeSpec = (DESedeKeySpec) desEdeFactory.getKeySpec(
    				tripleDesCle, DESedeKeySpec.class);
    		byte[] tripleDesCleData_ = desEdeSpec.getKey();
     
    		System.out.print("Clé : ");
    		for (byte b : tripleDesCleData_) {
    			System.out.print(b + "/");
    		}
    		System.out.println();
    		System.out.println();
     
    		// Création de l'objet Cipher
    		// Pour l'algorithme DESede, par défaut mode = ECB, padding scheme = PKCS5Padding;
    		Cipher cipher = Cipher.getInstance("DESede");
     
    		//
    		// Cryptage du message
    		//
     
    		// Initialisation en mode Encryptage
    		cipher.init(Cipher.ENCRYPT_MODE, tripleDesCle);
     
    		String messageStr = "azertyuiop";
    		byte[] message = messageStr.getBytes();
     
    		// Affichage en String et byte[] du message à crypter
    		System.out.println("Message à crypter (String) : " + messageStr);
    		System.out.print("Message à crypter (byte[]) : ");
    		for (byte b : message) {
    			System.out.print(b + "/");
    		}
    		System.out.println();
     
     
    		// Cryptage du message
    		byte[] messageCrypte = cipher.doFinal(message);
     
    		// Affichage du message crypté 
    		for (byte b : messageCrypte) {
    			System.out.print(b + "/");
    		}
    		System.out.println();
     
     
    		// Décryptage du message
    		cipher.init(Cipher.DECRYPT_MODE, tripleDesCle);
    		byte[] messageDecrypte = cipher.doFinal(messageCrypte);
     
    		// Affichage du message décrypté 
    		System.out.print("Message décrypté (byte[]) : ");
    		for (byte b : messageDecrypte) {
    			System.out.print(b + "/");
    		}
    		System.out.println();
     
    		System.out.println("Message décrypté (String) : " + new String(messageDecrypte));
    		System.out.println();
     
     
    	}
     
    }

    Le programme est "simple".

    J'initialise une clé (avec n bytes à la valeur "5"), avec n=24 dans le test.
    Je crypte "azertyop" et je le décrypte.

    Pour changer la longueur de la clé, il suffit de modifier la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] tripleDesCleData = new byte[24] ;
    Exemple : 128.

    Avec les jar initiaux, j'ai l'exception suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in thread "main" java.security.InvalidKeyException: Invalid key length: 128 bytes
    	at com.sun.crypto.provider.DESedeCipher.engineGetKeySize(DashoA12275)
    	at javax.crypto.Cipher.b(DashoA12275)
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.init(DashoA12275)
    	at javax.crypto.Cipher.init(DashoA12275)
    	at TestSimple.main(TestSimple.java:59)
    Avec les jar téléchargés (et aucune autre modification), j'ai l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "main" java.security.InvalidKeyException: Wrong key size
    	at com.sun.crypto.provider.SunJCE_aa.a(DashoA12275)
    	at com.sun.crypto.provider.SunJCE_i.a(DashoA12275)
    	at com.sun.crypto.provider.SunJCE_h.a(DashoA12275)
    	at com.sun.crypto.provider.SunJCE_h.a(DashoA12275)
    	at com.sun.crypto.provider.DESedeCipher.engineInit(DashoA12275)
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.a(DashoA12275)
    	at javax.crypto.Cipher.init(DashoA12275)
    	at javax.crypto.Cipher.init(DashoA12275)
    	at TestSimple.main(TestSimple.java:59)
    Ce n'est pas la même.

    Merci de ton aide.

  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 : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Le message initial sans avoir débridé les longueurs de clefs du JRE est tout a fait normal.

    Ensuite, je ne comprends pas ce passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] tripleDesCleData = new byte[24] ;
    		for ( int i=0; i < tripleDesCleData.length; i++) {
    			tripleDesCleData[i] = 5; // Valeur au hasard
    		}
    Je m'explique :
    1 byte = 1 octet = 8 bits

    Là tu cherches à chiffrer en 3DES mode ECB avec une clef de longueur 24*8 = 192 bits laquelle ne contient que des entiers 5.

    Or, il me semble (mais je peux me tromper je ne suis pas un expert) que la longueur de clefs pour l'algo 3DES doit être soit de 112 bits, soit de 168 bits.

    Donc essayes avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] tripleDesCleData = new byte[14];
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] tripleDesCleData = new byte[21] ;

Discussions similaires

  1. Problème d'alignement sur 128 bits
    Par progfou dans le forum C++
    Réponses: 24
    Dernier message: 06/07/2007, 16h15
  2. Nombre de 128 bits
    Par Elendhil dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2007, 17h00
  3. [SECURITE] Chiffrement 3DES C et dechiffrement JAVA
    Par dams50 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 12/12/2005, 21h58
  4. déclaration de variables de 16, 32 et 128 bits
    Par samipate dans le forum C++
    Réponses: 10
    Dernier message: 30/12/2004, 22h33
  5. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14

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