Mieux comprendre mon code C

Messages postés
3
Date d'inscription
mardi 3 mars 2015
Statut
Membre
Dernière intervention
14 mars 2015
-
Bonjour, et merci d'avance pour ceux qui consacreront leur temps pour m'aider a mieux comprendre ce bout de code écrit en C .
En effet, j'ai eu ce code de ce site car je voudrais écrire une fonction Mixcolumns pour AES 128 bits (cryptographie-chiffrement) ;disons cette fonction fait partie du code en question et je n'arrive pas a la comprendre .
Merci pour votre aimable attention.

unsigned char multi(char a, char b)

 {
 int bb[5] = {0,0,0,0,0}, p = 0, intemp;
 unsigned char temp[5];
 temp[0] = b;

 do
   {
   if (temp[0] % 2 != 0)
    {
    temp[0] -= 1;
    bb[p] = 1;
    }

   p++;
   temp[0] /= 2;
   } while (temp[0] > 0);

 temp[0] = a;
 temp[1] = a;

 for(p = 1; p < 5; p++) //on considére b de la forme 0x ou 1x
   {
   intemp = temp[p] * 2;
   if (intemp > 255) temp[p] = (intemp - 256) ^ 27;
   else temp[p] = intemp;
   if (p < 4) temp[p + 1] = temp[p];
   }

 for(p = 0; p < 5; p++)
   {
   if (bb[p] == 0) temp[p] = 0;
   }

 return temp[0] ^ temp[1] ^ temp[2] ^ temp[3] ^ temp[4];
 }
Afficher la suite 

2 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

cette fonction est buggée.
Il faut rajouter un test (p<5) dans le while sinon il y a dépassement et crash

...
} while (temp[0] > 0 && p<5);


D'autre part et à vue de nez, il semble que cela serve à créer des clefs par paires de caractères.

Le résultat d'une paire peut être retrouvé par une seule autre paire après chiffrement en prenant Le caractère de départ et le caractère résultat de la première paire.

Exemple:

char a = 'a';
char b = 'b';
unsigned res = multi(a, b);
// 0 ^ 194 ^ 0 ^ 0 ^ 0 = 194

La paire ab sera codée Â

// Seule la paire suivante aura le même résultat
a = 'a';
b = 'Â'; //char(194);
res = multi(a, b);
// 0 ^ 194 ^ 0 ^ 0 ^ 0 = 194


Ceci dit je n'ai pas regardé le code original, donc ?...

bye...
Commenter la réponse de yann_lo_san
Messages postés
3
Date d'inscription
mardi 3 mars 2015
Statut
Membre
Dernière intervention
14 mars 2015
0
Merci
Merci bien yann_lo_san de m'aider à mon sujet!
En ce qui conserne le problème de bug ,dans le code il y a bien une boucle do...while temp[p]>0 au debut et dans cette bouble temp[p]=0 pour p=4 .Ceci étant donné que char tient sur 1 octet dont sur 4 bits .
au fait pour la prémière boucle do...while, j'ai compris que ca convertie b en binaire .(donc pas de bug ici )
d'autres part ,j'aime bien par contre ta remarque dans le sens que ca m'ouvre plus les idées sur l'opération du ou-exclusive en programmation c qui est nouveau pour moi.mais il reste toujours un point d'interrogation car j'aimerais bien comprendre le role de la prémière boucle for qui est celle-ci
temp[0] = a;
temp[1] = a;
for(p = 1; p < 5; p++) //on considére b de la forme 0x ou 1x
{
intemp = temp[p] * 2;
if (intemp > 255) temp[p] = (intemp - 256) ^ 27;
else temp[p] = intemp;
if (p < 4) temp[p + 1] = temp[p];
}

et plus particulièrement cette ligne

if (intemp > 255) temp[p] = (intemp - 256) ^ 27; ???

d'où vient le nombre 27
et d'ailleurs pourquoi multiplier temp[p] par 2 ?
pour etre plus claire ,voila la fonction mère de multi dont mix_column

int mix_column(unsigned char state[4][4], unsigned char cmd)

{
int i,j;
unsigned char temp[4][4];

for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++) temp[i][j] = state[i][j];
}

