Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - pacosn1111

#1
Buenas, resulta que desde hace unos meses he notado un comportamiento extraño en mi navegador Chrome (windows 10) resulta que cada vez que entro en "mcdonalds.es" se me redirecciona automáticamente a una web de malware, exactamente a esta url:

hxxp://sweeps6270.tutonhamon84.live/5762166777/?utm_campaign=bKMuT7EMVXU5Z6UvvSHONGlfu-yV43iC8T8uYixAFxs1&t=main9_2d1c181f58180a6e36&f=1

Si cierro la web y vuelvo a entrar en "mcdonalds.es" accedo normalmente a la web original.

Lo primero que pensé era que mi navegador estaba infectado, algún plugin o algún virus, pero lo extraño de todo esto, es que días después entré en "mcdonalds.es" desde mi teléfono móvil (android/firefox) y tenía exactamente el mismo comportamiento, además lo hice utilizando los datos, es decir, sin usar la red de mi casa.

¿Alguna idea? Gracias.
#2
WarZone / Prueba JSW ¿Está rota?
9 Marzo 2019, 13:11 PM
No me aparece el prompt para escribir la contraseña, ¿Está rota la prueba o es el comportamiento normal de la prueba?

Gracias.
#3
Redes / Extrañas "caidas" de un server
25 Octubre 2017, 13:04 PM
Buenas, tengo un problema con mi servidor algo extraño, lo planteo por si alguien me puede ayudar.

En casa tengo un servidor web (casero, para ejercicios de clase, nada profesional), antes usaba Debian 9.1 pero hace poco cambié a FreeBSD y con ambos tengo el mismo problema (por lo que no es cosa del SO), uso apache para el servicio web, el server ftp que viene con FreeBSD, ssh para acceder desde fuera y no-ip ya que no tengo ip estática.

A veces va perfecto, pero otras veces ni siquiera puedo hacer ping al dominio, al principio pensé que podía ser cosa de no-ip que no está actualizando la ip en el dns, pero no es así, no-ip está funcionando perfectamente, además "vuelve" sin que haga nada, es decir, si me tiro una mañana haciendo ping al dominio, lo mismo durante 20 minutos no  va, luego sin hacer nada mágicamente vuelve etc...

¿Alguna idea? Pienso que puede ser cosa del router que me da ISP (ono) que es un poco basurilla y alguna vez me han dado problemas esos routers ¿Que opinan?

Muchas gracias.
#4
Redes / Pequeña duda sobre routers
13 Abril 2017, 23:43 PM
Buenas, tengo una pequeña duda sobre como funcionan los routers uniendo redes, imaginad que tengo algo así:



(La imagen la he sacado de google)

