int main(void) { /* Initialization */ long D, sd = 0; mpz_t p, m, n, h, private_key; mpz_t curv[2], base_point[2], public_key[2]; mpz_t seed; gmp_randinit(stat, GMP_RAND_ALG_LC, 120); mpz_init(p); mpz_init(m); mpz_init(n); mpz_init(h); mpz_init(private_key); mpz_init(curv[0]); mpz_init(curv[1]); mpz_init(base_point[0]); mpz_init(base_point[1]); mpz_init(public_key[0]); mpz_init(public_key[1]); mpz_init(seed); srand( (unsigned) getpid()); sd=rand(); mpz_set_ui(seed, sd); gmp_randseed(stat, seed); /* set the value of the discriminant*/ D = 40; /* create the order p, the elliptic curve and its order m using D */ CMmethod(D, &p, &m, curv); /* create a base point of order n, where m = nh and returns n and h*/ domain_parameters(curv, base_point, &p, &m, &n, &h); /* create a private and a public key */ create_priv_and_public(curv, &p, base_point, &private_key, public_key); /* generate the signature on the message using ECDSA */ file_create_signature("README", curv, base_point, &p, &n, &private_key, "signature"); gmp_randclear(stat); mpz_clear(p); mpz_clear(m); mpz_clear(n); mpz_clear(h); mpz_clear(private_key); mpz_clear(curv[0]); mpz_clear(curv[1]); mpz_clear(base_point[0]); mpz_clear(base_point[1]); mpz_clear(public_key[0]); mpz_clear(public_key[1]); mpz_clear(seed); return 0; }
int main (int argc, char **argv) { struct expr *e; int i; mpz_t r; int errcode = 0; char *str; int base = 10; setup_error_handler (); gmp_randinit (rstate, GMP_RAND_ALG_LC, 128); { #if HAVE_GETTIMEOFDAY struct timeval tv; gettimeofday (&tv, NULL); gmp_randseed_ui (rstate, tv.tv_sec + tv.tv_usec); #else time_t t; time (&t); gmp_randseed_ui (rstate, t); #endif } mpz_init (r); while (argc > 1 && argv[1][0] == '-') { char *arg = argv[1]; if (arg[1] >= '0' && arg[1] <= '9') break; if (arg[1] == 't') print_timing = 1; else if (arg[1] == 'b' && arg[2] >= '0' && arg[2] <= '9') { base = atoi (arg + 2); if (base < 2 || base > 62) { fprintf (stderr, "error: invalid output base\n"); exit (-1); } } else if (arg[1] == 'b' && arg[2] == 0) base = 2; else if (arg[1] == 'x' && arg[2] == 0) base = 16; else if (arg[1] == 'X' && arg[2] == 0) base = -16; else if (arg[1] == 'o' && arg[2] == 0) base = 8; else if (arg[1] == 'd' && arg[2] == 0) base = 10; else if (arg[1] == 'v' && arg[2] == 0) { printf ("pexpr linked to gmp %s\n", __gmp_version); } else if (strcmp (arg, "-html") == 0) { flag_html = 1; newline = "<br>"; } else if (strcmp (arg, "-wml") == 0) { flag_wml = 1; newline = "<br/>"; } else if (strcmp (arg, "-split") == 0) { flag_splitup_output = 1; } else if (strcmp (arg, "-noprint") == 0) { flag_print = 0; } else { fprintf (stderr, "error: unknown option `%s'\n", arg); exit (-1); } argv++; argc--; } for (i = 1; i < argc; i++) { int s; int jmpval; /* Set up error handler for parsing expression. */ jmpval = setjmp (errjmpbuf); if (jmpval != 0) { fprintf (stderr, "error: %s%s\n", error, newline); fprintf (stderr, " %s%s\n", argv[i], newline); if (! flag_html) { /* ??? Dunno how to align expression position with arrow in HTML ??? */ fprintf (stderr, " "); for (s = jmpval - (long) argv[i]; --s >= 0; ) putc (' ', stderr); fprintf (stderr, "^\n"); } errcode |= 1; continue; } str = expr (argv[i], &e); if (str[0] != 0) { fprintf (stderr, "error: garbage where end of expression expected%s\n", newline); fprintf (stderr, " %s%s\n", argv[i], newline); if (! flag_html) { /* ??? Dunno how to align expression position with arrow in HTML ??? */ fprintf (stderr, " "); for (s = str - argv[i]; --s; ) putc (' ', stderr); fprintf (stderr, "^\n"); } errcode |= 1; free_expr (e); continue; } /* Set up error handler for evaluating expression. */ if (setjmp (errjmpbuf)) { fprintf (stderr, "error: %s%s\n", error, newline); fprintf (stderr, " %s%s\n", argv[i], newline); if (! flag_html) { /* ??? Dunno how to align expression position with arrow in HTML ??? */ fprintf (stderr, " "); for (s = str - argv[i]; --s >= 0; ) putc (' ', stderr); fprintf (stderr, "^\n"); } errcode |= 2; continue; } if (print_timing) { int t; TIME (t, mpz_eval_expr (r, e)); printf ("computation took %d ms%s\n", t, newline); } else mpz_eval_expr (r, e); if (flag_print) { size_t out_len; char *tmp, *s; out_len = mpz_sizeinbase (r, base >= 0 ? base : -base) + 2; #ifdef LIMIT_RESOURCE_USAGE if (out_len > 100000) { printf ("result is about %ld digits, not printing it%s\n", (long) out_len - 3, newline); exit (-2); } #endif tmp = malloc (out_len); if (print_timing) { int t; printf ("output conversion "); TIME (t, mpz_get_str (tmp, base, r)); printf ("took %d ms%s\n", t, newline); } else mpz_get_str (tmp, base, r); out_len = strlen (tmp); if (flag_splitup_output) { for (s = tmp; out_len > 80; s += 80) { fwrite (s, 1, 80, stdout); printf ("%s\n", newline); out_len -= 80; } fwrite (s, 1, out_len, stdout); } else { fwrite (tmp, 1, out_len, stdout); } free (tmp); printf ("%s\n", newline); } else { printf ("result is approximately %ld digits%s\n", (long) mpz_sizeinbase (r, base >= 0 ? base : -base), newline); } free_expr (e); } exit (errcode); }
int main(void) { long sd = 0; int t = 20; int s,j_rab;//miller int result = 0; //miller //metavlites gia metatropi keimenou se int k tubalin char mystring[MAXCHARS];//my text to encrypt - decrypt hope so long int str_len; char c; mpz_t max_int, c_int, str_int, encrypted,decrypted; mpz_init(max_int); mpz_init(c_int); mpz_init(str_int);mpz_init(encrypted); mpz_init(decrypted); mpz_t psi, d, n_minus_one;//miller mpz_t n_prime,n,three,two,a,one,p,q,phi,p_minus_one,q_minus_one,e,gcd,d_priv,t2; mpz_t seed; mpz_t ro;//for encry-decry gmp_randinit(stat,GMP_RAND_ALG_LC,120); mpz_init(n_prime); mpz_init(n);//iniatialize mpz_init(three); mpz_init(a); mpz_init(two); mpz_init(one); mpz_init(seed); mpz_init(psi);//for miller-rabin mpz_init(p); mpz_init(q); mpz_init(phi); mpz_init(p_minus_one); mpz_init(q_minus_one); mpz_init(e); mpz_init(gcd); mpz_init(d_priv); mpz_init(ro); mpz_init(t2); mpz_set_str(three, "3", 10); mpz_set_str(two, "2", 10); mpz_set_str(one, "1", 10); srand((unsigned)getpid()); //initialize stat sd = rand(); mpz_set_ui(seed,sd); gmp_randseed(stat,seed); int countpq=0;//0 primes pros to paron, kantous 2 (p kai q) int i = 0; //printf("Give a message (till %d chars):\n",MAXCHARS-1); //fgets(mystring,MAXCHARS,stdin); // FILE *fp; /* declare the file pointer */ fp = fopen ("file.txt", "r"); while(fgets(mystring, MAXCHARS, fp) != NULL) { sscanf (mystring, "%d"); } fclose(fp); // do{ // mehri na vreis 2 prime do{//RANDOM NUMBER mpz_urandomb(n_prime,stat,512);//create a random number }while((mpz_even_p(n_prime))&& (n_prime<=three));//checking n to be >=3 && n be odd mpz_init(n_minus_one); //initialize mpz_sub_ui(n_minus_one, n_prime, 1);//n_minus_one = n-1 s = 0; mpz_init_set(d, n_minus_one); while (mpz_even_p(d)) {// gia oso ine artios mpz_fdiv_q_2exp(d, d, 1); //shift right s++;//inc s } for (i = 0; i < t; ++i) { do{ mpz_urandomb(a,stat,20);//create random number }while(!((a<=(n_prime-two)) && (a>=two)));//checking a must be (2<=a<=n-2) mpz_powm(psi,a,d,n_prime); if(mpz_cmp(psi,one)!=0 && mpz_cmp(psi,n_minus_one)){ j_rab=1; while(j_rab<s && mpz_cmp(psi,n_minus_one)){ mpz_mul(psi,psi,psi); // y^2 mpz_mod(psi,psi,n_prime); //psi= psi^2 mod n if(mpz_cmp(psi,one)==0){//if y=1 result = 1; goto exit_miller; } j_rab++; } if(mpz_cmp(psi,n_minus_one)!=0){//if y=n-1 result = 1; goto exit_miller; } }//end external if }//end for if(result!=1){ countpq++; //an ine prime tote save if(countpq==1){mpz_set(p,n_prime);}//save p else{ mpz_set(q,n_prime);}//save q } exit_miller: result = 0; if(mpz_cmp(p,q)==0){countpq=0;}//an p kai q idioi pame pali }while(countpq<2); gmp_printf ("p = %Zd\n", p); gmp_printf ("q = %Zd\n", q); mpz_mul(n,p,q); //calculate p*q gmp_printf ("n = p*q = %Zd\n", n); mpz_sub(p_minus_one,p,one); mpz_sub(q_minus_one,q,one); gmp_printf ("p-1 = %Zd\n", p_minus_one); gmp_printf ("q-1 = %Zd\n", q_minus_one); mpz_mul(phi,p_minus_one,q_minus_one); gmp_printf ("phi = %Zd\n", phi); do{ mpz_urandomm(e,stat,phi);//create random number e opou < tou phi mpz_add(e,e,two);//add two to be bigger the e from ena mpz_gcd(gcd,e,phi); }while((!(mpz_cmp(gcd,one)==0)));//checking..gcd=1 gmp_printf ("e = %Zd\n", e); gmp_printf ("gcd = %Zd\n", gcd); mpz_invert(d_priv,e,phi);//ypologismos antistrofou e mod phi gmp_printf ("private key (d) = %Zd\n", d_priv); gmp_printf ("public key (n,e) = (%Zd , %Zd)\n", n,e); ////// convert myText to myIntegerText str_len = strlen(mystring); if(mystring[str_len - 1] == '\n') mystring[str_len - 1] = '\0'; str_len = strlen(mystring); printf("%s -> %ld \n", mystring, str_len); for(i = str_len - 1; i >= 0; i--){ c = mystring[i]; mpz_mul_ui(ro,ro,BASE); // r=r*BASE mpz_add_ui(ro, ro, c); // r=r+c }//now ro is mystring as Integers gmp_printf("My text is: %s and has %ld chars.\nAs Integer is:%Zd",mystring, strlen(mystring), ro); ////// encrypt text mpz_powm(encrypted,ro,e,n);// gmp_printf("\nEncrypted message is: %Zd",encrypted); //// //// create encrypted file fp= fopen("encrypted_file.txt","w"); fprintf(fp, encrypted); fclose(fp); //// ////// decrypt text mpz_powm(decrypted,encrypted,d_priv,n);// gmp_printf("\nDecrypted message is: %Zd",decrypted); ////// convert myIntegerText to myText mpz_set(str_int, ro);//integerText to mytext mpz_set_ui(max_int, 1UL);//larger int set for(i = 0; i < 10; i++){// maxlength =100 if(mpz_cmp(str_int, max_int) <= 0){ str_len = i; break;} mpz_mul_ui(max_int, max_int, BASE);} for(i = 0; i < str_len; i++){ mpz_mod_ui(c_int, str_int,BASE); // ekxoreitai sthn metablhth c_int=str_int mod BASE mpz_sub(str_int, str_int, c_int); mpz_tdiv_q_ui(str_int, str_int,BASE); mystring[i] = mpz_get_ui(c_int);} mystring[str_len] = '\0'; //printf("Num of Chars--> %ld\n", str_len); ///////plaintext gmp_printf("\nPlaintext message is: %s",mystring); mpz_clear(n_prime); mpz_clear(n);//clear mpz_clear(three); mpz_clear(a); mpz_clear(two); mpz_clear(seed); mpz_clear(one); mpz_clear(d); mpz_clear(n_minus_one); mpz_clear(psi); mpz_clear(p); mpz_clear(q); mpz_clear(phi); mpz_clear(p_minus_one); mpz_clear(q_minus_one); mpz_clear(e); mpz_clear(gcd); mpz_clear(d_priv); mpz_clear(ro); mpz_clear(max_int); mpz_clear(c_int); mpz_clear(str_int); mpz_clear(t2); mpz_clear(encrypted); mpz_clear(decrypted); return 0; }