volà un programme complet por l'encyption par RSA
mais aider mois comment utiliser cette bibiotheque GMP.h sous windows
/* Programme rsa
Implémentation de l'algorithme à clé publique, calcul de paramètres de
chiffrement et exemple.
Pour les algorithmes de calcul sur les grands entiers, qui n'existent pas
en C standard, on peut les implémenter soi-meme, la référence absolu sur
le sujet étant le bouquin de D. Knuth, "The Art Of Computer Programming,
volume 2, Seminumerical algorithms".
Si on ne veut pas s'embeter, on peut aussi utiliser une bibliothèque qui
intègre ces fonctions, par exemple GMP (GNU Multi Precision), cf
http://www.swox.com/gmp.
Attention de bien prendre la dernière version, les précédentes ont des
bugs dans la gestion des nombres aléatoires et vous risquez de perdre du
temps pour rien... j'en sais quelque chose !!
Une autre alternative consiste à utiliser Java, qui contient d'origine la
classe math.BigInteger pour gérer les grands entiers.
La chose importante à noter, dans ce listing, c'est le nombre de lignes qui
font réellement du chiffrement et du déchiffrement (1 ligne à chaque fois),
alors que tout le reste du programme ne sert qu'à l'initialisation.
*/
#include <stdio.h>
#include "gmp.h"
/* Variable d'état pour le générateur aléatoire */
gmp_randstate_t etat;
/* Fonction aleatoire
renvoie un grand nombre aléatoire qui a env. taille chiffres */
void aleatoire(mpz_t nombre, int taille)
{
unsigned long int i;
mpz_t deuxn;
mpz_init(deuxn);
i = (taille+1)*4;
/* Calcul un nombre aléatoire entre 0 et 10^(n+1) */
mpz_urandomb(nombre, etat, i);
/* Résultat minimum: 10^taille */
mpz_ui_pow_ui(deuxn, 10, taille);
/* Ajoute les deux résulats */
mpz_add(nombre,nombre,deuxn);
mpz_clear(deuxn);
}
/* Fonction premier */
void premier(mpz_t premier, int taille)
{
/* Prend un nombre au hasard de taille donnée */
aleatoire(premier, taille);
/* Prend le nombre premier qui suit notre nombre au hasard */
mpz_nextprime(premier, premier);
}
/* Fonction phi
calcule phi(pq)=(p-1)(q-1) */
void calculephi(mpz_t phi, mpz_t p,mpz_t q)
{
mpz_t a;
mpz_t b;
mpz_init_set(a, p);
mpz_init_set(b, q);
mpz_sub_ui(a, a, 1);
mpz_sub_ui(b, b, 1);
mpz_mul(phi, a, b);
mpz_clear(a);
mpz_clear(b);
}
void cles(mpz_t a, mpz_t b, mpz_t p, mpz_t q, int taille)
{
mpz_t phi;
mpz_t temp;
mpz_init(phi);
mpz_init(temp);
/* Calcul de phi */
calculephi(phi,p,q);
/* Choix de a, clé publique, avec (a,phi(n))=1 */
do {
aleatoire(a, taille);
mpz_gcd(temp, a, phi);
} while (mpz_cmp_ui(temp,1)!=0);
/* Calcul de b, clé privée correspondante */
mpz_invert(b, a, phi);
}
int main() {
int taille;
unsigned long int graine;
mpz_t n,p,q,phi,a,b, clair, code, resultat;
mpz_init(p);
mpz_init(q);
mpz_init(n);
mpz_init(a);
mpz_init(b);
mpz_init(clair);
mpz_init(code);
mpz_init(resultat);
printf("Graine pour le générateur aléatoire ? " );
scanf("%d",&graine);
printf("Taille de p et q ? " );
scanf("%d",&taille);
gmp_randinit(etat, GMP_RAND_ALG_DEFAULT);
gmp_randseed_ui(etat, graine);
mpz_urandomb(clair, etat, 10);
/* Choix de p et de q différents l'un de l'autre */
do {
premier(p, taille);
premier(q, taille);
} while (mpz_cmp(p, q)==0);
/* Calcul de n */
mpz_mul(n,p,q);
/* Calcul des clés */
cles(a,b,p,q, taille);
/* Affichage de p,q,n,a,b */
printf("\n\nParamètres de chiffrement :\n\n" );
printf("p = " ); mpz_out_str(stdout, 10, p); printf("\n" );
printf("q = " ); mpz_out_str(stdout, 10, q); printf("\n" );
printf("n = " ); mpz_out_str(stdout, 10, n); printf("\n" );
printf("a = " ); mpz_out_str(stdout, 10, a); printf("\n" );
printf("b = " ); mpz_out_str(stdout, 10, b); printf("\n" );
printf("\n\n" );
/* Choix d'un message aléatoire et impression */
aleatoire(clair, taille);
printf("Message à chiffrer: " ); mpz_out_str(stdout, 10, clair); printf("\n" );
/* Calcul du message chiffré et impression */
mpz_powm(code, clair, a, n);
printf("Message chiffré: " ); mpz_out_str(stdout, 10, code); printf("\n" );
/* Calcul du message déchiffré et impression */
mpz_powm(resultat, code, b, n);
printf("Message déchiffré: " ); mpz_out_str(stdout, 10, resultat); printf("\n" );
}
---------------
oualataSoft