Sé que PC0 no puede saber la dirección MAC de un equipo que no esté dentro de su red local (es decir solo puede saber la dirección MAC de PC1 y de su router, y así con el resto de subredes. El caso es, cuando PC0 hace una petición a PC2, tengo entendido que el router detecta que está fuera de su red (por el nombre de red) y le "pasa la pelota" al siguiente router (el que está al lado suyo) entonces, del paquete tcp/ip "quita" la dirección MAC de PC0 y pone la dirección MAC de el mismo (del primer router) antes de pasarselo al siguiente router, ¿Es esto correcto?

Gracias.
#5
Buenas, hace un tiempo me di cuenta que existian grupos de telegram para prácticamente cualquier distribución GNU/Linux y ninguno para sistemas *BSD, así que he creado un grupo para ello, ahora mismo no somos muchos (15 personas) pero somos activos, dejo el enlace de invitación del grupo:

https://t.me/sistemasbsd
#6
Me pasa algo muy extraño con un ordenador viejo que tengo para hacer pruebas, es una torre con una tarjeta de red ethernet, el caso es el siguiente:

- Arranco el ordenador, con un cable RJ45 conectado entre el equipo y el router (de ONO), se deberían encender una luz tanto en el socket de la tarjeta de red del equipo como en el router indicanto que hay enlace entre ambos, pero no es así, no se enciende, como si el cable estuviese roto.

- Booteo FreeBSD 11 y cuando llega al paso de configurar la red, le digo DHCP y no funciona, evidentemente, si ni siquiera existe enlace entre router y equipo, normal que no obtenga DHCP.

- Booteo un linux live (Kali para ser más precisos) cuando termina de arrancar el live y me pide usuario y contraseña, mágicamente se enciende la luz tanto en el router como en la tarjeta de red, teniendo internet normalmente.

- Reinicio el equipo sin el live de linux y siguen encendidas ambas luces, algo que antes no hacía, booteo FreeBSD 11 y la red va normalmente, cogiendo DHCP y todo.

¿Cómo puede ser esto? ¿Tal vez alguna movida del Router? No tiene ningún sentido.
#7
Buenas, hace unos meses estaba viendo como redireccionar el stdout a otro socket y gracias al usuario "Arkangel_0x7C5" que respondió lo conseguí, pero ahora tengo otra duda, el código del servidor es:


#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include "ss.h"

#define buf_max 1000

int func_server();
char buf[buf_max];
int limit;

void main() {

if(getuid()!=0) exit(0);

system("iptables -A INPUT -p tcp --dport 3551 -j ACCEPT");
while(1) func_server();
}
int func_server() {
server(3551);

while(fd_client) {
limit=recv(fd_client,buf,buf_max,0);
if(buf[0]=='\0') break;
strcat(buf, "&");
buf[limit]='\0';
if((strcmp(buf, "exit"))==0) break;

if(fork()==0){
dup2(fd_client, STDOUT_FILENO);
dup2(fd_client, STDERR_FILENO);
system(buf);}
}
close(fd_client);
close(fd_server);
return 0;
}


y del cliente:


#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include "ss.h"

#define buf_max 1000
char array[999999];
int limit;

void main(int argc, char *argv[]) {
if(argc!=3) printf("USE: client address port\n");
char buf[buf_max];
if((client(argv[1], atoi(argv[2])))==1) {printf("Falló la conexión con el server\n"); exit(1);}
else printf("Conectado al server %s %d\n PRECAUCIÓN,!No ejecutar ningún comando remoto que requiera intervención!\n", argv[1], atoi(argv[2]));

while(fd) {

if(fork()==0) {while(fd) {memset(array,'\0',strlen(array)); recv(fd,array,999999,0); printf("%s", array);}}

fgets(buf, buf_max, stdin);
if(buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0';
send(fd, buf, buf_max, 0);
if((strcmp(buf, "exit"))==0) {close(fd); exit(0);}
}
}



El problema es que el array donde se almacena en el cliente el stdout tiene un tope, fijo, y algunas veces aunque sea muy grande hace falta más ¿Cómo puedo hacer que se adapte al stdout que devuelve el servidor?

Gracias.
#8
Unix/Unix-Like / ¿Que opinan de FreeBSD?
23 Agosto 2016, 23:27 PM
Pues eso, ¿Qué opinan de FreeBSD (y de *BSD en general), lo han usado alguna vez? ¿Es más recomendable que GNU/Linux?
#9
Redes / ¿Como funciona ACK?
17 Agosto 2016, 16:15 PM
Buenas, estaba leyendo sobre el bug tan polémico que afecta a todos los kernels linux entre el 3.6 y el 4.6, pero creo que no entiendo muy bien el sistema ACK. Por lo que tengo entendido siempre que se abre una conexión TCP, se realizan los llamados 3 pasos. SYN/SYN-ACK/ACK y luego leo que el fallo es por el límite que establece por segundo, es decir, que por defecto se envian 100 peticiones ACK, que por lo que se ve es poco y por eso es vulnerable.

Pero sigo sin pillarlo del todo, ¿Qué es exactamente ACK y como afecta a ese límite en el kernel? Sé para que sirve, precisamente para evitar spoofing y garantizar la fiabilidad de los datos, pero no entiendo que es exactamente y como funciona.

Gracias.
#10
Hola a todos de nuevo, estoy haciendo un pequeño programa que lanza comandos remotos, funciona bastante bien, solo quiero que cuando hago un ls o cualquier comando, la salida se redireccione para que desde el otro lado la pueda leer, no se por donde empezar.

Saludos.
#11
Programación C/C++ / Problemita con sockets
19 Mayo 2016, 00:20 AM
Estoy haciendo una pequeña libreria para sockets en C muy simple, basicamente es un fichero .c con dos funciones una para servidor y otra para cliente, en un .h meto los descriptores de los sockets exportandolos con extern y he creado dos archivos .c para probar la biblioteca, uno para el server y otro para el client, llegan a conectarse por un socket pero el recv me da error -1 y no se que puede ser. No he pegado el codigo por que es un poco largo.

Saludos.
#12
Sencilla implementación del algoritmo de ordenamiento "burbuja":


#include <stdio.h>
#include <stdlib.h>

void ordenar_array(int *, int);

int main() {

int array[9]={5, 7, 7, 8, 5, 8, 1, 9, 3};
ordenar_array(array, 9);
int x;
for(x=0; x<9; x++) {

printf("%d", array[x]);

}
printf("\n");

}

void ordenar_array(int * array, int numero_elementos) {

int x, n, aux;

for(n=1; n<numero_elementos; n++) {
for(x=0; x<numero_elementos-1; x++) {

if(array[x+1]<array[x]) {

aux=array[x];
array[x]=array[x+1];
array[x+1]=aux;

}

}
}
}
#13
Hola a todos, resulta que estoy intentando aprender sockets en C, he leido ya varias webs y he intentado aprender por mi cuenta pero me resulta muy dificil los sockets, no se por que, el caso es que mirando por la web encontré un source, bastante pequeño sobre un scaneador de puertos en C (evidentemente usando sockets), lo he estado mirando y la mayoría no lo entiendo (todo lo que tiene que ver con los sockets dentro del source no lo pillo), ¿ Alguien podría explicarme linea por linea que hace este programa ? me sería de mucha ayuda para seguir intentando aprender sockets.

El source es este:


    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <netdb.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
     
     
    int main(int argc, char *argv[]) {                   
     
    printf("\n\n");
     
    int sockid;    // Identificador del socket
    int connid;    // Identificador de la conexion
    int pcon = 1;  // Contador del bucle
    int pa = 0;    // Almacena el numero de puertos que tiene abiertos el pc remoto;
     
    struct sockaddr_in conect; // Estructora para guardar datos de conexion.
     
    // Datos en la estructura:
    conect.sin_family = AF_INET;
    conect.sin_addr.s_addr = inet_addr("127.0.0.1");
    bzero(&(conect.sin_zero), 8);
     
    for (pcon = 0; pcon != 8000; pcon++) {
     
    sockid = socket(AF_INET,SOCK_STREAM,0);
     
    conect.sin_port = htons(pcon);
    connid = connect(sockid, (struct sockaddr *)&conect, sizeof(struct sockaddr));
     
    if (connid != -1) {
     
    printf("Puerto %d.................... ABIERTO \n",pcon);
    pa++;
    close(connid);
    close(sockid);
    }
    }
     
    printf("\n\n");
    printf("Scann terminado... %d puertos abiertos",pa);
    printf("\n\n");
     
    return 0;
    }
   


El código lo saque de un post antiguo de este mismo foro, la fuente es esta:

http://foro.elhacker.net/programacion_cc/scanner_de_puertos_en_c-t187519.0.html

Gracias de antemano, saludos.
#14
Hola a tod@s, me propuse escribir un programa que ordenara un array en otro array, he intentado ya de todo pero me sigue dando el mismo fallo, en vez de ordenar el array correctamente me genera un "222222222".

El código fuente es este:


#include <stdlib.h>
#include <stdio.h>

void ordenar_array(int [], int []);
int comprobar_repetir_vector(int, int []);

int main() {

  int num_array[]={5, 8, 7, 3, 1, 6, 2, 4, 9};
  int num_result[9];
  ordenar_array(num_array, num_result);

  for(int x=0; x<9; x++) {

    printf("%d", num_result[x]);

  }

}

void ordenar_array(int num_array[], int num_result[]) {

int aux=num_array[0];
int len=sizeof(num_array);

  for(int x=0;len+1>x;x++) {

    for(int y=0;len+1>y;y++) {

      if (num_array[y]<aux && comprobar_repetir_vector(num_array[y], num_result)==0) {


        aux=num_array[y];

      }

    }

  num_result[x]=aux;

  }

}

int comprobar_repetir_vector(int numero, int vector[]){

int x;
int len=sizeof(vector);
for(x=0; x<len+1;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}


Gracias de antemano.

Saludos.
#15
Hola a tod@s, acabo de escribir un simple código en C que te pregunta con un scanf de cuantos caracteres quieres la clave y te genera una clave aleatoria con mayusculas minusculas y números aleatorios, cuando uso un numero de caracteres alto como 25 todo va bien, pero cuando uso uno pequeño, como 5, obtengo lo siguiente:

x81Zw@

Es decir, esa arroba de más no se por que me aparece, dejo aquí el código:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main() {

srand(time(NULL));

int cifras, x;
char min[]="abcdefghijklmnopqrstuvwxyz";
char may[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char num[]="0123456789";

printf("Escribe el número de cifras del string a crear...");
scanf("%d", &cifras);
printf("\n");

char aleatorio[cifras];

for(x; x<cifras; x++) {
int eleccion=(int)(rand() % 3+1);

switch ( eleccion ) {
case 1:
aleatorio[x]=min[rand() % 25+1];
break;
case 2:
aleatorio[x]=may[rand() % 25+1];
break;
case 3:
aleatorio[x]=num[rand() % 9+1];
break;
default:
continue;
}

aleatorio[cifras+1]='\0';
}
printf("%s\n", aleatorio);
}


Saludos.
#16
Hola a tod@s, llevo toda la tarde dandole vueltas a por que no descifra mi código y es que ahora ni siquiera arranca por que genera los mismos numeros aleatorios para "generar_clave" por lo que se queda atascado en la función "comprobar_repetir_vector", por favor ayudadme llevo toda la tarde con este código y cada vez que toco algo arreglo una cosa y destrozo tres, estoy empezando en C, estaba acostumbrado a python y muchas cosas que antes no conocía ahora tengo que tenerlas en cuenta y me lio en mi propio código, bueno os dejo el codigo de lo que llevo:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// constantes

#define numero_de_letras 27

// variables globales

double claves[numero_de_letras][1000];
int clave[numero_de_letras];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
double aleatorio_cifras(int);
void cifrar(int, int, char []);
void descifrar(int, char []);

int main() {

srand(getpid());
generar_clave(8);
arrancar_motor(8, 20);

cifrar(8, 20, "hola esto es una prueba de un texto cifrado");
printf("%s\n", cifrado);
descifrar(8, cifrado);
printf("El mensaje descifrado es:\n\n %s \n", descifrado);


}



// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {

int x;
int y;

for(x=0; x<numero_de_letras; x++) {

for(y=0;y<1000;y++) {
printf("pasa por aqui");
if (numero==matriz[x][y]) {

return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){

int x;
for(x=0; x<numero_de_letras;x++) {

if(numero==vector[x]) {
printf("\n%d\n", numero);
printf("\n%d\n", vector[x]);
return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {

return rand () % (max-min+1) + min;


}

//Genera un numero aleatorio de x cifras
double aleatorio_cifras(int cifras) {

int x;
int random;
char aux[2];
char num[cifras];

num[0]=0;
for(x=0; x<cifras; x++){

random=rand () % 10;

if((random==0) && (x==0)) { x--; continue;  }
sprintf(aux, "%d", random);
strcat(num, aux);

}
return atof(num);

}

//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {

srand(getpid());

int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<numero_de_letras;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

srand(getpid());

int x;

for(x=0;x<numero_de_letras;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){


int y, z, h;
double num_random;

for(z=0; z<numero_de_letras; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio_cifras(numero_cifras);
if (((fabs(suma(num_random)-clave[z])) < 0.00001) && (comprobar_repetir_matriz(num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
cifrado_inside[0] = 0;
char string_auxiliar[numero_cifras+1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<numero_de_letras; letrass++) {

if (texto[letra]==letras[letrass]) {

sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<numero_de_letras; z++) {

if(fabs(suma(atof(auxiliar))-clave[z]) < 0.00001) {

// printf("\n%d\n", suma(atof(auxiliar)));

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;

}

}

}

}

}



Gracias de antemano.

Saludos.
#17
Hola a todos, ya casi he conseguido crear snakecode (aunque arranca bastante lenta la funcion arrancar_motor), solo me falta conseguir que cifre y descifre, he creado las funciones pero algo estoy haciendo mal por que no funcionan bien, dejo el código que llevo:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// constantes

#define numero_de_letras 27

// variables globales

double claves[numero_de_letras][1000];
int clave[numero_de_letras];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int, int []);
int comprobar_repetir_matriz(int, double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
double aleatorio_cifras(int);
void cifrar(int, int, char []);
void descifrar(int, char []);

int main() {


generar_clave(32);
arrancar_motor(32, 20);

cifrar(32, 20, "prueba");
printf("%El mensaje cifrado es:\n %s\n", cifrado);
descifrar(32, cifrado);
printf("El mensaje descifrado es:\n %s \n", descifrado);
}



// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(int n, double numero, double matriz[][1000]) {

int x;
int y;
for(x=0; x<n-1; x++) {

for(y=0;y<1000;y++) {

if (numero==matriz[x][y]) {
return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int n, int numero, int vector[]){

int x;
for(x=0; x<n-1;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {


return rand () % (max-min+1) + min;


}

double aleatorio_cifras(int cifras) {

int x;
int random;
char aux[2];
char num[cifras];

num[0]=0;
for(x=0; x<cifras; x++){

random=rand () % 10;

if((random==0) && (x==0)) { x--; continue;  }
sprintf(aux, "%d", random);
strcat(num, aux);

}
return atof(num);

}

//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {


int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<numero_de_letras;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(x, num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

int x;

for(x=0;x<numero_de_letras;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){

srand(time(NULL));

int y, z, h;
double num_random;

for(z=0; z<numero_de_letras; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio_cifras(numero_cifras);
if (((fabs(suma(num_random)-clave[z])) < pow(1, -9999999999999)) && (comprobar_repetir_matriz(z, num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras-1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<numero_de_letras; letrass++) {

if (texto[letra]==letras[letrass]) {
sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<numero_de_letras; z++) {

if(suma(atof(auxiliar))==clave[z]) {

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;

}

}

}

}

}



Me da violación de segmento la función cifrar.

Para que veais mas o menos lo que debe de hacer os dejo el mismo algoritmo en python, lo escribí hace tiempo y funciona perfecto, es mas hasta arranca más rapido, lo estoy portando a C por cuestiones didácticas mas que nada:

Código (python) [Seleccionar]

# -*- encoding: utf-8 -*-

#snakecode is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
   #the Free Software Foundation, either version 3 of the License, or
   #(at your option) any later version.

   #SnakeCode is distributed in the hope that it will be useful,
   #but WITHOUT ANY WARRANTY; without even the implied warranty of
   #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   #GNU General Public License for more details.
   #
   #You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.


#constantes

maxr=120
minr=60

import random

#Devuelve la suma de las cifras de un numero

def suma(numero):

resultado=0
while numero>0:
resultado+=numero%10
numero/=10
return resultado

#Genera una lista con Z numeros aleatorios de X cifras, cuyas cifras sumen Y cantidad

def generador_aleatorio(numero_de_suma, numero_de_cifras, cantidad_de_numeros):
max=""
min="1"
lista_numeros=[]

for x in range(0, numero_de_cifras):
max+="9"
for x in range(1, numero_de_cifras):
min+="0"

while cantidad_de_numeros>0:
var=random.randint(int(min), int(max))
if suma(var)==numero_de_suma and lista_numeros.count(var)==0:
cantidad_de_numeros-=1
lista_numeros.append(var)
print var
return lista_numeros

# Genera una clave optimizada automáticamente devolviendo una lista, esa lista puede ser utilizada posteriormente al inicializar el motor con init

def generar_clave(nc):

maximo=nc*maxr/20
minimo=nc*minr/20

pass_random=[]

while len(pass_random)<28:

var=random.randrange(minimo, maximo)
if pass_random.count(var)==0:
pass_random.append(var)

return pass_random

# Inicializa el motor, el primer parámetro es el numero de cifras y el segundo es la lista que contiene la clave, ambos parametros imprescindibles para cifrar y descifrar con exito, el tercer parámetro, que es opcional, es la cantidad de numeros por letra generados.

def init(nc, lista, nn=20):

global claves
global letras
global numero_cifras
numero_cifras=nc

claves={}
letras=( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " ")
for y in range(0, 28):
print "inicializando letra ", letras[y]
claves[letras[y]]=generador_aleatorio(int(lista[y]), nc, nn)

print "se ha generado la clave", lista, "con un numero de cifras de", nc


#Devuelve un texto cifrado pasandole un texto en claro

def cifrar(texto):

cifrado=""
for x in texto:

cifrado+=str(random.choice(claves[x]))

return cifrado

#Devuelve un texto en claro pasandole un texto cifrado

def descifrar(cifrado):

separado=[]
for x in range(0, len(cifrado), numero_cifras):

separado.append(cifrado[x:x+numero_cifras])

texto=""

for x in separado:
for y in claves:

if suma(int(x))==suma(int(claves[y][0])):

texto+=y

return texto




Gracias de antemano.

Saludos.




Seré mas específico, la función que da violación de segmento esta:


void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras-1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<numero_de_letras; letrass++) {

if (texto[letra]==letras[letrass]) {

sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}





He logrado solucionarlo, pero ahora no cifra bien por que sale un caracter raro al principio de lo que está cifrado, es decir algo así:

@5206852228998504

El código que llevo ahora es este:

void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras+1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<numero_de_letras; letrass++) {

if (texto[letra]==letras[letrass]) {

sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}


Ayudadme por favor.

Saludos.




Ya lo he resuelto, gracias de todas formas.
#18
Hola a tod@s, resulta que para el motor de cifrado que estoy escribiendo acabo de hacer una función que debería generar numeros aleatorios muy grandes, para ello uso el truco de ir generando numero por numero e ir guardandolo uno a uno en una cadena y después pasarlo a double con atof, pero no funciona como debería, dejo el código:


double aleatorio_cifras(int cifras) {

int x;
int random;
char aux[2];
char num[cifras];

for(x=0; x<cifras; x++){

random=rand () % 10;
sprintf(aux, "%d", random);
strcat(num, aux);

}
printf("%s", num);
return atof(num);

}


Esto genera de salida algo así:

"�@2282"

Es decir, genera el numero aleatorio de 4 cifras que le pido, pero antes genera esos caracteres que no se de donde salen, y por culpa de eso la función atof no convierte bien el string a double.

Gracias de antemano saludos.
#19
Hola de nuevo, como sabeis estoy escribiendo un motor de cifrado en C, pero no hay forma de hacerlo funcionar correctamente, os dejo el código:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// variables globales

double claves[27][1000];
int clave[27];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
void cifrar(int, int, char []);
void descifrar(int, char []);

int main() {

srand(getpid());
generar_clave(15);
arrancar_motor(15, 1);



}


// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {

int x;
int y;
for(x=0; x<27; x++) {

for(y=0;y<1000;y++) {

if (numero==matriz[x][y]) {
return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){

int x;
for(x=0; x<27;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {


return rand() % max + min;


}
//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {


int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<27;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

int x;

for(x=0;x<27;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){

srand(time(NULL));
int y, z, h;
double num_random;

double min=(double)pow(10, numero_cifras-1);
double max=(double)pow(10, numero_cifras)-1;



for(z=0; z<27; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio(max, min);
if ((suma(num_random)==clave[z]) && (comprobar_repetir_matriz(num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);

printf("minimo: %lf:", min);
printf("maximo: %lf:", max);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras-1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<27; letrass++) {

if (texto[letra]==letras[letrass]) {
sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<27; z++) {

if(suma(atof(auxiliar))==clave[z]) {

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;


}


}


}





}



}



La funcion aleatorio devuelve un numero aleatorio dentro de un rango, la función generar_clave genera una clave optimizada y la función arrancar_motor genera x numeros de x cifras cuyas cifras sumen x numero y lo guarda en un array para posteriormente cifrar o descifrar con esos numeros, pero se me ha atascado la funcion arrancar_motor, no funciona lo rapido que esperaba, ahora hasta se queda en "inicializando letra a" y de ahí no sale.

Gracias de antemano.

Saludos.
#20
Estoy haciendo un pequeño motor de cifrado y tengo un problema con la función rand, y es que genera siempre el mismo numero, un numero negativo además, dejo aqui el código:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// variables globales

double claves[27][1000];
int clave[27];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
void cifrar(int, int, char []);
void descifrar(int, char []);


// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {

int x;
int y;
for(x=0; x<27; x++) {

for(y=0;y<1000;y++) {

if (numero==matriz[x][y]) {
return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){

int x;
for(x=0; x<27;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {


return rand () % (max-min+1) + min;


}
//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {


int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<27;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

int x;

for(x=0;x<27;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){

srand(time(NULL));

int y, z, h;
double num_random;

double min=(double)pow(10.0, numero_cifras-1);
double max=(double)pow(10.0, numero_cifras)-1;

for(z=0; z<27; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio(max, min);
printf("%lf", num_random);
if ((suma(num_random)==clave[z]) && (comprobar_repetir_matriz(num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras-1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<27; letrass++) {

if (texto[letra]==letras[letrass]) {
sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<27; z++) {

if(suma(atof(auxiliar))==clave[z]) {

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;


}


}


}





}



}




En la función arrancar_motor hago un srand(time(NULL)) es decir inicializo rand pero no se por que me genera siempre el mismo numero, pero no en ejecuciones distintas, si no cada vez que en el for de arrancar motor llamo a la funcion aleatorio que usa rand para obtener un numero aleatorio me da el mismo numero, por ende la función arrancar motor se queda congelada desde el primer intento de generar un número bajo las condiciones que quiero.

Gracias de antemano.

Saludos.