viernes, 25 de abril de 2014

llaves.c

#include <stdio.h>
#include <gmp.h>

/*
Compilar
gcc -o llaves llaves.c -lgmp
*/

char *cifra(char *m,mpz_t exp, mpz_t mod){
    mpz_t mens;
    mpz_init(mens);
    mpz_set_str(mens,m,10);
    printf("\n%s\n",mpz_get_str(NULL,10,mens));
    mpz_powm(mens,mens,exp,mod);
    return mpz_get_str(NULL,10,mens);
}

int main(int argv, char* argc[]){
    mpz_t n,p,q,e,d,phi,uno;
    unsigned long int l;
    int test;
    char *p_str,*q_str;
    srandom(time(NULL));
    mpz_init(n);
    mpz_init(p);
    mpz_init(q);
    mpz_init(e);
    mpz_init(d);
    mpz_init(phi);
    mpz_init(uno);
    l=random()%100;
    //sscanf(argc[1],"%d",&l);
    l=133;
    //l=;
    if(l<0){l=50;}
    mpz_ui_pow_ui(p,l+random()%30,l+random()%30);
    mpz_nextprime(p,p);
    l=random()%100;

    mpz_ui_pow_ui(q,l+random()%30,l+random()%30);
    mpz_nextprime(q,q);
    
    p_str=mpz_get_str(NULL,10,p);
    q_str=mpz_get_str(NULL,10,q);

    //printf("p: \n%s\n",p_str);
    //printf("q: \n%s\n",q_str);

    mpz_sub_ui(e,p,1);
    mpz_sub_ui(d,q,1);

    mpz_mul(n,p,q);
    mpz_mul(phi,e,d);

    
    mpz_set_ui(e,65537);

    mpz_invert(d,e,phi);
    q_str=mpz_get_str(NULL,10,n);

    //printf("n: \n%s\n",q_str);

    //printf("e: \n%s\n",mpz_get_str(NULL,10,e));
    //printf("d: \n%s\n",mpz_get_str(NULL,10,d));
    
    printf("Llave publica: (%s,%s)\n\n",mpz_get_str(NULL,10,e),mpz_get_str(NULL,10,n));
    printf("Llave privada: (%s,%s)\n\n",mpz_get_str(NULL,10,d),mpz_get_str(NULL,10,n));

    printf("Otros valores:\np: %s\nq: %s\n\n",mpz_get_str(NULL,10,p),mpz_get_str(NULL,10,q));

}

No hay comentarios:

Publicar un comentario