Algorithme Data Encryption Standard (DES)

simozemaim -  
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je suis en train de comprendre cette algorithme mais je suis bloquée sur partie : permutation initiale .voila le lien qui explique cette algorithme

http://www.commentcamarche.net/contents/204-introduction-au-chiffrement-avec-des

plus précisément comment parcourant la matrice de gauche à droite puis de haut en bas ?

Merci d'avance

1 réponse

  1. Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
     
    Bonjour, comme expliqué les bits d'un bloc d'une taille de 64bits sont soumis à un changement de position au départ, la matrice est une représentation qui explique la position initiale dans laquelle mettre ces bits.

    Par exemple avec bloc de 4bits : 0110
    Et une matrice donnant les positions suivantes :
    2 1
    4 3
    Le résultat en lisant les 4 bits 0110 de gauche vers la droite :
    1 0
    0 1
    PI = 1001
    puisque pos 1 = 0, pos 2 = 1, pos 3 = 1, pos 4 = 0

    et le scindement' est simple on coupe le bloc de 4bits en deux de 2bits :
    G0=10 et D0=01

    C'est pareils avec 64bits petit bout de code :
    #include <stdio.h>
    #include <stdint.h>
    
    uint64_t permutation_initiale(uint64_t b)
      {
        uint64_t result;
        int i;
        int pos[64]={58,50,42,34,26,18,10,2,
            60,52,44,36,28,20,12,4,
            62,54,46,38,30,22,14,6,
            64,56,48,40,32,24,16,8,
            57,49,41,33,25,17,9,1,
            59,51,43,35,27,19,11,3,
            61,53,45,37,29,21,13,5,
            63,55,47,39,31,23,15,7};
        result=0;
        for(i=0;i<64;i++){
            result |= (uint64_t)(((b<<(pos[i]-1))>>63)<<(63-i));
        }
        return result;
      }
    void print_bin_uint64(uint64_t b)
      {
        int i;
        for(i=0;i<64;i++){
            printf("%d",(int)((b<<i)>>63));
        }
        printf("\n");
      }
    
    int main(void)
      {
        uint64_t result,b;
        b = 0x1234567812345678; /* un bloc de 64bits */
        result = permutation_initiale(b); /* permutation initiale des bits */
        print_bin_uint64(b);/* affichage binaire */
        print_bin_uint64(result);
        return 0;
      }

    Dans ce code vous pouvez voir une façon de repositionner les bits sur un bloc de 64bits contenu dans un type uint64_t (un unsigned int faisant obligatoirement 64bits de long) en utilisant la matrice donnant les positions des bits, la variable result est le PI de b en la coupant en deux uint32_t vous obtiendrez le "Scindement en blocs de 32 bits" ...
    0