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

C Discussion :

Checksum md4 (dur)


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Checksum md4 (dur)
    Salut a tous,

    Après les signaux, j'ai maintenant un 2eme problème!
    Je dois réaliser un checksum (ou somme de contrôle) en gros un programme capable de calculer un checksum pour un message de longueur arbitraire.

    Je peux vous envoyé le sujet par mp... donc si quelqu'un connais bien ce truc, une aide est apprécié, je vois même pas comment commencer!

    Sinon que dire de plus, si ce n'est merci de m'avoir lu et merci d'avance.
    Dernière modification par ok.Idriss ; 15/06/2013 à 15h40. Motif: restauration

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    1) S'informer : qu'est-ce que le MD4 "en vitesse" ?
    Wikipedia : MD4

    2) Réfléchir au problème... tu vas devoir prendre en entrée... un fichier... ou des octets.... et en faire une somme...
    Comment travailler avec cela ?

    3) Regarder en "détails" MD4, et si possible avec des dessins !
    RFC1320 (full texte)
    Wikipedia EN MD4 (contient un beau schéma compréhensible)

    4) Choisir les bonnes structures adaptées à ton niveau de développement !
    Personnellement, je ne suis pas un expert, quand j'ai recodé le DES en suivant la FIPS, j'ai fais au plus simple possible en restant scolaire !
    Un tableau d'int, dont chaque case est un bit, pour pouvoir très très facilement débugger.
    Au final, cela a fonctionné, mais évidemment, ça n'est pas à utiliser dans le monde réel.
    Tu peux donc utiliser un tableau d'int toi aussi pour démarrer.

    En analysant le problème, tu verras que tu prends des blocs de 128bits/16 octets en entrée et en sortie...
    Et certaines opérations sont sur des blocs de 32bits/4 octets.

    5) Résumer les fonctions que tu devras coder pour le "coeur de l'algorithme", les structures que le standard impose (généralement il y a des IV - Vecteurs d'Initialisations pré-remplis, donc tu devras les re-écrire dans tes sources pour les utiliser)

    6) Coder tout ça, faire des tests et du debug !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'envoie carrement l'étape 1:

    Étape 1. Ajout des octets de bourrage

    Créer une fonction « padding » qui permet à partir d’une chaine de caractères, de créer une nouvelle chaine de caractères en respectant les règles suivantes :

    Le message est "bourré" de façon à ce que sa longueur (en bits) soit congruente à 480, modulo 512. C'est à dire que le message est étendu de façon à ce qu'il soit à 32 bits près un multiple d'une longueur de 512 bits.

    exemple : si S = 4 alors on bourre 56 octets.
    exemple2 : si S = 127 alors on bourre 61 octets.

    Attention : !! Le bourrage est toujours effectué, même si la longueur du message est déjà congruente à 480, modulo 512. !!

    Le bourrage est effectué comme suit : le premier octet ajoute aura pour valeur entière 128. Si d'autres octets doivent être ajoutes, ils auront pour valeur entière 0 jusqu'au respect de la règle précédente.

    Pour résume: on bourre au moins un octet et au plus 64 octets sont ajoutés.

    Fin de l’étape 1.

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    OK...
    Alors :

    1) Je lis dans la RFC1320 :
    congruent to 448, modulo 512
    et pas 480 modulo 512.... inquiétant ton sujet du coup....

    2) Toujours dans la RFC1320 :
    Padding is performed as follows: a single "1" bit is appended to the message, and then "0" bits are appended so that the length in bits of the padded message becomes congruent to 448, modulo 512. In all, at least one bit and at most 512 bits are appended.
    Mais je crois que ton 128 sert justement à "simplifier" la manipulation des bits/octets via des chars plutôt que des << ou >>.
    (Bien garder à l'esprit que les fonctions cryptographiques sont évidemment designées pour être rapides... et faites directement en circuit imprimé ! Pas spécialement en code.... carte à puce toossa...)

    Bref, hormis la congruence que j'ai un petit peu oubliée (mais ça doit se googler et se retrouver), il n'y a pas de difficulté à priori...
    Si ?
    Où bloques-tu ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je veux pas faire l'autiste (c'est raté) mais oui je bloque... à vrai dire j'ai pas commençé, je cherche un peu sur internet pour me documenté mais voila.

    Surtout que j'ai un 2eme projet a rendre a la fin de la semaine, ce qui me bloque... enfin bon je suis un peu dans la mer**...

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Ouais je viens de lire l'autre topic....
    Hahaha...
    Fais gaffe tu te fais aider par un 'ta là, et tu risques d'avoir honte du coup

    Bref, je peux déjà te dire une chose : essaye d'écrire les prototypes des fonctions...
    Si tu comprends les prototypes, tu iras plus vite.

    Peux-tu m'écrire le prototype de ta fonction de padding, ou est-ce que tu bloques encore ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Invité
    Invité(e)
    Par défaut
    Oui alors basé sur le modele de Adler-32:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int  padding(unsigned char *data, int len);
    Quelque chose comme ça?

  8. #8
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    C'est à peu près ça...
    Tu dois renvoyer un char* aussi "je suppose" (sauf si le sujet t'impose que non.... mais dans ce cas c'est ardu à réaliser).

    Pourquoi ?
    Car tu dois travailler sur des blocs de taille fixe, donc tout ce qui est plus petit doit être agrandit avec une valeur fixe, pareil pour ce qui dépasse.

    Donc là, tu vas traiter l'entrée principale de ton hacheur.
    Tu vas lui donner une chaîne quelconque, et tu dois te débrouiller pour qu'à la sortie elle soit de taille correcte + le padding si nécessaire.
    Logiquement : il est TRES probable que tu l'agrandisses, donc tu vas à coup quasi-sûr faire un malloc là dedans d'une taille compatible avec le modulo et tout... donc ton pointeur en entrée sera oublié dedans.

    1) calculer la taille "correcte" d'une chaîne

    Ensuite : si la taille est incorrecte, tu vas faire le padding, donc mettre un bit à 1 suivi d'autant de 0 que nécessaires.

    2) si taille pas bonne, malloc de la bonne taille + memcpy + padding sur la fin

    Et enfin tu renvoies le résultat.
    Bravo : tu as maintenant une chaîne de taille correcte pour l'algorithme, et et bien paddée !
    Tu peux passer à la fonction suivante

    EDIT : ça me fait tilt, il faut TOUJOURS padder même la bonne taille il me semble... donc tu auras TOUJOURS un malloc supplémentaire.
    Donc renvoyer un char*
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Invité
    Invité(e)
    Par défaut
    D'accord donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* padding(unsigned char *data, int len)
    ??

    Pour l'instant je m'occupe de l'étape 1 (comme precisé dans le sujet), donc le padding.
    Ensuite oui en gros un strlen, si la taille est correct -> OK!
    Si incorrect -> malloc + memcpy + padding... ensuite OK!

    PS: ok donc je padde dans tout les cas, sinon voila le debut du sujet:

    Vous allez créer un programme capable de calculer un checksum pour un message de longueur arbitraire.

    Un checksum, ou somme de contrôle, est une donnée calculée à partir du message d'entrée pour vérifier l'intégrité de celle-ci. Lors d'une transmission du message a un tiers, celui-ci peut vérifier à partir du checksum, que vous avez également fourni, que le message n'a pas été corrompu.


    Description de l'algorithme du checksum

    On commence par supposer qu'on a un message de S octets en entrée, et que nous souhaitons générer son checksum. Ici, S est un entier arbitraire non négatif ou nul et ne dépassant pas la représentation maximale sur 32 bits.

    Les étapes suivantes sont nécessaires pour calculer le checksum du message. A vous de les implémenter.
    Dernière modification par Invité ; 10/06/2013 à 17h17.

  10. #10
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Renvoyer une valeur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int padding(unsigned char *data, int len, char*)
    Euh... lol ?
    Tu voudrais que je poste sur le forum Epitech qu'un tek1 de Lyon, en Juin, écrit ça comme prototype de fonction C qui renvoie un char* ?
    Là je vais te laisser trouver ton erreur quand même.

    Attention au strlen !
    strlen travaille sur des chaîne ASCII et va donc s'arrêter au premier '\0' rencontré !
    Un bloc de données peut contenir autant de '\0' qu'il souhaite, mais il aura quand même une autre taille !
    Ne t'embête pas avec strlen, utilise seulement S comme le dis le sujet (car au pire tu feras un read tant qu'il ne te renvoie pas "moins" de caractères que la taille de ton buffer, donc tu connaitras "toujours" la taille de ce que tu envoies).

    EDIT : le sujet explique-t-il comment sera testé ton md4 ?
    Un binaire appelé dans un shell avec un nom de fichier ?...
    Ouverture de stdin pour lire ce qui y est entré ?...
    Création d'une lib et on donne en paramètre un char* à une fonction nommée MyMD4 ?....
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  11. #11
    Invité
    Invité(e)
    Par défaut
    Autant pour moi, j'ai corrigé... la fatigue!

    Ok pas de strlen!
    Euh non c'est pas expliqué comment sera testé mon md4, je suppose qui vont remplaçé mes bout de codes par les leur pour test

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2007, 18h31
  2. Numéro de série du disque dur
    Par h_kamel dans le forum Assembleur
    Réponses: 8
    Dernier message: 21/05/2007, 11h28
  3. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42
  4. Monter un disque dur USB
    Par Iced Earth dans le forum Matériel
    Réponses: 5
    Dernier message: 13/01/2003, 22h02
  5. Accès direct au disque dur
    Par Berdo dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2003, 16h21

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