if (cmd == 'c')
{
state[0][0] = multi(temp[0][0],2) ^ multi(temp[1][0],3) ^
multi(temp[2][0],1) ^ multi(temp[3][0],1);
state[1][0] = multi(temp[0][0],1) ^ multi(temp[1][0],2) ^
multi(temp[2][0],3) ^ multi(temp[3][0],1);
state[2][0] = multi(temp[0][0],1) ^ multi(temp[1][0],1) ^
multi(temp[2][0],2) ^ multi(temp[3][0],3);
state[3][0] = multi(temp[0][0],3) ^ multi(temp[1][0],1) ^
multi(temp[2][0],1) ^ multi(temp[3][0],2);

state[0][1] = multi(temp[0][1],2) ^ multi(temp[1][1],3) ^
multi(temp[2][1],1) ^ multi(temp[3][1],1);
state[1][1] = multi(temp[0][1],1) ^ multi(temp[1][1],2) ^
multi(temp[2][1],3) ^ multi(temp[3][1],1);
state[2][1] = multi(temp[0][1],1) ^ multi(temp[1][1],1) ^
multi(temp[2][1],2) ^ multi(temp[3][1],3);
state[3][1] = multi(temp[0][1],3) ^ multi(temp[1][1],1) ^
multi(temp[2][1],1) ^ multi(temp[3][1],2);

state[0][2] = multi(temp[0][2],2) ^ multi(temp[1][2],3) ^
multi(temp[2][2],1) ^ multi(temp[3][2],1);
state[1][2] = multi(temp[0][2],1) ^ multi(temp[1][2],2) ^
multi(temp[2][2],3) ^ multi(temp[3][2],1);
state[2][2] = multi(temp[0][2],1) ^ multi(temp[1][2],1) ^
multi(temp[2][2],2) ^ multi(temp[3][2],3);
state[3][2] = multi(temp[0][2],3) ^ multi(temp[1][2],1) ^
multi(temp[2][2],1) ^ multi(temp[3][2],2);

state[0][3] = multi(temp[0][3],2) ^ multi(temp[1][3],3) ^
multi(temp[2][3],1) ^ multi(temp[3][3],1);
state[1][3] = multi(temp[0][3],1) ^ multi(temp[1][3],2) ^
multi(temp[2][3],3) ^ multi(temp[3][3],1);
state[2][3] = multi(temp[0][3],1) ^ multi(temp[1][3],1) ^
multi(temp[2][3],2) ^ multi(temp[3][3],3);
state[3][3] = multi(temp[0][3],3) ^ multi(temp[1][3],1) ^
multi(temp[2][3],1) ^ multi(temp[3][3],2);
}
else


{
state[0][0] = multi(temp[0][0],14) ^ multi(temp[1][0],11) ^
multi(temp[2][0],13) ^ multi(temp[3][0],9);
state[1][0] = multi(temp[0][0],9) ^ multi(temp[1][0],14) ^
multi(temp[2][0],11) ^ multi(temp[3][0],13);
state[2][0] = multi(temp[0][0],13) ^ multi(temp[1][0],9) ^
multi(temp[2][0],14) ^ multi(temp[3][0],11);
state[3][0] = multi(temp[0][0],11) ^ multi(temp[1][0],13) ^
multi(temp[2][0],9) ^ multi(temp[3][0],14);

state[0][1] = multi(temp[0][1],14) ^ multi(temp[1][1],11) ^
multi(temp[2][1],13) ^ multi(temp[3][1],9);
state[1][1] = multi(temp[0][1],9) ^ multi(temp[1][1],14) ^
multi(temp[2][1],11) ^ multi(temp[3][1],13);
state[2][1] = multi(temp[0][1],13) ^ multi(temp[1][1],9) ^
multi(temp[2][1],14) ^ multi(temp[3][1],11);
state[3][1] = multi(temp[0][1],11) ^ multi(temp[1][1],13) ^
multi(temp[2][1],9) ^ multi(temp[3][1],14);

state[0][2] = multi(temp[0][2],14) ^ multi(temp[1][2],11) ^
multi(temp[2][2],13) ^ multi(temp[3][2],9);
state[1][2] = multi(temp[0][2],9) ^ multi(temp[1][2],14) ^
multi(temp[2][2],11) ^ multi(temp[3][2],13);
state[2][2] = multi(temp[0][2],13) ^ multi(temp[1][2],9) ^
multi(temp[2][2],14) ^ multi(temp[3][2],11);
state[3][2] = multi(temp[0][2],11) ^ multi(temp[1][2],13) ^
multi(temp[2][2],9) ^ multi(temp[3][2],14);

state[0][3] = multi(temp[0][3],14) ^ multi(temp[1][3],11) ^
multi(temp[2][3],13) ^ multi(temp[3][3],9);
state[1][3] = multi(temp[0][3],9) ^ multi(temp[1][3],14) ^
multi(temp[2][3],11) ^ multi(temp[3][3],13);
state[2][3] = multi(temp[0][3],13) ^ multi(temp[1][3],9) ^
multi(temp[2][3],14) ^ multi(temp[3][3],11);
state[3][3] = multi(temp[0][3],11) ^ multi(temp[1][3],13) ^
multi(temp[2][3],9) ^ multi(temp[3][3],14);
}
return 0;
}


s'il vous plait cette ligne là avec ^27 m'empêche de dormir .Aidez-moi svp. Merci.
Commenter la réponse de rosysid87