Algorithme Data Encryption Standard (DES)

Fermé
simozemaim - 13 mai 2013 à 16:17
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 24 mai 2013 à 12:56
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
A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
24 mai 2013 à 12:56
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