Exemple #1
0
void calcul_cles(mpz_t p, mpz_t q, mpz_t phi, mpz_t n, mpz_t e, mpz_t d, unsigned int taille, gmp_randstate_t state)
{
    gpa(p,taille,state);
    premier(p);
    gpa(q,taille,state);
    premier(q);
    
    mpz_mul(n,p,q); // n = pq
    phi_n(phi,p,q); // phi = (p-1)*(q-1)
    
    mpz_set_ui(e,65537);
    calcul_d(d,e,phi); // calcul de d tel que e*d mod phi = 1
}
Liste::~Liste()
{
	premier();
	for (int i = 0; i < get_longueur(); i++)
	{
		effacer();
		suivant();
	}
}
// chercher un pointeur sur l'élément contenant "objet" de la liste ls
static Element* chercherElement (ListeS* ls, Objet* objet) {
booleen trouve = faux;
Element* ptc = premier (ls);
while ( (ptc != NULL) && !trouve ) {
trouve = ls->comparer (objet, ptc->reference) == 0;
if (!trouve) ptc = suivant (ptc);
}
return trouve ? ptc : NULL;
}
// parcourir du premier vers le dernier
void parcoursListeSym (ListeS* ls, void (*f) (Objet*)) {
if (listeVide(ls)) {
printf ("Liste symétrique vide\n");
} else {
Element* ptc = premier (ls);
while (ptc != NULL) {
f (ptc->reference);
ptc = suivant (ptc);
}
}
}
Exemple #5
0
int main()
{
                                        // VARIABLES DECLARATION
        //Clées Générées
    mpz_t clee_privee;      mpz_init(clee_privee);
    mpz_t clee_publique;    mpz_init(clee_publique);
    mpz_t clee_modulo;      mpz_init(clee_modulo);


        // Auto GMP + test  prima
    mpz_t __n;      mpz_init(__n);
    mpz_t __max;    mpz_init(__max);
    mpz_t __two;    mpz_init_set_ui(__two, 2);
    mpz_t __p;      mpz_init(__p);
    mpz_t __q;      mpz_init(__q);

    gmp_randstate_t __rand_state;
    gmp_randinit_default(__rand_state);
    gmp_randseed_ui (__rand_state, time(NULL));

        // Manu GMP
    mpz_t _p, _q;   mpz_init (_p); mpz_init (_q);
	mpz_t _n;       mpz_init (_n);
	mpz_t _phi;     mpz_init(_phi);
	mpz_t _e,_d;    mpz_init(_e); mpz_init(_d);
	mpz_t _temp1;    mpz_init(_temp1);
	mpz_t _temp2;   mpz_init(_temp2);

        //manu Small
	int p,q;
	int n;
	int phi;
	int e,d;

        // In / Out
    char s_temp[1000]="";
    char s_in[1000]  = "ref.txt";
    char s_out[1000] = "out.txt";
    FILE * f_in ;
    FILE * f_out;

        // Some vars
    int longeur_nombres=100;
    int clees_generees=0;
    int i,j;
 	char c = ' ';
	int menu;
	int continuer =1;
	int base_cryptage=10;
	char separator='\n';

    while (continuer ==1 )
    {
        if (clees_generees==1) {printf("\n\n\n\nLes clees ont ete generees");}
        else  {printf("\n\n\nLes clees n'ont  pas encore ete generees");}
            //Menu
        printf("\n\t-> 1: generer des cles RSA manuellement (petits nombres ; sans GMP).");
        printf("\n\t-> 2: generer des cles RSA manuellement (grands nombres ; avec GMP).");
        printf("\n\t-> 3: generer des cles RSA automatiquement (avec GMP ).");
        printf("\n\t-> 8: Entrer manuellement les clees.");
        printf("\n\t-> 9: Charger les clees a partir d'un fichier.");

        if (clees_generees==1)
        {
            printf("\n\n4: Cripter un fichier.");
            printf("\n5: Decripter un fichier.");
            printf("\n10: Enregistrer les clees dans un fichier");
        }
        printf("\n\n6: Test de primalite ( Miller Rabin ).");
        printf("\n\n0: Quitter.");

        printf("\n\nChoix : ");
        scanf("%d",&menu);

		switch (menu)
		{
			case 0: // quiter
				continuer=0;
			break;

			case 1: // setup RSA
				printf("\nEntrez deux nombres premiers p et q, : \n"); // On entre deux nbres premiers p, q
				do { printf("\tp = ");           scanf("%d",&p); } while( premier(p)!= 1 );
				do { printf("\tp = %d, q = ",p); scanf("%d",&q); } while( q==p || premier(q)!= 1 );

				n = p*q;		    // on calcul la première partie de la clé publique
				phi=(p-1)*(q-1);	// on calcule l'indicatrice d'euler de n

				printf("\tphi(%d) = %d\n",n,phi);
				printf("\nEntrez un nombre e, tel que Pgcd(%d,e) = 0 :\n",phi);
				do { printf("\te = "); scanf("%d",&e);printf("\n"); d= inverseModulo(e,phi); } while( d==0 );
				printf("\n\td = %d , car (%d * %d = 1 mod %d )\n",d,d,e,phi);

                while (d<0) {d+=n;}
				printf("\n\tCle Publique : { %d, %d }",e,n);
				printf("\n\tCle Privee   : { %d, %d }\n\n",d,n);

				mpz_set_ui(clee_privee,d);
				mpz_set_ui(clee_publique,e);
				mpz_set_ui(clee_modulo,n);
				clees_generees=1;
			break;

			case 2: // setup RSA
				printf("\nEntrez deux nombres premiers p et q, : \n"); // On entre deux nbres premiers p, q
				do { printf("\tp = ");                gmp_scanf("%Zd",_p);  } while( mpz_premier(_p)!= 1 );
				do { gmp_printf("\tp = %Zd, q = ",_p); gmp_scanf("%Zd",_q); } while( mpz_cmp(_q,_p)==0 || mpz_premier(_q)!= 1 );

				mpz_mul(_n,_p,_q);              // on calcul la première partie de la clé publique

				mpz_sub_ui(_temp1,_p,1);
				mpz_sub_ui(_temp2,_q,1);
				mpz_mul(_phi,_temp1,_temp2);    // on calcule l'indicatrice d'euler de n

				gmp_printf("\tphi(%Zd) = %Zd\n",_n,_phi);
				gmp_printf("\nEntrez un nombre e, tel que Pgcd(%Zd,e) = 0 :\n",_phi);
                do { printf("\te = "); gmp_scanf("%Zd",_e);printf("\n"); mpz_inverseModulo(&_d,_e,_phi); } while( mpz_cmp_ui(_d,0)==0 );

				gmp_printf("%Zd",_e);
				gmp_printf("%Zd",_phi);

				gmp_printf("\n\td = %Zd , car (%Zd * %Zd = 1 mod %Zd )\n",_d,_d,_e,_phi);

				gmp_printf("\n\tCle Publique : { %Zd, %Zd }",_e,_n);
				gmp_printf("\n\tCle Privee   : { %Zd, %Zd }\n\n",_d,_n);

                mpz_set(clee_privee,_d);
				mpz_set(clee_publique,_e);
				mpz_set(clee_modulo,_n);
				clees_generees=1;
			break;

            case 8:
                printf("\n\n\t  * ENTREZ LES CLEES *\n");
                printf("\n\tClee publique = "); gmp_scanf("%Zd",clee_publique);
                printf("\tClee privee = ");   gmp_scanf("%Zd",clee_privee);
                printf("\tClee Modulo = ");   gmp_scanf("%Zd",clee_modulo);
                printf("\n\n");
                clees_generees=1;

			break;

            case 9: // Charger les clees a partir d'un fichier
                {
                    j=0;
                    do
                    {
                        printf("\n\n\t\t * CHARGER *\n( clee publique / privee / modulo)\n ");

                        printf("\n\t1 : Input  : %s",s_in);
                        printf("\n\t2 : separateur input  : ");
                            if (separator == '\n'){printf("retour a la ligne");}
                            if (separator == '\t'){printf("tabulation");}
                            if (separator == ' '){printf("espace");}
                        printf("\n\n\t0 : Charger !!! :");

                        scanf("%d",&menu);
                        if (menu == 1) {printf("\n\tnouveau fichier : "); scanf("%s",s_in);}
                        if (menu == 2)
                        {
                                printf("\n\tnouveau caractere de separation :");
                                printf("\n\t\t1 : retour a la ligne");
                                printf("\n\t\t2 : tabulation ");
                                printf("\n\t\t3 : espace ");
                                printf("\n\n\t\t0 : annuler ");
                                scanf("%d",&menu);
                                if (menu==1) { separator='\n';}
                                if (menu==2) { separator='\t';}
                                if (menu==3) { separator=' ';}
                        }

                    }while (menu!=0);

                    f_in = fopen(s_in,"r");

                    c = '0';
                    while(c != EOF)
                        {
                            i=0;
                            c = '0';
                            while(c != EOF && c!= separator)
                            {
                                c = fgetc(f_in);
                                if (c != EOF && c!= separator)
                                {
                                    s_temp[i]=c;
                                    i++;
                                }
                            }
                            if (c!=EOF)
                            {
                                s_temp[i]='\0';
                                if (j==0) {mpz_set_str(clee_publique,s_temp,10); }
                                if (j==1) {mpz_set_str(clee_privee  ,s_temp,10); }
                                if (j==2) {mpz_set_str(clee_modulo  ,s_temp,10); }
                                j++;
                            }
                        }

                    fclose(f_in);
                    printf("\nappuyez sur une touche pour continuer");
                    clees_generees=1;
                    getchar(); getchar();
                    j=0;
                }

			break;


			case 3: // auto crypte rabin
                mpz_mul_2exp(__max, __two, longeur_nombres );
                printf("\nGeneration de 2 nombres premiers p et q, : \n");
                do
                {
                    mpz_urandomm(__p, __rand_state, __max);

                    // a remplacer par une boucle propre sur les 100 plus petits premiers par exemple
                    if (mpz_even_p(__p)) continue;
                    if (mpz_fdiv_ui(__p, 3) == 0) continue;
                    if (mpz_fdiv_ui(__p, 5) == 0) continue;
                    if (mpz_fdiv_ui(__p, 7) == 0) continue;
                } while (miller_rabin(__p, __rand_state, 100) == 0);
                do
                {
                    mpz_urandomm(__q, __rand_state, __max);

                    // a remplacer par une boucle propre sur les 100 plus petits premiers par exemple
                    if (mpz_even_p(__q)) continue;
                    if (mpz_fdiv_ui(__q, 3) == 0) continue;
                    if (mpz_fdiv_ui(__q, 5) == 0) continue;
                    if (mpz_fdiv_ui(__q, 7) == 0) continue;
                } while (miller_rabin(__q, __rand_state, 100) == 0);
                do
                {
                    mpz_urandomm(_e, __rand_state, __max);

                    // a remplacer par une boucle propre sur les 100 plus petits premiers par exemple
                    if (mpz_even_p(_e)) continue;
                    if (mpz_fdiv_ui(_e, 3) == 0) continue;
                    if (mpz_fdiv_ui(_e, 5) == 0) continue;
                    if (mpz_fdiv_ui(_e, 7) == 0) continue;
                } while (miller_rabin(_e, __rand_state, 100) == 0);
                gmp_printf("\n\tp = %Zd,\n\n\tq = %Zd",__p,__q);

                mpz_mul(_n,__p,__q);            // on calcul la première partie de la clé publique
				mpz_sub_ui(_temp1,__p,1);
				mpz_sub_ui(_temp2,__q,1);
				mpz_mul(_phi,_temp1,_temp2);    // on calcule l'indicatrice d'euler de n

				gmp_printf("\n\n\tphi(%Zd) \n\t= %Zd\n",_n,_phi);
				mpz_inverseModulo(&_d,_e,_phi);

				gmp_printf("\n\tCle Publique : \n\t{ %Zd,\n\t%Zd }",_e,_n);
				gmp_printf("\n\n\tCle Privee   : \n\t{ %Zd,\n\t%Zd }\n\n",_d,_n);

                mpz_set(clee_privee,_d);
				mpz_set(clee_publique,_e);
				mpz_set(clee_modulo,_n);
				clees_generees=1;
            break;

            case 4: // crypte
                if (clees_generees==1)
                {
                    do
                    {
                        printf("\n\n\t * CRYPTAGE *\n");

                        printf("\n\t1 : Input  : %s",s_in);
                        printf("\n\t2 : Output : %s",s_out);
                        printf("\n\t3 : Base   : %d",base_cryptage);
                        printf("\n\t4 : separateur : ");
                            if (separator == '\n'){printf("retour a la ligne");}
                            if (separator == '\t'){printf("tabulation");}
                            if (separator == ' '){printf("espace");}
                        printf("\n\n\t0 : CRYPTER !!! :");

                        scanf("%d",&menu);
                        if (menu == 1) {printf("\n\tnouveau fichier : "); scanf("%s",s_in);}
                        if (menu == 2) {printf("\n\tnouveau fichier : "); scanf("%s",s_out);}
                        if (menu == 3) {printf("\n\tnouvelle base ( entre 2 et 36) : "); scanf("%d",&base_cryptage);
                                        if (base_cryptage<2 || base_cryptage>36) {base_cryptage=10;}}
                        if (menu == 4)
                        {
                                printf("\n\tnouveau caractere de separation :");
                                printf("\n\t\t1 : retour a la ligne");
                                printf("\n\t\t2 : tabulation ");
                                printf("\n\t\t3 : espace ");
                                printf("\n\n\t\t0 : annuler ");
                                scanf("%d",&menu);
                                if (menu==1) { separator='\n';}
                                if (menu==2) { separator='\t';}
                                if (menu==3) { separator=' ';}
                        }
                    }while (menu!=0);

                    f_in = fopen(s_in,"r");
                    f_out = fopen(s_out,"w+");

                    c = ' ';
                    while(c != EOF)
                    {
                        c = fgetc(f_in);
                        if (c!=EOF)
                        {
                            mpz_set_ui(_temp1,(unsigned int)c);
                            mpz_powm(_temp1,_temp1,clee_publique,clee_modulo);
                            mpz_out_str (f_out, base_cryptage, _temp1 );
                            fputc(separator,f_out);
                        }
                    }

                    fclose(f_in);
                    fclose(f_out);
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
                else
                {
                    printf("\nVous devez d'abord generer un set de Clees");
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
			break;

			case 5: // Décrypte
                if (clees_generees==1)
                {
                    do
                    {
                        printf("\n\n\t * DECRYPTAGE *\n");

                        printf("\n\t1 : Input  : %s",s_in);
                        printf("\n\t2 : Output : %s",s_out);
                        printf("\n\t3 : Base   : %d",base_cryptage);
                        printf("\n\t4 : separateur input  : ");
                            if (separator == '\n'){printf("retour a la ligne");}
                            if (separator == '\t'){printf("tabulation");}
                            if (separator == ' '){printf("espace");}
                        printf("\n\n\t0 : DECRYPTER !!! :");

                        scanf("%d",&menu);
                        if (menu == 1) {printf("\n\tnouveau fichier : "); scanf("%s",s_in);}
                        if (menu == 2) {printf("\n\tnouveau fichier : "); scanf("%s",s_out);}
                        if (menu == 3) {printf("\n\tnouvelle base ( entre 2 et 36) : "); scanf("%d",&base_cryptage);
                                        if (base_cryptage<2 || base_cryptage>36) {base_cryptage=10;}}
                        if (menu == 4)
                        {
                                printf("\n\tnouveau caractere de separation :");
                                printf("\n\t\t1 : retour a la ligne");
                                printf("\n\t\t2 : tabulation ");
                                printf("\n\t\t3 : espace ");
                                printf("\n\n\t\t0 : annuler ");
                                scanf("%d",&menu);
                                if (menu==1) { separator='\n';}
                                if (menu==2) { separator='\t';}
                                if (menu==3) { separator=' ';}
                        }

                    }while (menu!=0);

                    f_in = fopen(s_in,"r");
                    f_out = fopen(s_out,"w+");

                    c = '0';
                    while(c != EOF)
                        {
                            i=0;
                            c = '0';
                            while(c != EOF && c!= separator)
                            {
                                c = fgetc(f_in);
                                if (c != EOF && c!= separator)
                                {
                                    s_temp[i]=c;
                                    i++;
                                }
                            }
                            if (c!=EOF)
                            {
                                s_temp[i]='\0';
                                mpz_set_str(_temp1,s_temp,base_cryptage);
                                mpz_powm(_temp1,_temp1,clee_privee,clee_modulo);
                                fputc((char)(mpz_get_ui(_temp1)),f_out);
                            }
                        }

                    fclose(f_in);
                    fclose(f_out);
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
                else
                {
                    printf("\nVous devez d'abord generer un set de Clees");
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
			break;

			case 10: // enregistre les clees
                if (clees_generees==1)
                {
                    do
                    {
                        printf("\n\n\t * SAUVER  *\n");

                        printf("\n\t1 : Output : %s",s_out);
                        printf("\n\t2 : separateur : ");
                            if (separator == '\n'){printf("retour a la ligne");}
                            if (separator == '\t'){printf("tabulation");}
                            if (separator == ' '){printf("espace");}
                        printf("\n\n\t0 : CRYPTER !!! :");

                        scanf("%d",&menu);
                        if (menu == 1) {printf("\n\tnouveau fichier : "); scanf("%s",s_out);}
                        if (menu == 2)
                        {
                                printf("\n\tnouveau caractere de separation :");
                                printf("\n\t\t1 : retour a la ligne");
                                printf("\n\t\t2 : tabulation ");
                                printf("\n\t\t3 : espace ");
                                printf("\n\n\t\t0 : annuler ");
                                scanf("%d",&menu);
                                if (menu==1) { separator='\n';}
                                if (menu==2) { separator='\t';}
                                if (menu==3) { separator=' ';}
                        }
                    }while (menu!=0);

                    f_out = fopen(s_out,"w+");

                    mpz_out_str (f_out, 10, clee_publique );
                    fputc(separator,f_out);

                    mpz_out_str (f_out, 10, clee_privee );
                    putc(separator,f_out);

                    mpz_out_str (f_out, 10, clee_modulo );
                    fputc(separator,f_out);

                    fclose(f_out);
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
                else
                {
                    printf("\nVous devez d'abord generer un set de Clees");
                    printf("\nappuyez sur une touche pour continuer");
                    getchar(); getchar();
                }
			break;

            case 6: // Test de primalité
                printf("Entrez un nombre, et nous vous dirrons s'il est premier ou pas :\n\t n = ");
                gmp_scanf("%Zd",__n);
                if (miller_rabin(__n, __rand_state, 100) == 1)
                        { printf("\n PROBABLEMENT, ce nombre est probablement premier ."); }
                else    { printf("\n NON, ce nombre n'est pas premier !"); }
			break;
			default : printf("  -> Choix non reconnu !"); break;
		}
    }

	return 0;
}
Exemple #6
0
int main() {
    printf("Appel de premier");
    double r = premier(20.0,40.0);
    printf("Retour de l'appel %dx+%d est %f",10,20,r);
 }