[HACK] Numeros primos

Roman Medina roman at rs-labs.com
Tue May 18 20:58:56 CEST 2004


On Fri, 14 May 2004 15:35:33 +0100, you wrote:

>Una pregunta, como se puede trabajar en C con numeros en coma flotante
>mayores de 64 bits?

Busca en Google por "grandes números" o "big numbers". Por ejemplo, te
puede valer: freelip, miracl, etc.

Yo usé este último (miracl) para una de las pruebas de Izhal. URL para
Miracl:
http://indigo.ie/~mscott/

Para que veas lo "feo" que es usar este tipo de librerías te pego uno
de los fuentes que hice para Izhal. He borrado lineas a caso hecho,
asi q *espero q no compile*, pero te harás una idea de cómo se
programa con grandes números.

roman at sniff:~/hack/izhal/miracl > cat roman.c
/*
 * Prueba de Capitan a Comandante. Izhal. (c) RoMaNSoFt, 2002
 * [ Compilar: gcc -o roman roman.c -I. miracl.a ]
 */

#include <stdio.h>
#include <miracl.h>

#define MAX 10000

big euclides_ext(big n, big a) {
   int i;
   big c,res, cero, aux;
   big g[MAX],u[MAX],v[MAX];
   
   c=mirvar(0);
   res=mirvar(0);
   cero=mirvar(0);
   for(i=0;i<MAX;i++) {
      g[i]=mirvar(0);
      v[i]=mirvar(0);
   }

   copy(n,g[0]);
   u[0]=mirvar(1);
   zero(u[1]);
   zero(v[0]);
   v[1]=mirvar(1);
   
   i=1;
   while ( (compare(g[i],cero)) != 0 ) {
      copy(g[i-1],c);
      divide(c,g[i],c);
      copy(g[i-1],g[i]);
      divide(g[i+1],g[i+1],g[i]);
      multiply(c,u[i],aux);
      subtract(u[i-1],aux,u[i+1]);
      multiply(1,v[i],aux);
      subtract(v[i-1],aux,v[i+1]);
      i++;
   }

   copy(v[i-1],res);

   return(res);
}


int main()
{
   big msgencr;                         /* mensaje encriptado */
   big e, n;                            /* (e, n) := clave publica */
   big d;
   big p, q, fi, p1, q1, cero;
   big msgdesencr;                      /* mensaje desencriptado */
   
   miracl *mip=mirsys(5000,16);         /* base hexadecimal */

   msgencr=mirvar(0);                   /* inicializamos las variables
*/
   e=mirvar(0);
   n=mirvar(0);
   p=mirvar(0);
   q=mirvar(0);
   d=mirvar(0);
   fi=mirvar(0);
   p1=mirvar(0);
   q1=mirvar(0);
   cero=mirvar(0);
   msgdesencr=mirvar(0);
   
   printf("Texto encriptado: ");        /* leemos los datos de entrada
*/
   innum(msgencr, stdin);
   printf("NumeroE := ");
   innum(e, stdin);
   printf("NumeroP := ");
   innum(p, stdin);
   printf("NumeroQ := ");
   innum(q, stdin);

   multiply(p,q,n);
   printf("\nNumeroN := ");
   otnum(n, stdout);
   
   decr(p,1,p1);
   decr(q,1,q1);
   multiply(p1,q1,fi);
   printf("FI = (p-1)(q-1) = ");
   otnum(fi, stdout);

   printf("\nAplicando algoritmo extendido de Euclides...\n");
   d=euclides_ext(fi,e);
   if (compare(d,cero)==-1)
   printf("NumeroD := ");
   otnum(d, stdout);

   powmod(msgencr,d,n,msgdesencr);
   printf("\nTexto desencriptado: ");   /* visualizamos resultado */
   otnum(msgdesencr, stdout);
}
roman at sniff:~/hack/izhal/miracl > 

 Saludos,
 --Roman

--
PGP Fingerprint:
09BB EFCD 21ED 4E79 25FB  29E1 E47F 8A7D EAD5 6742
[Key ID: 0xEAD56742. Available at KeyServ]





More information about the hacking mailing list