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 AES clé 256bits


Sujet :

Sécurité Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 113
    Points : 54
    Points
    54
    Par défaut Cryptage AES clé 256bits
    Je ne sais pas si je suis dans le bon forum mais voilà ma question :
    J'ai une chaine que je souhaite cryptée en AES 256bits (en java). J'ai trouvé un algo qui l'air de faire ça pas trop mal.
    Mon problème est la clé de chiffrage : je voudrais fournir une chaîne, exple :"toto" et en tirer une clé me permettant ensuite de faire mon cryptage AES 256 bits.
    Et la je bloque... si quelqu'un a une idée je suis preneuse!
    Merci d'avance


    Pour info voici le code que j'ai pour l'instant (récupéré sur le site de Sun)
    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
           String message="This is just an example";
     
           // Get the KeyGenerator
     
           KeyGenerator kgen = KeyGenerator.getInstance("AES");
           kgen.init(128); // 192 and 256 bits may not be available
     
     
           // Generate the secret key specs.
           SecretKey skey = kgen.generateKey();
           byte[] raw = skey.getEncoded();
     
           SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
     
           // Instantiate the cipher
     
           Cipher cipher = Cipher.getInstance("AES");
     
           cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
     
           byte[] encrypted =
             cipher.doFinal((args.length == 0 ?
              "This is just an example" : args[0]).getBytes());
           System.out.println("encrypted string: " + asHex(encrypted));

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 17
    Points
    17
    Par défaut AES 256
    Salut,

    Je travaille exactement sur la même chose, mais comme tu peux le voir dans ton code (enfin celui de sun ), et bien les clé de 192 et 256 bits ne sont pas nécessairement supportées... de toute façon il te faut 256/8 caractères, soit 32, donc si tu veux utiliser toto comme clé, il te faut 28 espaces...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    	byte[] raw = "ma cle secrete 123456789 1234567".getBytes();
    	SecretKey skeySpec = new SecretKeySpec(raw, "AES");
     
    	// Chiffrement du fichier
    	Cipher c = Cipher.getInstance("AES");    
            c.init(Cipher.ENCRYPT_MODE, skeySpec, salt);
    	byte[] buf_crypt = c.doFinal(buffer);
    Mais tu vas te retrouver dans le même cas que moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    java.security.InvalidKeyException: Illegal key size
    	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)
    Je suis dessus, je cherche, pas envie de me l'implémenter tout seul, même si ça peut être intéressant et enrichissant, je ne vais pas y passer la nuit...

    bouncycastle est une librairie de crypto très complète en java, je te la conseille.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 17
    Points
    17
    Par défaut ayé
    Ca y est je l'ai, il faut installer ça :

    Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

    Sinon les clés sont limitées en taille, tu peux le trouver là :

    http://java.sun.com/javase/downloads/index.jsp(other downloads, en bas de la page)

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Merci pour l'info mais malheuresement cela ne m'avance pas trop car je ne peux pas modifier les versions de base de lib java..., je vais me tourner vers la lib gnu-crypto, seule lib que j'ai à ma disposition... mais je n'arrive pas à trouver d'exemple de mise en oeuvre... surtout avec mon pb de clé...
    Si quelqu'un a une idée...
    Merci d'avance

  5. #5
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Si tu veux absolument passer par une chaîne de caractère pour ta clé, génère une clé AES, et cryte-là avec l'algorithme PBE (la clé pour ça est obtenue avec une chaîne de caratère, et donc ça revient au même pour ton problème).
    On a toujours besoin d'un plus bourrin que soi

    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.

  6. #6
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Tu peux essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    KeyGenerator keygen = KeyGenerator.getInstance("AES");
                SecureRandom random = new SecureRandom(new String("la clef secret").getByte());
                keygen.init(random);
                SecretKey key = keygen.generateKey();
    D'après ce que j'ai compris de la javadoc, c'est normalement utilisé si tu as un générateur de clef très performant.

    Sinon tu peux directement envoyer l'objet secretkey sous forme de byte[].

    Bon courage en espérant de t'avoir aidé.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    bonjour a tous.
    Je fais exactement la meme chose que toi.

    Je voudrais passer comme passphrase une chaine de caractere fournie par un algo indépendant.

    Alors ca marche avec une clé qui fait 16 bits et non 32.

    pour reprendre l'exemple precedement cité il faudrait faire

    string passphrase ="V";
    for (int i =0;i<15;i++)
    passphrase=passphrase+"B";

    byte[] raw = passphrase.getBytes();
    SecretKey skeySpec = new SecretKeySpec(raw, "AES");

    // Chiffrement du fichier
    Cipher c = Cipher.getInstance("AES");
    c.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] buf_crypt = c.doFinal(buffer);


    ceci dit si quelqu'un a une idée pour avoir une passphrase plus longue je suis preneur !!!

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par philippe13 Voir le message
    Bonjour,

    Tu peux essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    KeyGenerator keygen = KeyGenerator.getInstance("AES");
                SecureRandom random = new SecureRandom(new String("la clef secret").getByte());
                keygen.init(random);
                SecretKey key = keygen.generateKey();
    D'après ce que j'ai compris de la javadoc, c'est normalement utilisé si tu as un générateur de clef très performant.

    Sinon tu peux directement envoyer l'objet secretkey sous forme de byte[].

    Bon courage en espérant de t'avoir aidé.
    Ta solution fonctionne tres bien : les passphrasses peuvent etre super longues.
    merci

  9. #9
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Juste une question :

    l'appel à keygen.generateKey() retournera-t-il toujours la même clé secrète si la chaine de caractères du Secure Random est la même?
    On a toujours besoin d'un plus bourrin que soi

    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.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je pense que oui car j'ai fait 2 progs séparés pour chiffrer et déchiffrer et ca marche

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Août 2004
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Bonjour à tous,

    si cela vous intéresse toujours, je viens de voir des exemples dans les sens java->php, php->java....

    A cette adresse:
    http://propaso.com/blog/?cat=5

    Voir: AES Interop Between PHP and Java (en quatre partie)

    Bonne lecture !

    MiChAëL

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    bonjour tout le monde,
    voila j'utilise la classe cipher pour crypter des mots de passe, avec l'algorithme AES (c'est un cryptage symétrique), j'ai un problème lors de decryptage de certains mot de passe (uniquement pour certains), c'est à dire j'arrive à crypter tout les mots de passes, par contre lors de la phase de decryptage certains mots de passes y a une exception qui est générée:
    voici mon programme :

    SecretKey key = (bien initialisée);
    Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    aesCipher.init(mode, key);
    byte[] motCrypte = aesCipher.doFinal(text.getBytes()); //problème à ce niveau

    et voici l'exception générée (pour certains mots de passes non acceptés):
    javax.crypto.BadPaddingException: Given final block not properly padded

    j'ai fait des recherches sur internet et sur ces forums (le problème est toujours posé mais j'ai pas trouvé de réponse concrète), j'ai essayé les méthodes qui ont été proposées (utilisé une boucle de lecture de bits), mais toujours c'est le même pas cas pour ces mots non acceptés.

    Alors, je suis bloqués, et si quelqu'un a eu déja ce problème et l'a résolu ou bien il a une idée à m'orienter.

    Merci beaucoups:

  13. #13
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Tu ne dois pas appeler doFinal comme ça à la barbare!
    C'est partoculièrement impropre et come tu l'a vu donne des exceptions de ce genre.

    Je te passe ici une méthode que j'ai écrite qui chiffre de manière transparente un stream en entrée et qui écrit le résultat dans un stream en sortie, en lui donnant un Cipher correctement initialisé (ce qui est ton cas).

    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
     
    /**
         * Crypts or decrypts the specified input stream to the specified output
         * stream with a given cipher. The crypting or decrypting operation is 
         * determined by the cipher's state.
         * @param cipher The cipher used to crypt the specified input stream to the specified output
         * stream.
         * @param in the input srteal stream to be encypted or decrypted.
         * @param out the output stream to be encypted or decrypted.
         * @throws java.io.IOException if an I/O error occurs during crypting the input stream to the output stream.
         */
        public void crypt(InputStream in, OutputStream out, Cipher cipher)
            throws IOException
        {
            int blockSize = cipher.getBlockSize();
            int outputSize = cipher.getOutputSize(blockSize);
            byte[] inBytes = new byte[blockSize];
            byte[] outBytes = new byte[outputSize];
     
            int inLength = 0;
            boolean done = false;
            while(!done)
            {
                inLength = in.read(inBytes);
                if(inLength == blockSize)
                {
                    try
                    {
                        int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
                        out.write(outBytes, 0, outLength);
                    }
                    catch(ShortBufferException e)
                    {
                        e.printStackTrace();
                    }
                }
                else
                    done = true;
            }
     
            try
            {
                if(inLength > 0)
                    outBytes = cipher.doFinal(inBytes, 0, inLength);
                else
                    outBytes = cipher.doFinal();
                out.write(outBytes);
            }
            catch(IllegalBlockSizeException e)
            {
                e.printStackTrace();
            }
            catch(BadPaddingException e)
            {
                e.printStackTrace();
            }
        }
    Dans ton cas tu fais donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ByteArrayInputStream plain = new ByteArrayInputStream(text.getBytes());
    ByteArrayOutputStream ciphered = new ByteArrayOutputStream();
     
    crypt(plain, ciphered, cipher);
    byte[] crypted = ciphered.toByteArray();
    Il manque peut-être un 's' das toByteArray()...

    Comme ça ça marche à coup sur.
    On a toujours besoin d'un plus bourrin que soi

    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.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    merci beaucoups pour ta réponse, je vais faire comme tu m'as dit et je te tiens au courant

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 28
    Points : 20
    Points
    20
    Par défaut cryptage AES
    j'ai essyé, mais toujours le problème existe pour ces mots non acceptés, voila mon code :
    pour l'initialistion de la clé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           SecureRandom random = new SecureRandom();
            keygen.init(random);
            SecretKey key = keygen.generateKey();
            CacheManager.getDbConfiguration().setKey(key);
    et 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
    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
     
    public String crypt(String text, int mode) throws ApplException {
        try {
          SecretKey key = (clé initialisée)
          Cipher aesCipher = Cipher.getInstance("AES");
          aesCipher.init(mode, key); 
     
          int blockSize = aesCipher.getBlockSize();
          int outputSize = aesCipher.getOutputSize(blockSize);
          byte[] inBytes = new byte[blockSize];
          byte[] outBytes = new byte[outputSize];
     
          ByteArrayInputStream in = new ByteArrayInputStream(text.getBytes());
          ByteArrayOutputStream out = new ByteArrayOutputStream();
     
          int inLength = 0;
          boolean done = false;
          while(!done)
          {
              inLength = in.read(inBytes);
              if(inLength == blockSize)
              {
     
                      int outLength = aesCipher.update(inBytes, 0, blockSize, outBytes);
                      out.write(outBytes, 0, outLength);
     
              }
              else
                  done = true;
          }
          if(inLength > 0)
              outBytes = aesCipher.doFinal(inBytes, 0, inLength);
          else
              outBytes = aesCipher.doFinal(); //erreur à ce niveau
          out.write(outBytes); 
     
          byte[] crypted = out.toByteArray();
          return new String(crypted.toString());
        } catch (Exception e) {
          throw new ApplException(e);
        }
      }
    alors je ne sais pas comment ça marche pour certains et non pas pour moi ,
    franchement je suis bloqué et sachant que je suis stagiaire dans une entreprise ou certains utilisateurs sont bloqué à cause de problème, si quelqu'un à une idée ça serai trs gentil et elle sera pour moi une aide très précieuse

  16. #16
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Pouvez vous mettre le code complet du cryptage AES 256.Merci d'avance

Discussions similaires

  1. [Débutant] Cryptage AES, gestion de la clé et du IV
    Par Anozer dans le forum C#
    Réponses: 2
    Dernier message: 25/09/2011, 23h04
  2. [Débutant] cryptage AES avec fichier .hex
    Par sniper59 dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/06/2011, 13h35
  3. Cryptage SSL a 256bit
    Par mustargus dans le forum Sécurité
    Réponses: 5
    Dernier message: 12/03/2011, 21h25
  4. code cryptage AES
    Par youp_db dans le forum Windows
    Réponses: 2
    Dernier message: 04/03/2008, 09h10
  5. Bibliothèque zip avec cryptage AES
    Par guilig dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 01/02/2007, 18h30

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