Mieux comprendre mon code C

rosysid87 Messages postés 3 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 14 mars 2015 - Modifié par BunoCS le 12/03/2015 à 09:01
rosysid87 Messages postés 3 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 14 mars 2015 - 14 mars 2015 à 02:18
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];
 }

2 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
13 mars 2015 à 22:42
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...
0
rosysid87 Messages postés 3 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 14 mars 2015
14 mars 2015 à 02:18
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.
0
Rejoignez-nous