Adaptation d'un code de 32 bits à une plateforme 8 bits

cs_xtimas Messages postés 6 Date d'inscription samedi 13 février 2010 Statut Membre Dernière intervention 15 septembre 2011 - 15 sept. 2011 à 20:06
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 16 sept. 2011 à 03:06
Bonjour

j'ai un code cryptographique( algorithme RC6) écrit en C qui utilise des registres de 32 bits en cryptage décryptage et expansion de la clé.
Les opérations utilisées sont l'addition modulo 2 la multiplication, la rotation et le OU exclusif et une fonction quadratique B(2B+1).
je voulais implémenté ce code sur une plateforme à 8 bits. Le problème c'est que je n'arrive pas à adapter ces opérations sur des registres 8bits. Par exemple, j'ai lu que le carré du 32 bits, pour l'adapter à 8 bits, on fait 6 opérations de MUL de (8bits X 8bits) et 11 opérations d'additions avec retenu ( ce que j'ai pas encore compris ).
je peux mettre l'algorithme si vous voulez (c'est pas confidentiel )
Merci pour toute explication

#include <stdio.h>
#include <conio.h>
/* RC6 is parameterized for w-bit words, b bytes of key, and
 * r rounds.  The AES version of RC6 specifies b=16, 24, or 32;
 * w=32; and r=20;
 */
  
#define w 32	/* word size in bits */
#define r 20	/* based on security estimates */

#define P32 0xB7E15163	/* Magic constants for key setup */
#define Q32 0x9E3779B9

/* derived constants */
#define bytes   (w / 8)				/* bytes per word */
#define c       ((b + bytes - 1) / bytes)	/* key in words, rounded up */
#define R24     (2 * r + 4)
#define lgw     5                       	/* log2(w) -- wussed out */
#define b        16             /* number of bytes in key            */
/* Rotations */
#define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1)))))
#define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1)))))

unsigned int S[R24 - 1];		/* Key schedule */

void rc6_key_setup(unsigned char *K)
{
int i, j, s, v;
unsigned int L[(32 + bytes - 1) / bytes]; /* Big enough for max b */
unsigned int A, B;

L[c - 1] = 0;
for (i = b - 1; i >= 0; i--)
L[i / bytes] = (L[i / bytes] << 8) + K[i];
     //printf("L= \n",L[i/bytes]);}

    S[0] = P32;
for (i = 1; i <= 2 * r + 3; i++)
S[i] = S[i - 1] + Q32;
       // printf("Si= \n",S[i]);}
A B i = j = 0;
v = R24;
if (c > v) v = c;
v *= 3;

for (s = 1; s <= v; s++)
{
A S[i] ROTL(S[i] + A + B, 3);
B L[j] ROTL(L[j] + A + B, A + B);
i = (i + 1) % R24;
j = (j + 1) % c;
}
}

void rc6_block_encrypt(unsigned int *pt, unsigned int *ct)
{
unsigned int A, B, C, D, t, u, x;
int i, j;

A = pt[0];
B = pt[1];
C = pt[2];
D = pt[3];
B += S[0];
D += S[1];
for (i = 2; i <= 2 * r; i += 2)
{
t = ROTL(B * (2 * B + 1), lgw);
u = ROTL(D * (2 * D + 1), lgw);
A = ROTL(A ^ t, u) + S[i];
C = ROTL(C ^ u, t) + S[i + 1];
x = A;
A = B;
B = C;
C = D;
D = x;
}
A += S[2 * r + 2];
C += S[2 * r + 3];
ct[0] = A;
ct[1] = B;
ct[2] = C;
ct[3] = D;
}

void rc6_block_decrypt(unsigned int *ct, unsigned int *pt)
{
unsigned int A, B, C, D, t, u, x;
int i, j;

A = ct[0];
B = ct[1];
C = ct[2];
D = ct[3];
C -= S[2 * r + 3];
A -= S[2 * r + 2];
for (i = 2 * r; i >= 2; i -= 2)
{
x = D;
D = C;
C = B;
B = A;
A = x;
u = ROTL(D * (2 * D + 1), lgw);
t = ROTL(B * (2 * B + 1), lgw);
C = ROTR(C - S[i + 1], t) ^ u;
A = ROTR(A - S[i], u) ^ t;
}
D -= S[1];
B -= S[0];
pt[0] = A;
pt[1] = B;
pt[2] = C;
pt[3] = D;	
}

int main()
{
int  j;
unsigned char K[b];
unsigned int pt[4] = {0,0,0,0};
unsigned int ct[4] = {0,0,0,0};
     printf("Key is :");
     for (j=0;j<b;j++) 
         { K[j] = ct[0]%(255-j);
     printf("%.2X ",K[j]);
     }
  rc6_key_setup(K);
  rc6_block_encrypt(pt,ct); 
  printf("\n plaintext is   %.8lX %.8lX %.8lX %.8lX",pt[0], pt[1],  pt[2], pt[3]);
  rc6_block_decrypt(ct,pt);
  printf("\n ciphertext is  %.8lX %.8lX %.8lX %.8lX ",ct[0], ct[1],ct[2], ct[3]);
  getch();
}


PEACE

1 réponse

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
16 sept. 2011 à 03:06
salut,


Peut-être en spécifiant une compilation pour un processeur 8bits (8080...8085), ou trouver un compilateur qui permet cette option.

Voir aussi si le compilateur n'aurait pas une option pour forcer cela.

@++
0