rosysid87
Messages postés3Date d'inscriptionmardi 3 mars 2015StatutMembreDernière intervention14 mars 2015
-
Modifié par BunoCS le 12/03/2015 à 09:01
rosysid87
Messages postés3Date d'inscriptionmardi 3 mars 2015StatutMembreDernière intervention14 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];
}
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 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 ?...
rosysid87
Messages postés3Date d'inscriptionmardi 3 mars 2015StatutMembreDernière intervention14 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];
}