begin process at 2012 05 28 05:16:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

jeudi 15 septembre 2011 à 20:06:59 | adaptation d'un code de 32 bits à une plateforme 8 bits

xtimas

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

Code C/C++ :
#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
vendredi 16 septembre 2011 à 03:06:38 | Re : adaptation d'un code de 32 bits à une plateforme 8 bits

patatalo

Membre Club Administrateur CodeS-SourceS
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.

@++


Cette discussion est classée dans : bytes, bits, pt, ct, define


Répondre à ce message

Sujets en rapport avec ce message

POINTEUR (C) sur plusieurs structures (0 Lectures) [ par skouby ] Bonjourje voulais essayer de réussir tout seul , ..mais mes yeux clignotent :SAlors je me met a vos pieds lolje programme un tachymetre en C avec SDCC Problème avec SendInput pour la souris [ par VBGenesis ] BonjourJe possède une vieille tablette graphique dont les drivers ne sont plus maintenus (ils ne fonctionnent qu'avec 98...), donc j'essaye de les ref Aide, résolution d'un taquin [ par Micha1177 ] Bonjour, Dans le cadre d'un projet, je doit élaborer une grille de taquin résoluble, et pouvoir effectuer le déplacement des cases, et ensuite concev Couleur d'un Pixel et dessin [ par wxccxw ] Bonjour,je suis en train de faire un colorimètre numérique, et lorsque que je recupere la couleur des pixels a la place de mon pointeur j'obtien toujo Plateformes d'assistance Windows Linux/Unix MacOS Matériel/Hardware Logiciels/Pilotes Bureautique Jeux vidéos Audio numérique Infographie/Photo Vidéo numérique Gravure Téléphonie/PDA/GPS Programmation Webmastering Réseaux Internet Messagerie/Chat [ par csauvane ] Bonjour, Pour un projet, j'ai dans une grande chaine de caractère des données brutes d'un son Wave. L'avantage de le mettre dans une chaine de caract Modélisation comportement banc de poissons, librairie graphique SDL [ par Gualdim ] Bonjour, j'ai quelques problèmes avec mon code, j'ai tenté de déverminer en console avec des printf pour vérifier mes variables, il y a encore des bug Problem avec les #DEFINE avec winapi en c [ par dyroj ] Bonjour a tous,je suis en train de créer un programme et avec une interface graphique (winapi)  créer par les ressource.j'utilise les DEFINE pour iden Que fait ce #define ? [ par AsM0DeUz ] Bonjour,Je suis en train d'essayer de comprendre un code mais je coince sur ceci :Dans le code ci-dessous, que fait le #define PROFILE(x) ? un define Probléme d'algorithme d'ordonnacement [ par salero ] Bonjour, bon je travaille sur un mini projet qui consiste a gérer des processu par des algorithme d'ordonnacement ( fcfs,sjf....) et pour cela je  cre


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,622 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales