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 :

Comment utiliser la fonction de hachage du bouncycastle et obtenir le DigestInfo?


Sujet :

Sécurité Java

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut Comment utiliser la fonction de hachage du bouncycastle et obtenir le DigestInfo?
    Bonjour à tous,

    dans le cadre de mon projet de fin d'étude, je teste la bibliothèque Bouncycastle sur les chiffrements symétriques et asymétrique, afin de savoir si elle est conforme au document RFC PKCS1.
    Je dois commencer avec le padding EMSA et pour ce faire, tester tous les points de 1 à 5.
    Le premier point étant que le message est haché par une fonction de hachage et doit renvoyer un message d'erreur au cas où le message M serait trop long, si j'ai bien compris.
    Je dois tester avec une fonction de hachage et j'ai choisi SHA-1.
    Mon problème est que je n'arrive pas à hacher un message avec la fonction SHA1Digest du Bouncycastle.
    Comment tester le point 1 et 2?
    Est ce que j' utilise la bonne méthode?

    9.2 EMSA-PKCS1-v1_5

    This encoding method is deterministic and only has an encoding
    operation.

    EMSA-PKCS1-v1_5-ENCODE (M, emLen)

    Option:
    Hash hash function (hLen denotes the length in octets of the hash
    function output)

    Input:
    M message to be encoded
    emLen intended length in octets of the encoded message, at least
    tLen + 11, where tLen is the octet length of the DER
    encoding T of a certain value computed during the encoding
    operation
    Output:
    EM encoded message, an octet string of length emLen

    Errors:
    "message too long"; "intended encoded message length too short"

    Steps:

    1. Apply the hash function to the message M to produce a hash value
    H:

    H = Hash(M).

    If the hash function outputs "message too long," output "message
    too long" and stop.

    2. Encode the algorithm ID for the hash function and the hash value
    into an ASN.1 value of type DigestInfo (see Appendix A.2.4) with
    the Distinguished Encoding Rules (DER), where the type DigestInfo
    has the syntax

    DigestInfo ::= SEQUENCE {
    digestAlgorithm AlgorithmIdentifier,
    digest OCTET STRING
    }

    The first field identifies the hash function and the second
    contains the hash value. Let T be the DER encoding of the
    DigestInfo value (see the notes below) and let tLen be the length
    in octets of T.

    3. If emLen < tLen + 11, output "intended encoded message length too
    short" and stop.

    4. Generate an octet string PS consisting of emLen - tLen - 3 octets
    with hexadecimal value 0xff. The length of PS will be at least 8
    octets.

    5. Concatenate PS, the DER encoding T, and other padding to form the
    encoded message EM as

    EM = 0x00 || 0x01 || PS || 0x00 || T.

    6. Output EM.
    https://tools.ietf.org/html/rfc3447#section-9.2

    J'ai parcouru le forum et je n'ai pas trouvé de solution.
    Toute aide est la bienvenue.
    Merci

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Bonjour et bienvenue.

    On ne sait pas de quelle technologie tu parles et tu as posté dans le mauvais forum. Si tu veux avoir une chance d'avoir une réponse, on a besoin de savoir avec quel outil et/ou langage tu travailles afin que je puisse déplacer ta discussion dans un forum plus approprié.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    J' effectue les test en java avec junit et j'utilise IntelliJ IDEA.
    Merci

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Bouncycastle est une bibliothèque cryptographique.

    https://github.com/bcgit/bc-java/tre...ycastle/crypto

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Normalement, Java simplifie le travail en donnant accès à des algorithmes de cryptage par une interface générale qui masque ainsi les implémentations concrètes (et peut fonctionner avec divers fournisseurs, dont BouncyCastle).
    On fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String text = "Un texte à chiffrer";
    try {
       MessageDigest md = MessageDigest.getInstance("SHA-1"); //   on passe le nom de l'algorithme en paramètre
     
       md.update(text.getBytes());  // on passe le flux d'octets correspondant au message à chiffrer
       byte[] hash = md.digest(); // on récupère le hash
     
       System.out.println(Arrays.toString(hash));
     
    } catch (NoSuchAlgorithmException e) {
    	e.printStackTrace();
    }
    Mais tu n'auras aucun contrôle sur la sélection de la classe réelle d'implémentation de l'algorithme. On indique à Java par Security.addProvider(new BouncyCastleProvider()); la présence de BouncyCastle.

    Tu dois cependant pouvoir faire ça en direct avec l'implémentation SHA1Digest, avec quelque chose comme (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String text = "Un texte à chiffrer";
    SHA1Digest sha1 = new SHA1Digest();
     
    byte[] message = text.getBytes();
    sha1.update(message, 0, message.length);  // on passe le flux d'octets correspondant au message à chiffrer
     
    byte[] hash = new byte[sha1.getDigestSize()]; // on crée un tableau pour récupérer le hash
    sha1.doFinal(hash, 0); // on récupère le hash
     
    System.out.println(Arrays.toString(hash));
    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.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Salut Joel et merci pour ton aide.

    Ton code marche très bien. Je crée directement un byte-array pour mon message avec une fonction qui le rempli avec une valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static byte[] createByteArr(int bLen){
            byte[] a = new byte[bLen];
     
            for(int i = 0; i < bLen; i++){
                a[i] = 0x42;
            }
            return a;
        }
    et je peux hasher le message:
    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
     // Cree un  byte-array
           byte[] message = createByteArr(40);
     
           // Génère une instance SHA1-digest du Bouncycastle
           SHA1Digest sha1 = new SHA1Digest();
     
           sha1.update(message, 0, message.length);
     
           // Byte-array pour generer mon hash
           byte[] hash = new byte[sha1.getDigestSize()];
     
           // et je l'enregistre
           sha1.doFinal(hash, 0);
     
           StringBuilder sb = new StringBuilder();
           for (byte b : message) {
               sb.append(String.format("%02X ", b));
           }
           System.out.println("Here the array-message: ");
           System.out.println(sb.toString());
     
     
           StringBuilder sb2 = new StringBuilder();
           for (byte b : hash) {
               sb2.append(String.format("%02X ", b));
           }
           System.out.println("Here the hash-message:");
           System.out.println(sb2.toString());
    Seulement je pense ne jamais recevoir le message d erreur du point 1: message too long
    Car le hachage se fait sur 20.
    Ci dessous le output.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Here the array-message: 
    42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 
    Here the hash-message:
    B1 99 18 69 24 05 EB D5 DA 3B 4A 87 83 ED 3B 23 F8 81 0D BA 
    BUILD SUCCESSFUL

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Je vais créer une classe qui implemente l'interface Digest du bouncycastle et voir si je recois le message d'erreur.

  8. #8
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sandysanchez Voir le message
    Seulement je pense ne jamais recevoir le message d erreur du point 1: message too long
    Car le hachage se fait sur 20.
    Oui SHA1 produit un hash de 160 bits, par définition (cf RFC: When a message of any length < 2^64 bits is input, the SHA-1 produces a 160-bit output called a message digest).
    2^64 étant bien supérieur à la taille maximum d'un tableau en Java , ça va être difficile d'obtenir un shaInputTooLong (la classe ne le gère même pas).

    En implémentant l'interface, tu peux obtenir ce que tu veux, mais ça fausse complètement le test.

    Est-ce que ce n'est pas plutôt ce genre de test que tu veux faire :

    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
    public static void test(int length) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
     
    		byte[] message = createMessage(length);
     
    		Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
     
    		KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", provider);
    	    keyGen.initialize(1024);
    	    KeyPair key = keyGen.generateKeyPair(); 
    	    //
    	    // get an RSA cipher object and print the provider   
    	    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider); 
    	    //
    	    cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
    	    byte[] cipherMessage = cipher.doFinal(message);
    	    //
    	}
     
    	private static byte[] createMessage(int length) {
    		byte[] message = new byte[length];
    		Arrays.fill(message, (byte)0x42);
    		return message;
    	}
    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.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Oui tu as raison ce ne sera plus le test de SHA1Digest du Bouncycastle, mais il servira a tester d'autres fonctions Digest.
    D'où l'importance de crée un Digest dont la place du message soit limiter.
    L'exemple que tu m'as donné pourra m'aider plus tard.
    Mais la je dois commencer par faire des test point par point sur le padding EMSA.
    A ce niveau ci je ne crois pas encore avoir besoin de clé.
    J'ai aussi appris la difference entre encoder et chiffrer. Je confondais les deux.

    Ma classe: myDigest implements Digest ne fonctionne pas encore.
    J'essaye d'y remedier avant de poster mon code.

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    j'ai créé ma classe monDigest de manière à avoir le message d'erreur.
    Mais elle ne passe pas le test.
    L'exception est bien appelée, mais j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     java.lang.AssertionError
    Expected exception: java.lang.Exception
    java.lang.AssertionError: Expected exception: java.lang.Exception
    	at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    voici le code de ma classe qui implemente l'interface Digest du Bouncycastle
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    public class myDigest implements Digest {
     
        private static final int DIGEST_LENGTH = 2;
        private int[]   X = new int[4];
        private int     xOff;
        private final byte[]  xBuf = new byte[1];
        private int           xBufOff;
     
        private long    byteCount;
     
        /**
         * Standard constructor
         */
        public myDigest()
        {
            reset();
        }
     
        /**
         * return the algorithm name
         *
         * @return the algorithm name
         */
        public String getAlgorithmName() {
            String algName = "algTest";
     
            return algName;
        }
     
        /**
         * return the size, in bytes, of the digest produced by this message digest.
         *
         * @return the size, in bytes, of the digest produced by this message digest.
         */
        public int getDigestSize() {
     
            return DIGEST_LENGTH;
        }
     
        /**
         * update the message digest with a single byte.
         *
         * @param in the input byte to be entered.
         */
        public void update(byte in) {
            xBuf[xBufOff++] = in;
     
            if (xBufOff == xBuf.length)
            {
                processWord(xBuf, 0);
                xBufOff = 0;
            }
     
            byteCount++;
     
        }
     
        private void processWord(byte[] in, int inOff) {
            // Note: Inlined for performance
    //        X[xOff] = Pack.bigEndianToInt(in, inOff);
            int n = in[  inOff] << 8;
            n |= (in[++inOff] & 0xff);
            X[xOff] = n;
     
            if (++xOff == 1)
            {
                processBlock();
            }
        }
     
        private void processBlock() {
     
     
        }
     
        /**
         * update the message digest with a block of bytes.
         *
         * @param in    the byte array containing the data.
         * @param inOff the offset into the byte array where the data starts.
         * @param len   the length of the data.
         */
        public void update(byte[] in, int inOff, int len) {
     
                 if(len > DIGEST_LENGTH) {
                     try {
                         throw new Exception("Message too long");
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
     
                 }
     
        }
     
        /**
         * close the digest, producing the final digest value. The doFinal
         * call leaves the digest reset.
         *
         * @param out    the array the digest is to be copied into.
         * @param outOff the offset into the out array the digest is to start at.
         */
        public int doFinal(byte[] out, int outOff) {
            if(out.length > DIGEST_LENGTH) {
                try {
                    throw new Exception("Message too long");
                } catch (Exception e) {
                    e.printStackTrace();
                }
     
            }
            return DIGEST_LENGTH;
        }
     
        /**
         * reset the digest back to it's initial state.
         */
        public void reset() {
     
            byteCount = 0;
     
            xBufOff = 0;
            for (int i = 0; i < xBuf.length; i++)
            {
                xBuf[i] = 0;
            }
        }
    }

  11. #11
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est normal : tu l'interceptes direct après l'avoir soulevée...

    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
        throw new Exception("Message too long");
    } catch (Exception e) {
        e.printStackTrace();
    }
    Fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new RuntimeException("Message too long");
    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.

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Merci Joel ca marche!!!

    Je peux tester le point 1 d'une fonction de hachage selon la norme PKCS1 9.2 n'est pas aussi grand que celui des fonctions de hachage usuelles. Même si je n'en vois pas vraiment l'utilité sur le plan actuel.
    Dans le cadre de mon projet je devais le faire et c'est fait.
    Etudiant en allemagne j'ai du mal à comprendre en Allemand.
    Merci de tomber sur des developpeurs qui parlent francais.
    Maintenant je dois faire le point 2 et je crois devoir utiliser la classe DigestInfo.

    ATTENTION: ne surtout pas utiliser cette fonction pour hacher des données, car l'algorithme de hachage est bidon !!!

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    J'arrive pas générer le message encodé du point 2 avec les caractéristiques requises.
    J'ai ceci comme code et une erreur quand j'essaye d'imprimer le encodeM
    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
    // Create a message als byte-array
          byte[] message = createMessage(40);
     
          // Generate a SHA1-digest-instance from Bouncycastle
          SHA1Digest sha1 = new SHA1Digest();
     
          sha1.update(message, 0, message.length);
     
          // Byte-array to store the hash
          byte[] hash = new byte[sha1.getDigestSize()];
     
          // and store it
          sha1.doFinal(hash, 0);
          StringBuilder sb = new StringBuilder();
          for (byte b : hash) {
              sb.append(String.format("%02X ", b));
          }
          //System.out.println(sb.toString());
     
          // store the encoded Message
          byte[] encodeM = sha1.getEncodedState();
          StringBuilder sb2 = new StringBuilder();
          for (byte b : encodeM) {
              sb2.append(String.format("%02X ", b));
          }
          //System.out.println(sb2.toString());
     
          //create a DER Encoding
          DEROctetString derOS = new DEROctetString(encodeM);
          ASN1Primitive asn1Prim  = derOS.getLoadedObject();

  14. #14
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est quoi l'erreur ? Et c'est quoi cette variable encodeM ?
    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.

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    la variable encodeM c'est l'état encoder du message avec la methode getEncodedstate() de SHA1.
    Mais une fois de plus tout ce que j'ai fait jusqu'ici était inutile.
    Je dois tester le EMSA Padding fait par le bouncycastle et non chercher à le faire avec les methodes de certaines de leur classe. Il ya un cheminement dejà défini que je dois trouver et à partir de celà tester si le resultat est conforme aux point du document. D'où l'importance d'implémenter une fonction digest qui a peut d'espace de stockage pour la passer en parametre à leur methode.

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Pour le cheminement du bouncycastle j' ai le cheminement suivant:

    * 1.Le RSADigestSigner constructeur prend un Digest en paramètre
    * 2.RSADigestSigner doit être initialiser et prend un PKCS1Encoding comme AsymmetricBlockCipher
    * 3.AsymmetricBlockCipher est une interface. Donc je peux implementer la mienne pour ne pas avoir besoin de clé myAsymBlockCipher
    * 4.Une instance de PKCS1Encoding doit être créée et le constructeur prend un AsymmetricBlockCipher
    * 5.Initialiser PKCS1Encoding
    * 6.Appel de la méthode processBlock

    J'espère que j'ai bien vu.

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    la j'ai fait un test qui est censé normalement ne pas produire de message d'erreur, mais ca echoue
    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
    // Creation d'un byte-array
            byte[] message = createMessage(3);
     
            // Digest
            Digest digest = new SHA1Digest();
     
            // RSADigestSigner
            RSADigestSigner signer = new RSADigestSigner(digest);
     
            signer.update(message, 0, message.length);
     
           // Create CipherParameter
            BigInteger mod = new BigInteger("71");
            BigInteger exp = new BigInteger("5");
            RSAKeyParameters rsaParam = new RSAKeyParameters(true, mod,exp);
     
            signer.init(true, rsaParam);
            byte[] aT = signer.generateSignature();
    et voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    input data too large
    java.lang.IllegalArgumentException: input data too large
    	at org.bouncycastle.crypto.encodings.PKCS1Encoding.encodeBlock(Unknown Source)
    	at org.bouncycastle.crypto.encodings.PKCS1Encoding.processBlock(Unknown Source)
    	at org.bouncycastle.crypto.signers.RSADigestSigner.generateSignature(Unknown Source)

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    Quelqu'un pourrait il me donner un indice sur ce que je fait mal ?
    Normalement SHA-1 est assez grande pour produire ce message.

  19. #19
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 5
    Points
    5
    Par défaut
    La j'ai corrigé le fait de ne pas initialiser mon signer avant son appel, mais toujours la même 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
     // Creer le message
            byte[] message = createMessage(1);
     
            // Creer le parametre RSAKey
            BigInteger mod = new BigInteger("33");   // in RSA mod = n = p*q here with p = 11 and p = 3 both prime number
            BigInteger exp = new BigInteger("7");    // e = 7
            RSAKeyParameters rsaParam = new RSAKeyParameters(true, mod, exp);
     
            // creer mon signer
            Digest digest = new SHA1Digest();
            RSADigestSigner signer = new RSADigestSigner(digest);
            signer.init(true, rsaParam);
            signer.update(message, 0, message.length);
    // encoder le message
            byte[] signature = signer.generateSignature();

  20. #20
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne connais pas bien RSA, mais je pense que ton problème est lié à la clef : en fonction de la taille de clef, on a une taille maximal de hash (genre avec un RSA sur 1024 bits, il me semble que c'est 128 octets). Maintenant comment gérer ça, avec BouncyCastle de surcroît, je ne sais pas.
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  2. [Excel] Comment utiliser la fonction RECHERCHEV
    Par forsay1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 03/02/2006, 11h43
  3. Réponses: 3
    Dernier message: 31/12/2005, 23h09
  4. Comment utiliser la fonction NBR.JOURS.OUVRES?
    Par MEHCOOPER dans le forum Access
    Réponses: 9
    Dernier message: 20/10/2005, 12h50
  5. Réponses: 11
    Dernier message: 22/12/2003, 21h06

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