› Foros › PlayStation 3 › Scene
/*
RSA-200 =
2799783391122132787082946763872260162107044678695
5428537560009929326128400107609345671052955360856
0618223519109513657886371059544820065767750985805
57613579098734950144178863178946295187237869221823983
Factors =
35324619344027701212726049781984643686711974001976250
23649303468776121253679423200058547956528088349
and
79258699544783330333470858414800596877379758573642
19960734330341455767872818152135381409304740185467
#define DEFN "27997833911221327870829467638722601621070446786955428537560009929326128400107609345671052955360856061822351910951365788637105954482006576775098580557613579098734950144178863178946295187237869221823983"
*/
/*
RSA-160 =
21527411027188897018960152013128254292577735888456
75980170497676778133145218859135673011059773491059
60249790711158521430207931466520284014061994699492
7570407753
Factors =
45427892858481394071686190649738831656137145778469
793250959984709250004157335359
and
47388090603832016196633832303788951973268922921040
957944741354648812028493909367
#define DEFN "2152741102718889701896015201312825429257773588845675980170497676778133145218859135673011059773491059602497907111585214302079314665202840140619946994927570407753"
*/
#define DEFN "99400891"
//#define DEFN "10957693037" //numero a factorizar=104677*104681
//#define DEFN "2152741102718889701896015201312825429257773588845675980170497676778133145218859135673011059773491059602497907111585214302079314665202840140619946994927570407753"
#define MAXDIG 10 //hasta 2048 bits
#define LOOPRESUME 1000000 //haz un resumen cada millon de tests
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//declaracion de tipos
typedef struct _node
{
char P[MAXDIG];
char Q[MAXDIG];
char PrevProduct[MAXDIG];
int carry;
int digits;
struct _node *next;
} node;
//declaracion de funciones
void possible_push(char *P, char *Q, int digits, char *PrevProduct);
void possible_pop(node *test);
void factorize(node *test);
char* multiply_for_test(node *test);
void stream_multiply_by_int(char *stream,int times); //ojo, lo devuelve en la variable pasada por puntero
void stream_shift_right(char *stream, int pos); //ojo, lo devuelve en la variable pasada por puntero
void stream_add(char *stream1, char *stream2); //devuelve la suma en stream1, machacando contenido
int stream_is_equal(char *stream1, char *stream2); //verdadero si stream1=stream2
int stream_is_greater(char *stream1, char *stream2); //verdadero si stream1>stream2
int stream_significant_numbers(char *stream); //devuelve el numero de numeros significativos (o sea, excluyendo ceros a la izquierda)
//declaracion de variables globales
char N[MAXDIG];
int digitsN;
node *possibles;
int stacklen;
//MAIN
int main(void)
{
int i,count;
char stemp[MAXDIG], mul_zero[MAXDIG], stream_uno[MAXDIG], stream_tres[MAXDIG], stream_siete[MAXDIG], stream_nueve[MAXDIG];
char toint[3];
node test;
clock_t cpstart, cpend;
time_t start,end;
start=time(NULL);
stacklen=0;
//parse N
for(i=0;i<MAXDIG;i++)
N[i]=0;
strcpy(stemp,DEFN);
count=strlen(DEFN);
for(i=0;i<strlen(DEFN);i++)
{
toint[0]=stemp[i];
toint[1]=0;
N[strlen(DEFN)-i-1]=atoi(toint);
}
digitsN=strlen(DEFN);
//N parseado y listo para continuar...
possibles=NULL;
memset(mul_zero,0,MAXDIG*sizeof(char));
memset(stream_uno,0,MAXDIG*sizeof(char));
stream_uno[0]=1;
memset(stream_tres,0,MAXDIG*sizeof(char));
stream_tres[0]=3;
memset(stream_siete,0,MAXDIG*sizeof(char));
stream_siete[0]=7;
memset(stream_nueve,0,MAXDIG*sizeof(char));
stream_nueve[0]=9;
//comprobamos ultimo digito
if(N[0]==1) {
possible_push(stream_uno,stream_uno,1,mul_zero);
possible_push(stream_tres,stream_siete,1,mul_zero);
possible_push(stream_nueve,stream_nueve,1,mul_zero);
}
if(N[0]==3) {
possible_push(stream_siete,stream_nueve,1,mul_zero);
possible_push(stream_uno,stream_tres,1,mul_zero);
}
if(N[0]==7) {
possible_push(stream_uno,stream_siete,1,mul_zero);
possible_push(stream_tres,stream_nueve,1,mul_zero);
}
if(N[0]==9) {
possible_push(stream_uno,stream_nueve,1,mul_zero);
possible_push(stream_tres,stream_tres,1,mul_zero);
possible_push(stream_siete,stream_siete,1,mul_zero);
}
count=0;
cpstart=clock();
while (possibles!=NULL) {
possible_pop(&test);
factorize(&test);
count=count+1;
if (count>LOOPRESUME)
{
count-=LOOPRESUME;
cpend=clock();
printf("\nIntentando Factorizar:\n");
printf("test P = ");
for(i=test.digits-1;i>=0;i--)
printf("%d",test.P[i]);
printf("\n");
printf("test Q = ");
for(i=test.digits-1;i>=0;i--)
printf("%d",test.Q[i]);
printf("\nElementos en pila: %d\nloops/seg: %d\n",stacklen,(int)((double)LOOPRESUME/((cpend-cpstart)/(double)CLOCKS_PER_SEC)));
cpstart=clock();
}
end=time(NULL);
if (difftime(end,start)>30)
exit(EXIT_SUCCESS);
}
printf("realizadas %d iteraciones\n",count);
printf("END!\n");
return 0;
}
void possible_push(char *P, char *Q, int digits, char *PrevProduct)
{
node *nuevo;
//reserva memoria
nuevo=malloc(sizeof(node));
memset(nuevo,0,sizeof(node)); //inicializa a 0
//copia datos
memcpy(nuevo->P,P,digits);
memcpy(nuevo->Q,Q,digits);
nuevo->digits=digits;
memcpy(nuevo->PrevProduct,PrevProduct,MAXDIG*sizeof(char));
//añade el nuevo nodo al principio de la lista
nuevo->next=possibles;
possibles=nuevo;
stacklen++;
}
void possible_pop(node *test)
{
node *temp;
//quita y regresa el primer nodo de la lista. apunta el principio de la lista al segundo nodo
temp=possibles;
possibles=temp->next;
temp->next=NULL;
stacklen--;
memcpy(test,temp,1*sizeof(node));
free(temp);
}
void factorize(node *test)
{
char *mult;
int i,j;
if(test->digits==MAXDIG)
{
return;
}
//primero comprueba a ver si es imposible que el producto sea el que buscamos
i=stream_significant_numbers(test->P);
j=stream_significant_numbers(test->Q);
i+=j;
if(i>MAXDIG)
{
return;
}
//comprueba que el P*Q del nodo pasado sea igual que el producto que andamos buscando
mult=multiply_for_test(test);
if(stream_is_equal(mult,N))
{
int i;
//este es el momento mas importante... HEMOS ENCONTRADO LA FACTORIZACION
printf("factorizacion encontrada\n");//ya imprimiremos mas adelante
printf("P = ");
for(i=test->digits-1;i>=0;i--)
printf("%d",test->P[i]);
printf("\n");
printf("Q = ");
for(i=test->digits-1;i>=0;i--)
printf("%d",test->Q[i]);
printf("\n");
exit(EXIT_SUCCESS);
}
if(stream_is_greater(mult,N))
{
//si el mult obtenido es mayor que N, mejor abandonamos directamente este nodo,
//porque no nos lleva a ninguna parte seguir calculando posibles valores, si siempre va a sobrepasar
free(mult);
return;
}
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
test->P[test->digits]=i;
test->Q[test->digits]=j;
possible_push(test->P,test->Q,test->digits+1,mult);
}
}
//lo anterior es mejorable. si usamos algun metodo para en lugar de encolar 100 valores, encolamos menos
//haciendo alguna operacion con el carry
free(mult);
}
char* multiply_for_test(node *test)
{
char *mult, *temp;
mult=malloc(MAXDIG*sizeof(char));
temp=malloc(MAXDIG*sizeof(char));
memset(mult,0,MAXDIG*sizeof(char));
memset(temp,0,MAXDIG*sizeof(char));
//cojemos la multiplicacion previa
memcpy(mult,test->PrevProduct,MAXDIG);
//sacamos Q sin el numero nuevo y lo multiplicamos por el numero nuevo añadido a P
memcpy(temp,test->Q,test->digits-1);
stream_multiply_by_int(temp,test->P[test->digits-1]);
stream_shift_right(temp,test->digits-1);
stream_add(mult,temp);
memset(temp,0,MAXDIG*sizeof(char));
//sacamos P sin el numero nuevo y lo multiplicamos por el numero nuevo añadido a Q
memcpy(temp,test->P,test->digits-1);
stream_multiply_by_int(temp,test->Q[test->digits-1]);
stream_shift_right(temp,test->digits-1);
stream_add(mult,temp);
memset(temp,0,MAXDIG*sizeof(char));
//sacamos el numero nuevo de P y Q y lo multiplicamos entre si
memcpy(temp,test->P,test->digits);
memset(temp,0,test->digits-1*sizeof(char));
stream_multiply_by_int(temp,test->Q[test->digits-1]);
stream_shift_right(temp,test->digits-1);
stream_add(mult,temp);
//listo, en mult tenemos ahora la multiplicacion de P y Q usando en el proceso el resultado de la antigua multiplicacion
free(temp);
return mult;
}
void stream_multiply_by_int(char *stream,int times)
{
int i;
register int tmp,carry;
carry=0;
for(i=0;i<MAXDIG;i++)
{
tmp=(stream[i]*times)+carry;
carry=0;
while(tmp>9)
{
tmp-=10;
carry++;
}
stream[i]=tmp;
}
}
void stream_shift_right(char *stream, int pos)
{
int i;
for(i=MAXDIG-pos-1;i>=0;i--)
{
stream[i+pos]=stream[i];
}
for(i=0;i<pos;i++)
{
stream[i]=0;
}
}
void stream_add(char *stream1, char *stream2) //el resultado se devuelve en stream1
{
int i;
for(i=0;i<MAXDIG;i++)
{
stream1[i]+=stream2[i];
if(stream1[i]>9)
{
stream1[i]-=10;
stream1[i+1]++;
}
}
}
int stream_is_equal(char *stream1, char *stream2) //verdadero si stream1=stream2
{
int i;
for (i=0;i<MAXDIG;i++) {
if(stream1[i]!=stream2[i])
{
return 0;
}
}
return 1;
}
int stream_is_greater(char *stream1, char *stream2) //verdadero si stream1>stream2
{
int i;
for(i=MAXDIG-1;i>0;i--)
{
if(stream1[i]>stream2[i])
{
return 1;
}
if(stream1[i]<stream2[i])
{
return 0;
}
}
//si llega a salir, es que son iguales, pero no creo que sea el caso, porque eso se comprueba antes
return 0;
}
int stream_significant_numbers(char *stream)
{
int i;
for(i=MAXDIG-1;i>=0;i--)
{
if (stream[i]!=0)
{
return i+1;
}
}
return 0;
}
f5inet escribió:lo mismo decian del cifrado SSL y fijate la noticia de hace 2 dias...
count=count+1;
if (count>LOOPRESUME)
Roxas01 escribió:no podria hacerse una red por linux como la de folding home? yo no entiendo de esto, pero podriamos juntar 200 ps3(yo me ofrezco) gracias a internet y usar la capacidad de procesamiento y usarlo en este proyecto. seria posible?
UN SALUDO
ffelagund escribió:Usa la filosofia *nix: nombre_de_archivo_ejecutable > archivo_de_salida.txtWhitehat_AoD escribió:f5inet escribió:lo mismo decian del cifrado SSL y fijate la noticia de hace 2 dias...
Si pero con 200 ps3 funcionando a la vez DD
Ahora aportando algo, he leido el codigo, y el resultado solo te lo muestra por pantalla, por si las moscas (y sabiendo que siempre pasan cosas) porque no haces que te lo guarde en un archivo????
Un saludo
PauSaDRaMaTiCa escribió:El ssl se ha roto usando una vulnerabilidad en md5.
Y no es por desanimar pero hay dos puntos claves:
La clave hay que buscarla entre 2^2048 posibilidades (osea es un numero con 600 cifras).Para almacenar todas las posibles combinaciones en un disco duro: 2048^2 -> (2^12)^2 -> 2^144, cada 2^10 cambiamos la base (kilo,mega,giga,tera,peta,exa y ya no se seguir) osea los exa son 2^60 y aun no hemos llegado ni a la mitad. Necesitarias 10^(3*8) disdos duros de 1 tera para almacenar todas las claves. No te estas haciendo a la idea de lo inmenso que es esto.
Es un delito y podrias acabar en la carcel. Aqui no vale la excusa de la consola es mia y hago lo que quiero, estas intentando conseguir la firma digital de sony y por eso ni has pagado ni pagaras, y por lo tanto es un delito.
Que no es por desanimar, y como ves te lo he argumentando para que veas porque no se ha tomado nunca esta via (ni se tomara). Se especula que en el futuro con la informatica cuantica todas estas claves sera posibles romperlas en muy pocas horas debido a las propiedades cuanticas de la materia (si una particula puede tener n estados los tendra todos y ninguno, asi que cuando tu crees un algoritmo para allar la clave se superpondran los estados obtinendo la respuesta en un tiempo infimo). Y si asi no te haces a la idea piensa en las progresiones dibujadas en una grafica, el hallar una clave crea una progresion exponencial con una pendiente cada vez mas pronunciada.
Lo siento pero , no way.
f5inet escribió:PauSaDRaMaTiCa escribió:El ssl se ha roto usando una vulnerabilidad en md5.
Y no es por desanimar pero hay dos puntos claves:
La clave hay que buscarla entre 2^2048 posibilidades (osea es un numero con 600 cifras).Para almacenar todas las posibles combinaciones en un disco duro: 2048^2 -> (2^12)^2 -> 2^144, cada 2^10 cambiamos la base (kilo,mega,giga,tera,peta,exa y ya no se seguir) osea los exa son 2^60 y aun no hemos llegado ni a la mitad. Necesitarias 10^(3*8) disdos duros de 1 tera para almacenar todas las claves. No te estas haciendo a la idea de lo inmenso que es esto.
Es un delito y podrias acabar en la carcel. Aqui no vale la excusa de la consola es mia y hago lo que quiero, estas intentando conseguir la firma digital de sony y por eso ni has pagado ni pagaras, y por lo tanto es un delito.
Que no es por desanimar, y como ves te lo he argumentando para que veas porque no se ha tomado nunca esta via (ni se tomara). Se especula que en el futuro con la informatica cuantica todas estas claves sera posibles romperlas en muy pocas horas debido a las propiedades cuanticas de la materia (si una particula puede tener n estados los tendra todos y ninguno, asi que cuando tu crees un algoritmo para allar la clave se superpondran los estados obtinendo la respuesta en un tiempo infimo). Y si asi no te haces a la idea piensa en las progresiones dibujadas en una grafica, el hallar una clave crea una progresion exponencial con una pendiente cada vez mas pronunciada.
Lo siento pero , no way.
se que es imposible, mas nada me impide intentarlo... y tecnicamente no es 'sacar la clave privada de sony', sino factorizar un numero, de todas maneras, si es imposible, no hay porque asustarse, ¿no?
todoloquese escribió:pues vamos,todos lo que sepan algo de programacion,a por ese codigo xD!
si reuniesemos unas cuantas ps3(unas ... 50?) trabajando a la vez,durante algunos dias seguidos,quiza... si hay alguien que sepa hacer los calculos,por favor,hacerlos y decir si seria viable la idea(seria estupendo )
Saludos , y gracias f5inet!
f5inet escribió:tambien se puede usar gpgpu para intentar factorizar el numero, pero es un nicho de mercado inferior y no esta standarizado (nVidia tiene CUDA, AMD/ATI tiene AMD Stream/brook+, OSX tiene openCL...) asi que habria que programar 3 variantes del algoritmo especializado para cada tecnologia, y ademas, dichas variaciones solo funcionan con versiones especificas de los drivers graficos y solo para determinadas tarjetas graficas de gama media/alta (nVidia >=G80, AMD/ATI tarjetas >=HD2400, OSX intel integradas >=X3000). si bien es cierto que GPGPU acelera de forma dramatica estos calculos, supongo que con los 6SPU disponibles en en CELL de PS3 y en todo caso con alguna ayuda de las instrucciones SSE2/3 de los procesadores x86 la cosa puede ser 'dimensionable'.
f5inet escribió:si, se que es utopico e imposible, pero... ¿y lo que nos vamos a reir?
hombre, al final es sacar 2 factores primos que al multiplicarse sean el numero dado. y yo lo estoy haciendo mas que nada por ver la potencia de cell y por aprender, pero si de camino suena la flauta, eso que me encuentro...
f5inet escribió:ya que has hecho algunos calculos, te doy los mios para que los cruces con los tuyos:
mi algoritmo totalmente optimizado, necesitaria hacer un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
el algortimo actual, sin optimizar, hace 750.000 loops por segundo en una PS3. espero conseguir un incremento minimo de x20 al pasarlo a una SPU. espero poder usar los 6 SPUs en paralelo, puesto que el algoritmo es altamente paralelizable y vectorizable. una PS3 espero que pueda entregar 750.000*20*6 loops/seg, adicionalmente, espero conseguir una aceleracion en el PPE de x6 al usar altivec, asi que añadele 750.000*6 usando uno de los hilos del PPE, dejando el otro hilo de ejecucion del PPE en plan mayordomo para mantener alimentados los SPE y el PPE
ya tienes datos de ejecucion reales, a ver si puedes calcularme cuanto tiempo seria necesario con 1 y con 1000 PS3...
GetD overflow, continuing...
Floating multiply overflow, continuing...
wabo escribió:f5inet escribió:ya que has hecho algunos calculos, te doy los mios para que los cruces con los tuyos:
mi algoritmo totalmente optimizado, necesitaria hacer un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
el algortimo actual, sin optimizar, hace 750.000 loops por segundo en una PS3. espero conseguir un incremento minimo de x20 al pasarlo a una SPU. espero poder usar los 6 SPUs en paralelo, puesto que el algoritmo es altamente paralelizable y vectorizable. una PS3 espero que pueda entregar 750.000*20*6 loops/seg, adicionalmente, espero conseguir una aceleracion en el PPE de x6 al usar altivec, asi que añadele 750.000*6 usando uno de los hilos del PPE, dejando el otro hilo de ejecucion del PPE en plan mayordomo para mantener alimentados los SPE y el PPE
ya tienes datos de ejecucion reales, a ver si puedes calcularme cuanto tiempo seria necesario con 1 y con 1000 PS3...
Venga pues:
Hemos de ponernos en lo peor---> con lo cual el objetivo estaría en 2048^2048
3*10^(2048^2048)= Lo siento, pero la calculadora de WXP no da para tanto Va enserio, podéis comprobarlo. Pero vamos sería algo así: 3e+4,015524852720233816377636290185e+6781
que es un zurullo incompreensible, así que me voy a descargar una calculadora como Dios manda y ahora edito...
EDITO: Por el momento ni una sola calculadora es capaz de hacer esa operación...
mellon escribió:wabo escribió:f5inet escribió:ya que has hecho algunos calculos, te doy los mios para que los cruces con los tuyos:
mi algoritmo totalmente optimizado, necesitaria hacer un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
el algortimo actual, sin optimizar, hace 750.000 loops por segundo en una PS3. espero conseguir un incremento minimo de x20 al pasarlo a una SPU. espero poder usar los 6 SPUs en paralelo, puesto que el algoritmo es altamente paralelizable y vectorizable. una PS3 espero que pueda entregar 750.000*20*6 loops/seg, adicionalmente, espero conseguir una aceleracion en el PPE de x6 al usar altivec, asi que añadele 750.000*6 usando uno de los hilos del PPE, dejando el otro hilo de ejecucion del PPE en plan mayordomo para mantener alimentados los SPE y el PPE
ya tienes datos de ejecucion reales, a ver si puedes calcularme cuanto tiempo seria necesario con 1 y con 1000 PS3...
Venga pues:
Hemos de ponernos en lo peor---> con lo cual el objetivo estaría en 2048^2048
3*10^(2048^2048)= Lo siento, pero la calculadora de WXP no da para tanto Va enserio, podéis comprobarlo. Pero vamos sería algo así: 3e+4,015524852720233816377636290185e+6781
que es un zurullo incompreensible, así que me voy a descargar una calculadora como Dios manda y ahora edito...
EDITO: Por el momento ni una sola calculadora es capaz de hacer esa operación...
Seguro que estas haciendo bien el calculo?
Igualmente: Quieres que te pase el archivo con tu calculo?
Salu2
wabo escribió:Ahora bien... lo he estado pensando...
Imagínate que la clave resulta ser 000000000000000000000000000000000004 (p.ej)
¿Cuántos cálculos habría que hacer? Pocos. Lo mio solo son estimaciones, por lo que te animo a seguir trabajando. Puede sonar la flauta.
(Y ya sabes, si mejoras el codigo y lo adaptas a Windows, un servidor ayudaría)
Maylot escribió:pero eso seria en caso de que saliese la clave en la ultima pasada, imaginaos que aparece en la 5ª o la 6ª pasada como han puesto mas arriba, el tiempo se reduce bastante
wabo escribió:mellon escribió:wabo escribió:Venga pues:
Hemos de ponernos en lo peor---> con lo cual el objetivo estaría en 2048^2048
3*10^(2048^2048)= Lo siento, pero la calculadora de WXP no da para tanto Va enserio, podéis comprobarlo. Pero vamos sería algo así: 3e+4,015524852720233816377636290185e+6781
que es un zurullo incompreensible, así que me voy a descargar una calculadora como Dios manda y ahora edito...
EDITO: Por el momento ni una sola calculadora es capaz de hacer esa operación...
Seguro que estas haciendo bien el calculo?
Igualmente: Quieres que te pase el archivo con tu calculo?
Salu2
Creo que si
Sería (para 1 PS3):
(3*10^(2,0077624263601169081888181450925e+6781))/(750000)= Actualmente.
(3*10^(2,0077624263601169081888181450925e+6781))/(750000*20*6)= Optimista.
(3*10^(2,0077624263601169081888181450925e+6781))/(750000*20*36)= Óptimo (si lo he entendido bien creo que es así)
En dias (para 1 PS3):
(3*10^(2,0077624263601169081888181450925e+6781))/(64800000000)= Actualmente.
(3*10^(2,0077624263601169081888181450925e+6781))/(7776000000000)= Optimista.
(3*10^(2,0077624263601169081888181450925e+6781))/(46656000000000)= Óptimo (si lo he entendido bien creo que es así)
Ya dirás que te sale.
EDITO:
En dias (para 1000 PS3):
(3*10^(2,0077624263601169081888181450925e+6781))/(64800000000000)= Actualmente.
(3*10^(2,0077624263601169081888181450925e+6781))/(7776000000000000)= Optimista.
(3*10^(2,0077624263601169081888181450925e+6781))/(46656000000000000)= Óptimo (si lo he entendido bien creo que es así)
En dias (para 1000000 PS3):
(3*10^(2,0077624263601169081888181450925e+6781))/(64800000000000000)= Actualmente.
(3*10^(2,0077624263601169081888181450925e+6781))/(7776000000000000000)= Optimista.
(3*10^(2,0077624263601169081888181450925e+6781))/(46656000000000000000)= Óptimo (si lo he entendido bien creo que es así)
En dias (para 2000000 PS3):
(3*10^(2,0077624263601169081888181450925e+6781))/(129600000000000000)= Actualmente.
(3*10^(2,0077624263601169081888181450925e+6781))/(15552000000000000000)= Optimista.
(3*10^(2,0077624263601169081888181450925e+6781))/(93312000000000000000)= Óptimo (si lo he entendido bien creo que es así)
un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
pero lo mas logico digo yo que es que hayan elegido la clave mas dificil no? o sea la que se mas larga de descifrar, vamos que si yo quiero proteger un archivo y tengo un maximo de 4 caracteres para elegir la contraseña, porque voy a usar el 0002 y que tarden nada en sacarla, elegiria el 9999 y tardarian bastante mas, pues los programas para sacar la clave van probando uno a uno los numeros, no?
si se lleva adelante me apunto
animo!
mellon escribió:
Las cosas no funcionan asi, esto no es la contraseña de un usuario de WinXP ni mucho menos.
PD= ¿Se dispone de la clave publica de Sony? Y del número RSA?
David13_13 escribió:mellon escribió:
Las cosas no funcionan asi, esto no es la contraseña de un usuario de WinXP ni mucho menos.
PD= ¿Se dispone de la clave publica de Sony? Y del número RSA?
bueno y podrias explicarme como funcionan entonces? tengo curiosidad
David13_13 escribió:mellon escribió:
Las cosas no funcionan asi, esto no es la contraseña de un usuario de WinXP ni mucho menos.
PD= ¿Se dispone de la clave publica de Sony? Y del número RSA?
bueno y podrias explicarme como funcionan entonces? tengo curiosidad
wabo escribió:f5inet escribió:ya que has hecho algunos calculos, te doy los mios para que los cruces con los tuyos:
mi algoritmo totalmente optimizado, necesitaria hacer un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
el algortimo actual, sin optimizar, hace 750.000 loops por segundo en una PS3. espero conseguir un incremento minimo de x20 al pasarlo a una SPU. espero poder usar los 6 SPUs en paralelo, puesto que el algoritmo es altamente paralelizable y vectorizable. una PS3 espero que pueda entregar 750.000*20*6 loops/seg, adicionalmente, espero conseguir una aceleracion en el PPE de x6 al usar altivec, asi que añadele 750.000*6 usando uno de los hilos del PPE, dejando el otro hilo de ejecucion del PPE en plan mayordomo para mantener alimentados los SPE y el PPE
ya tienes datos de ejecucion reales, a ver si puedes calcularme cuanto tiempo seria necesario con 1 y con 1000 PS3...
Venga pues:
Hemos de ponernos en lo peor---> con lo cual el objetivo estaría en 2048^2048
3*10^(2048^2048)= Lo siento, pero la calculadora de WXP no da para tanto Va enserio, podéis comprobarlo. Pero vamos sería algo así: 3e+4,015524852720233816377636290185e+6781
que es un zurullo incompreensible, así que me voy a descargar una calculadora como Dios manda y ahora edito...
EDITO: Por el momento ni una sola calculadora es capaz de hacer esa operación...
EDITO2: Sigo sin poder... este es el problema:GetD overflow, continuing...
Floating multiply overflow, continuing...
f5inet escribió:wabo escribió:f5inet escribió:ya que has hecho algunos calculos, te doy los mios para que los cruces con los tuyos:
mi algoritmo totalmente optimizado, necesitaria hacer un total de 3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2) 'loops' a la funcion factorize.
el algortimo actual, sin optimizar, hace 750.000 loops por segundo en una PS3. espero conseguir un incremento minimo de x20 al pasarlo a una SPU. espero poder usar los 6 SPUs en paralelo, puesto que el algoritmo es altamente paralelizable y vectorizable. una PS3 espero que pueda entregar 750.000*20*6 loops/seg, adicionalmente, espero conseguir una aceleracion en el PPE de x6 al usar altivec, asi que añadele 750.000*6 usando uno de los hilos del PPE, dejando el otro hilo de ejecucion del PPE en plan mayordomo para mantener alimentados los SPE y el PPE
ya tienes datos de ejecucion reales, a ver si puedes calcularme cuanto tiempo seria necesario con 1 y con 1000 PS3...
Venga pues:
Hemos de ponernos en lo peor---> con lo cual el objetivo estaría en 2048^2048
3*10^(2048^2048)= Lo siento, pero la calculadora de WXP no da para tanto Va enserio, podéis comprobarlo. Pero vamos sería algo así: 3e+4,015524852720233816377636290185e+6781
que es un zurullo incompreensible, así que me voy a descargar una calculadora como Dios manda y ahora edito...
EDITO: Por el momento ni una sola calculadora es capaz de hacer esa operación...
EDITO2: Sigo sin poder... este es el problema:GetD overflow, continuing...
Floating multiply overflow, continuing...
3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2)=3*10^300, o sea, un 3, seguido de 300 ceros 'loops'
optimista para 1 PS3=750000*6*20=90.000.000 loops/segundo, vamos a redondear y vamos a decir que una PS3 calcula 100Mloops/segundo, en un dia calcularia 100*3600*24=aproximadamente 9*10^12 loops. en un año calcularia 10^13 (vamos a dejarlo en 10^13 loops para abreviar) * 365= 3*10^15 loops.
si, aun queda lejisimos de 3*10^300 y necesitariamos varios millones de años para sacarlo...
pero oye, me gusta el reto, lo voy a intentar de todas formas...
f5inet escribió:3*10^(<numero de digitos del producto buscado, en caso de 2^2048 son 600 digitos>/2)=3*10^300, o sea, un 3, seguido de 300 ceros 'loops'
optimista para 1 PS3=750000*6*20=90.000.000 loops/segundo, vamos a redondear y vamos a decir que una PS3 calcula 100Mloops/segundo, en un dia calcularia 100*3600*24=aproximadamente 9*10^12 loops. en un año calcularia 10^13 (vamos a dejarlo en 10^13 loops para abreviar) * 365= 3*10^15 loops.
si, aun queda lejisimos de 3*10^300 y necesitariamos varios millones de años para sacarlo...
pero oye, me gusta el reto, lo voy a intentar de todas formas...
Je,je... Me había colado pero bien al interpretar lo que me decías.
Bueno, a ver si te levanta el ánimo:
1 PS3= 90000000 loops/segundo
100 PS3= 9000000000 loops/segundo
100000 PS3= 9000000000000 loops/segundo
500000 PS3= 45000000000000 loops/segundo --> en un dia: 3888000000000000000 loops (3,888*10^18) -->en un año 1,419*10^21 loops
A partir de aquí la cosa no aumenta de forma espectacular:
Nº consolas Loops 1er año
1000000 2,83824E+21
1500000 4,25736E+21
2000000 5,67648E+21
2500000 7,0956E+21
3000000 8,51472E+21
3500000 9,93384E+21
4000000 1,1353E+22
4500000 1,27721E+22
5000000 1,41912E+22
5500000 1,56103E+22
6000000 1,70294E+22
6500000 1,84486E+22
7000000 1,98677E+22
7500000 2,12868E+22
8000000 2,27059E+22
8500000 2,4125E+22
9000000 2,55442E+22
9500000 2,69633E+22
10000000 2,83824E+22
Y lo que es peor, cada vez se "ralentiza" más (obvio, al incrementarse exponencialmente las posibilidades):
93500000 2,65375E+23
Ahora veamos que pasa si partiendo de una base de 500000 cada año se añaden 200000:
Nº consolas Nº Años Loops/año/solas Loops acumulados
500000 1 1,41912E+21 1,41912E+21
700000 2 3,97354E+21 5,39266E+21
900000 3 7,66325E+21 1,30559E+22
1100000 4 1,24883E+22 2,55442E+22
1300000 5 1,84486E+22 4,39927E+22
Aunque consiguieses duplicar la velocidad...
Optimizado x2
2,83824E+21
1,07853E+22
2,61118E+22
5,10883E+22
8,79854E+22