elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Temas
Páginas: 1 [2]
11  Programación / Programación C/C++ / Problemita con sockets en: 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  Programación / Programación C/C++ / Implementación ordenamiento burbuja en C en: 2 Febrero 2016, 15:19 pm
Sencilla implementación del algoritmo de ordenamiento "burbuja":

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void ordenar_array(int *, int);
  5.  
  6. int main() {
  7.  
  8. int array[9]={5, 7, 7, 8, 5, 8, 1, 9, 3};
  9. ordenar_array(array, 9);
  10. int x;
  11. for(x=0; x<9; x++) {
  12.  
  13. printf("%d", array[x]);
  14.  
  15. }
  16. printf("\n");
  17.  
  18. }
  19.  
  20. void ordenar_array(int * array, int numero_elementos) {
  21.  
  22. int x, n, aux;
  23.  
  24. for(n=1; n<numero_elementos; n++) {
  25. for(x=0; x<numero_elementos-1; x++) {
  26.  
  27. if(array[x+1]<array[x]) {
  28.  
  29. aux=array[x];
  30. array[x]=array[x+1];
  31. array[x+1]=aux;
  32.  
  33. }
  34.  
  35. }
  36. }
  37. }
  38.  
13  Programación / Programación C/C++ / ¿ Me pueden explicar este código ? (Escaner de puertos) en: 19 Junio 2015, 16:46 pm
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:

Código
  1.    #include <stdio.h>
  2.    #include <unistd.h>
  3.    #include <errno.h>
  4.    #include <netdb.h>
  5.    #include <string.h>
  6.    #include <sys/types.h>
  7.    #include <sys/socket.h>
  8.  
  9.  
  10.    int main(int argc, char *argv[]) {                  
  11.  
  12.     printf("\n\n");
  13.  
  14.     int sockid;    // Identificador del socket
  15.     int connid;    // Identificador de la conexion
  16.     int pcon = 1;  // Contador del bucle
  17.     int pa = 0;    // Almacena el numero de puertos que tiene abiertos el pc remoto;
  18.  
  19.     struct sockaddr_in conect; // Estructora para guardar datos de conexion.
  20.  
  21.     // Datos en la estructura:
  22.     conect.sin_family = AF_INET;
  23.     conect.sin_addr.s_addr = inet_addr("127.0.0.1");
  24.     bzero(&(conect.sin_zero), 8);
  25.  
  26.     for (pcon = 0; pcon != 8000; pcon++) {
  27.  
  28.     sockid = socket(AF_INET,SOCK_STREAM,0);
  29.  
  30.     conect.sin_port = htons(pcon);
  31.     connid = connect(sockid, (struct sockaddr *)&conect, sizeof(struct sockaddr));
  32.  
  33.     if (connid != -1) {
  34.  
  35.     printf("Puerto %d.................... ABIERTO \n",pcon);
  36.     pa++;
  37.     close(connid);
  38.     close(sockid);
  39.     }
  40.     }
  41.  
  42.     printf("\n\n");
  43.     printf("Scann terminado... %d puertos abiertos",pa);
  44.     printf("\n\n");
  45.  
  46.     return 0;
  47.    }
  48.  

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  Programación / Programación C/C++ / problema con funcion que ordena array de tipo int en: 2 Junio 2015, 17:16 pm
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:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. void ordenar_array(int [], int []);
  5. int comprobar_repetir_vector(int, int []);
  6.  
  7. int main() {
  8.  
  9.  int num_array[]={5, 8, 7, 3, 1, 6, 2, 4, 9};
  10.  int num_result[9];
  11.  ordenar_array(num_array, num_result);
  12.  
  13.  for(int x=0; x<9; x++) {
  14.  
  15.    printf("%d", num_result[x]);
  16.  
  17.  }
  18.  
  19. }
  20.  
  21. void ordenar_array(int num_array[], int num_result[]) {
  22.  
  23. int aux=num_array[0];
  24. int len=sizeof(num_array);
  25.  
  26.  for(int x=0;len+1>x;x++) {
  27.  
  28.    for(int y=0;len+1>y;y++) {
  29.  
  30.      if (num_array[y]<aux && comprobar_repetir_vector(num_array[y], num_result)==0) {
  31.  
  32.  
  33.        aux=num_array[y];
  34.  
  35.      }
  36.  
  37.    }
  38.  
  39.  num_result[x]=aux;
  40.  
  41.  }
  42.  
  43. }
  44.  
  45. int comprobar_repetir_vector(int numero, int vector[]){
  46.  
  47. int x;
  48. int len=sizeof(vector);
  49. for(x=0; x<len+1;x++) {
  50.  
  51. if(numero==vector[x]) {
  52.  
  53. return 1;
  54.  
  55. }
  56. }
  57. return 0;
  58. }
  59.  

Gracias de antemano.

Saludos.
15  Programación / Programación C/C++ / Error en programa generar clave aleatoria en: 20 Mayo 2015, 22:04 pm
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void main() {
  6.  
  7. srand(time(NULL));
  8.  
  9. int cifras, x;
  10. char min[]="abcdefghijklmnopqrstuvwxyz";
  11. char may[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  12. char num[]="0123456789";
  13.  
  14. printf("Escribe el número de cifras del string a crear...");
  15. scanf("%d", &cifras);
  16. printf("\n");
  17.  
  18. char aleatorio[cifras];
  19.  
  20. for(x; x<cifras; x++) {
  21. int eleccion=(int)(rand() % 3+1);
  22.  
  23. switch ( eleccion ) {
  24. case 1:
  25. aleatorio[x]=min[rand() % 25+1];
  26. break;
  27. case 2:
  28. aleatorio[x]=may[rand() % 25+1];
  29. break;
  30. case 3:
  31. aleatorio[x]=num[rand() % 9+1];
  32. break;
  33. default:
  34. continue;
  35. }
  36.  
  37. aleatorio[cifras+1]='\0';
  38. }
  39. printf("%s\n", aleatorio);
  40. }
  41.  

Saludos.
16  Programación / Programación C/C++ / Vuelta a la desesperación con este código. en: 27 Abril 2015, 19:25 pm
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // constantes
  8.  
  9. #define numero_de_letras 27
  10.  
  11. // variables globales
  12.  
  13. double claves[numero_de_letras][1000];
  14. int clave[numero_de_letras];
  15.  
  16.  
  17. // arrays globales
  18. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  19. char cifrado[999999999];
  20. char descifrado[999999999];
  21.  
  22. // prototipos de funciones
  23. void generar_clave(int);
  24. void ingresar_clave(int []);
  25. int comprobar_repetir_vector(int, int []);
  26. int comprobar_repetir_matriz(double, double [][1000]);
  27. void arrancar_motor(int, int);
  28. int suma(double);
  29. double aleatorio(int, int);
  30. double aleatorio_cifras(int);
  31. void cifrar(int, int, char []);
  32. void descifrar(int, char []);
  33.  
  34. int main() {
  35.  
  36. srand(getpid());
  37. generar_clave(8);
  38. arrancar_motor(8, 20);
  39.  
  40. cifrar(8, 20, "hola esto es una prueba de un texto cifrado");
  41. printf("%s\n", cifrado);
  42. descifrar(8, cifrado);
  43. printf("El mensaje descifrado es:\n\n %s \n", descifrado);
  44.  
  45.  
  46. }
  47.  
  48.  
  49.  
  50. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  51. int comprobar_repetir_matriz(double numero, double matriz[][1000]) {
  52.  
  53. int x;
  54. int y;
  55.  
  56. for(x=0; x<numero_de_letras; x++) {
  57.  
  58. for(y=0;y<1000;y++) {
  59. printf("pasa por aqui");
  60. if (numero==matriz[x][y]) {
  61.  
  62. return 1;
  63. }
  64. }
  65.  
  66. }
  67. return 0;
  68.  
  69. }
  70.  
  71. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  72. int comprobar_repetir_vector(int numero, int vector[]){
  73.  
  74. int x;
  75. for(x=0; x<numero_de_letras;x++) {
  76.  
  77. if(numero==vector[x]) {
  78. printf("\n%d\n", numero);
  79. printf("\n%d\n", vector[x]);
  80. return 1;
  81.  
  82. }
  83. }
  84. return 0;
  85. }
  86.  
  87. // Devuelve la suma de las cifras de un numero
  88. int suma(double numero) {
  89.  
  90. int resultado=0;
  91. while (numero>0) {
  92.  
  93. resultado+=fmod(numero, 10);
  94. numero/=10;
  95. }
  96. return resultado;
  97. }
  98.  
  99. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  100. double aleatorio(int max, int min) {
  101.  
  102. return rand () % (max-min+1) + min;
  103.  
  104.  
  105. }
  106.  
  107. //Genera un numero aleatorio de x cifras
  108. double aleatorio_cifras(int cifras) {
  109.  
  110. int x;
  111. int random;
  112. char aux[2];
  113. char num[cifras];
  114.  
  115. num[0]=0;
  116. for(x=0; x<cifras; x++){
  117.  
  118. random=rand () % 10;
  119.  
  120. if((random==0) && (x==0)) { x--; continue;  }
  121. sprintf(aux, "%d", random);
  122. strcat(num, aux);
  123.  
  124. }
  125. return atof(num);
  126.  
  127. }
  128.  
  129. //Genera una clave optimidada y la guarda en la variable global clave.
  130. void generar_clave(int numero_suma) {
  131.  
  132. srand(getpid());
  133.  
  134. int maximo, minimo, x, y, num_random;
  135.  
  136. int max=120;
  137. int min=60;
  138.  
  139. maximo=numero_suma*max/20;
  140. minimo=numero_suma*min/20;
  141.  
  142.  
  143. for(x=0;x<numero_de_letras;) {
  144. num_random=aleatorio(maximo, minimo);
  145. if (comprobar_repetir_vector(num_random, &clave[0])==1) {
  146. continue;
  147. }
  148. clave[x]=num_random;
  149. x++;
  150. }
  151.  
  152. printf("se ha generado la clave: \n");
  153. for(y=0;y<numero_de_letras;y++) {
  154.  
  155. printf("(%d)", clave[y]);
  156.  
  157. }
  158. printf("\n");
  159. }
  160.  
  161. // Permite ingresar el valor de cualquier array en la variable global clave.
  162. void ingresar_clave(int array[]) {
  163.  
  164. srand(getpid());
  165.  
  166. int x;
  167.  
  168. for(x=0;x<numero_de_letras;x++) {
  169.  
  170. clave[x]=array[x];
  171. }
  172.  
  173. }
  174. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  175. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  176.  
  177.  
  178. int y, z, h;
  179. double num_random;
  180.  
  181. for(z=0; z<numero_de_letras; z++) {
  182. printf("Inicializando letra %c\n", letras[z]);
  183. for(h=0; h<cantidad_numeros;) {
  184. num_random=aleatorio_cifras(numero_cifras);
  185. if (((fabs(suma(num_random)-clave[z])) < 0.00001) && (comprobar_repetir_matriz(num_random, claves))==0) {
  186.  
  187. claves[z][h]=num_random;
  188. printf("%.0lf\n", num_random);
  189. h++;
  190.  
  191.  
  192.  
  193. } else { continue;  }
  194.  
  195.  
  196. }
  197. }
  198. printf("se ha generado la clave: \n");
  199. for(y=0;y<numero_de_letras;y++) {
  200.  
  201. printf("(%d)", clave[y]);
  202.  
  203. }
  204. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  205. }
  206.  
  207. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  208. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  209.  
  210.  
  211. int letra, letrass, x;
  212. char cifrado_inside[strlen(texto)*numero_cifras];
  213. cifrado_inside[0] = 0;
  214. char string_auxiliar[numero_cifras+1];
  215. for(letra=0; strlen(texto)>letra; letra++) {
  216.  
  217.  
  218. for(letrass=0; letrass<numero_de_letras; letrass++) {
  219.  
  220. if (texto[letra]==letras[letrass]) {
  221.  
  222. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  223. strcat(cifrado_inside, string_auxiliar);
  224. break;
  225. }
  226.  
  227. }
  228.  
  229. }
  230. strcpy(cifrado, cifrado_inside);
  231.  
  232. }
  233.  
  234. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  235. void descifrar(int numero_cifras, char cifrado[]) {
  236.  
  237.  
  238. char auxiliar[numero_cifras];
  239. int x, y=0, z;
  240.  
  241. for(x=0; x<strlen(cifrado); x++) {
  242.  
  243. auxiliar[y]=cifrado[x];
  244. y++;
  245.  
  246.  
  247. if(y==numero_cifras) {
  248.  
  249. for(z=0; z<numero_de_letras; z++) {
  250.  
  251. if(fabs(suma(atof(auxiliar))-clave[z]) < 0.00001) {
  252.  
  253. // printf("\n%d\n", suma(atof(auxiliar)));
  254.  
  255. descifrado[strlen(descifrado)]=letras[z];
  256. y=0;
  257. break;
  258.  
  259. }
  260.  
  261. }
  262.  
  263. }
  264.  
  265. }
  266.  
  267. }
  268.  
  269.  

Gracias de antemano.

Saludos.
17  Programación / Programación C/C++ / Ultima duda de snakecode (violación de segmento) en: 24 Abril 2015, 19:35 pm
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // constantes
  8.  
  9. #define numero_de_letras 27
  10.  
  11. // variables globales
  12.  
  13. double claves[numero_de_letras][1000];
  14. int clave[numero_de_letras];
  15.  
  16.  
  17. // arrays globales
  18. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  19. char cifrado[999999999];
  20. char descifrado[999999999];
  21.  
  22. // prototipos de funciones
  23. void generar_clave(int);
  24. void ingresar_clave(int []);
  25. int comprobar_repetir_vector(int, int, int []);
  26. int comprobar_repetir_matriz(int, double, double [][1000]);
  27. void arrancar_motor(int, int);
  28. int suma(double);
  29. double aleatorio(int, int);
  30. double aleatorio_cifras(int);
  31. void cifrar(int, int, char []);
  32. void descifrar(int, char []);
  33.  
  34. int main() {
  35.  
  36.  
  37. generar_clave(32);
  38. arrancar_motor(32, 20);
  39.  
  40. cifrar(32, 20, "prueba");
  41. printf("%El mensaje cifrado es:\n %s\n", cifrado);
  42. descifrar(32, cifrado);
  43. printf("El mensaje descifrado es:\n %s \n", descifrado);
  44. }
  45.  
  46.  
  47.  
  48. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  49. int comprobar_repetir_matriz(int n, double numero, double matriz[][1000]) {
  50.  
  51. int x;
  52. int y;
  53. for(x=0; x<n-1; x++) {
  54.  
  55. for(y=0;y<1000;y++) {
  56.  
  57. if (numero==matriz[x][y]) {
  58. return 1;
  59. }
  60. }
  61.  
  62. }
  63. return 0;
  64.  
  65. }
  66.  
  67. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  68. int comprobar_repetir_vector(int n, int numero, int vector[]){
  69.  
  70. int x;
  71. for(x=0; x<n-1;x++) {
  72.  
  73. if(numero==vector[x]) {
  74.  
  75. return 1;
  76.  
  77. }
  78. }
  79. return 0;
  80. }
  81.  
  82. // Devuelve la suma de las cifras de un numero
  83. int suma(double numero) {
  84.  
  85. int resultado=0;
  86. while (numero>0) {
  87.  
  88. resultado+=fmod(numero, 10);
  89. numero/=10;
  90. }
  91. return resultado;
  92. }
  93.  
  94. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  95. double aleatorio(int max, int min) {
  96.  
  97.  
  98. return rand () % (max-min+1) + min;
  99.  
  100.  
  101. }
  102.  
  103. double aleatorio_cifras(int cifras) {
  104.  
  105. int x;
  106. int random;
  107. char aux[2];
  108. char num[cifras];
  109.  
  110. num[0]=0;
  111. for(x=0; x<cifras; x++){
  112.  
  113. random=rand () % 10;
  114.  
  115. if((random==0) && (x==0)) { x--; continue;  }
  116. sprintf(aux, "%d", random);
  117. strcat(num, aux);
  118.  
  119. }
  120. return atof(num);
  121.  
  122. }
  123.  
  124. //Genera una clave optimidada y la guarda en la variable global clave.
  125. void generar_clave(int numero_suma) {
  126.  
  127.  
  128. int maximo, minimo, x, y, num_random;
  129.  
  130. int max=120;
  131. int min=60;
  132.  
  133. maximo=numero_suma*max/20;
  134. minimo=numero_suma*min/20;
  135.  
  136.  
  137. for(x=0;x<numero_de_letras;) {
  138. num_random=aleatorio(maximo, minimo);
  139. if (comprobar_repetir_vector(x, num_random, &clave[0])==1) {
  140. continue;
  141. }
  142. clave[x]=num_random;
  143. x++;
  144. }
  145.  
  146. printf("se ha generado la clave: \n");
  147. for(y=0;y<numero_de_letras;y++) {
  148.  
  149. printf("(%d)", clave[y]);
  150.  
  151. }
  152. printf("\n");
  153. }
  154.  
  155. // Permite ingresar el valor de cualquier array en la variable global clave.
  156. void ingresar_clave(int array[]) {
  157.  
  158. int x;
  159.  
  160. for(x=0;x<numero_de_letras;x++) {
  161.  
  162. clave[x]=array[x];
  163. }
  164.  
  165. }
  166. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  167. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  168.  
  169. srand(time(NULL));
  170.  
  171. int y, z, h;
  172. double num_random;
  173.  
  174. for(z=0; z<numero_de_letras; z++) {
  175. printf("Inicializando letra %c\n", letras[z]);
  176. for(h=0; h<cantidad_numeros;) {
  177. num_random=aleatorio_cifras(numero_cifras);
  178. if (((fabs(suma(num_random)-clave[z])) < pow(1, -9999999999999)) && (comprobar_repetir_matriz(z, num_random, claves))==0) {
  179.  
  180. claves[z][h]=num_random;
  181. printf("%.0lf\n", num_random);
  182. h++;
  183.  
  184.  
  185.  
  186. } else { continue;  }
  187.  
  188.  
  189. }
  190. }
  191. printf("se ha generado la clave: \n");
  192. for(y=0;y<numero_de_letras;y++) {
  193.  
  194. printf("(%d)", clave[y]);
  195.  
  196. }
  197. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  198. }
  199.  
  200. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  201. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  202.  
  203.  
  204. int letra, letrass, x;
  205. char cifrado_inside[strlen(texto)*numero_cifras];
  206. char string_auxiliar[numero_cifras-1];
  207. for(letra=0; strlen(texto)>letra; letra++) {
  208.  
  209.  
  210. for(letrass=0; letrass<numero_de_letras; letrass++) {
  211.  
  212. if (texto[letra]==letras[letrass]) {
  213. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  214. strcat(cifrado_inside, string_auxiliar);
  215. break;
  216. }
  217.  
  218. }
  219.  
  220. }
  221. strcpy(cifrado, cifrado_inside);
  222.  
  223. }
  224.  
  225. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  226. void descifrar(int numero_cifras, char cifrado[]) {
  227.  
  228.  
  229. char auxiliar[numero_cifras];
  230. int x, y=0, z;
  231.  
  232. for(x=0; x<strlen(cifrado); x++) {
  233.  
  234. auxiliar[y]=cifrado[x];
  235. y++;
  236.  
  237.  
  238. if(y==numero_cifras) {
  239.  
  240. for(z=0; z<numero_de_letras; z++) {
  241.  
  242. if(suma(atof(auxiliar))==clave[z]) {
  243.  
  244. descifrado[strlen(descifrado)]=letras[z];
  245. y=0;
  246. break;
  247.  
  248. }
  249.  
  250. }
  251.  
  252. }
  253.  
  254. }
  255.  
  256. }
  257.  
  258.  

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
  1. # -*- encoding: utf-8 -*-
  2.  
  3. #snakecode is free software: you can redistribute it and/or modify
  4.   # it under the terms of the GNU General Public License as published by
  5.    #the Free Software Foundation, either version 3 of the License, or
  6.    #(at your option) any later version.
  7.  
  8.    #SnakeCode is distributed in the hope that it will be useful,
  9.    #but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    #GNU General Public License for more details.
  12.    #
  13.    #You should have received a copy of the GNU General Public License
  14.   # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  15.  
  16.  
  17. #constantes
  18.  
  19. maxr=120
  20. minr=60
  21.  
  22. import random
  23.  
  24. #Devuelve la suma de las cifras de un numero
  25.  
  26. def suma(numero):
  27.  
  28. resultado=0
  29. while numero>0:
  30. resultado+=numero%10
  31. numero/=10
  32. return resultado
  33.  
  34. #Genera una lista con Z numeros aleatorios de X cifras, cuyas cifras sumen Y cantidad
  35.  
  36. def generador_aleatorio(numero_de_suma, numero_de_cifras, cantidad_de_numeros):
  37. max=""
  38. min="1"
  39. lista_numeros=[]
  40.  
  41. for x in range(0, numero_de_cifras):
  42. max+="9"
  43. for x in range(1, numero_de_cifras):
  44. min+="0"
  45.  
  46. while cantidad_de_numeros>0:
  47. var=random.randint(int(min), int(max))
  48. if suma(var)==numero_de_suma and lista_numeros.count(var)==0:
  49. cantidad_de_numeros-=1
  50. lista_numeros.append(var)
  51. print var
  52. return lista_numeros
  53.  
  54. # Genera una clave optimizada automáticamente devolviendo una lista, esa lista puede ser utilizada posteriormente al inicializar el motor con init
  55.  
  56. def generar_clave(nc):
  57.  
  58. maximo=nc*maxr/20
  59. minimo=nc*minr/20
  60.  
  61. pass_random=[]
  62.  
  63. while len(pass_random)<28:
  64.  
  65. var=random.randrange(minimo, maximo)
  66. if pass_random.count(var)==0:
  67. pass_random.append(var)
  68.  
  69. return pass_random
  70.  
  71. # 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.
  72.  
  73. def init(nc, lista, nn=20):
  74.  
  75. global claves
  76. global letras
  77. global numero_cifras
  78. numero_cifras=nc
  79.  
  80. claves={}
  81. 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", " ")
  82. for y in range(0, 28):
  83. print "inicializando letra ", letras[y]
  84. claves[letras[y]]=generador_aleatorio(int(lista[y]), nc, nn)
  85.  
  86. print "se ha generado la clave", lista, "con un numero de cifras de", nc
  87.  
  88.  
  89. #Devuelve un texto cifrado pasandole un texto en claro
  90.  
  91. def cifrar(texto):
  92.  
  93. cifrado=""
  94. for x in texto:
  95.  
  96. cifrado+=str(random.choice(claves[x]))
  97.  
  98. return cifrado
  99.  
  100. #Devuelve un texto en claro pasandole un texto cifrado
  101.  
  102. def descifrar(cifrado):
  103.  
  104. separado=[]
  105. for x in range(0, len(cifrado), numero_cifras):
  106.  
  107. separado.append(cifrado[x:x+numero_cifras])
  108.  
  109. texto=""
  110.  
  111. for x in separado:
  112. for y in claves:
  113.  
  114. if suma(int(x))==suma(int(claves[y][0])):
  115.  
  116. texto+=y
  117.  
  118. return texto
  119.  
  120.  
  121.  

Gracias de antemano.

Saludos.



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

Código
  1. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  2.  
  3.  
  4. int letra, letrass, x;
  5. char cifrado_inside[strlen(texto)*numero_cifras];
  6. char string_auxiliar[numero_cifras-1];
  7. for(letra=0; strlen(texto)>letra; letra++) {
  8.  
  9.  
  10. for(letrass=0; letrass<numero_de_letras; letrass++) {
  11.  
  12. if (texto[letra]==letras[letrass]) {
  13.  
  14. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  15. strcat(cifrado_inside, string_auxiliar);
  16. break;
  17. }
  18.  
  19. }
  20.  
  21. }
  22. strcpy(cifrado, cifrado_inside);
  23.  
  24. }
  25.  



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í:

Código:
 @5206852228998504

El código que llevo ahora es este:

Código
  1. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  2.  
  3.  
  4. int letra, letrass, x;
  5. char cifrado_inside[strlen(texto)*numero_cifras];
  6. char string_auxiliar[numero_cifras+1];
  7. for(letra=0; strlen(texto)>letra; letra++) {
  8.  
  9.  
  10. for(letrass=0; letrass<numero_de_letras; letrass++) {
  11.  
  12. if (texto[letra]==letras[letrass]) {
  13.  
  14. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  15. strcat(cifrado_inside, string_auxiliar);
  16. break;
  17. }
  18.  
  19. }
  20.  
  21. }
  22. strcpy(cifrado, cifrado_inside);
  23.  
  24. }

Ayudadme por favor.

Saludos.



Ya lo he resuelto, gracias de todas formas.
18  Programación / Programación C/C++ / Funcion genera numeros aleatorios de x cifras ayuda en: 24 Abril 2015, 16:33 pm
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:

Código
  1. double aleatorio_cifras(int cifras) {
  2.  
  3. int x;
  4. int random;
  5. char aux[2];
  6. char num[cifras];
  7.  
  8. for(x=0; x<cifras; x++){
  9.  
  10. random=rand () % 10;
  11. sprintf(aux, "%d", random);
  12. strcat(num, aux);
  13.  
  14. }
  15. printf("%s", num);
  16. return atof(num);
  17.  
  18. }
  19.  

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  Programación / Programación C/C++ / Perdido y desesperado con este código en: 21 Abril 2015, 22:34 pm
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // variables globales
  8.  
  9. double claves[27][1000];
  10. int clave[27];
  11.  
  12.  
  13. // arrays globales
  14. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  15. char cifrado[999999999];
  16. char descifrado[999999999];
  17.  
  18. // prototipos de funciones
  19. void generar_clave(int);
  20. void ingresar_clave(int []);
  21. int comprobar_repetir_vector(int, int []);
  22. int comprobar_repetir_matriz(double, double [][1000]);
  23. void arrancar_motor(int, int);
  24. int suma(double);
  25. double aleatorio(int, int);
  26. void cifrar(int, int, char []);
  27. void descifrar(int, char []);
  28.  
  29. int main() {
  30.  
  31. srand(getpid());
  32. generar_clave(15);
  33. arrancar_motor(15, 1);
  34.  
  35.  
  36.  
  37. }
  38.  
  39.  
  40. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  41. int comprobar_repetir_matriz(double numero, double matriz[][1000]) {
  42.  
  43. int x;
  44. int y;
  45. for(x=0; x<27; x++) {
  46.  
  47. for(y=0;y<1000;y++) {
  48.  
  49. if (numero==matriz[x][y]) {
  50. return 1;
  51. }
  52. }
  53.  
  54. }
  55. return 0;
  56.  
  57. }
  58.  
  59. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  60. int comprobar_repetir_vector(int numero, int vector[]){
  61.  
  62. int x;
  63. for(x=0; x<27;x++) {
  64.  
  65. if(numero==vector[x]) {
  66.  
  67. return 1;
  68.  
  69. }
  70. }
  71. return 0;
  72. }
  73.  
  74. // Devuelve la suma de las cifras de un numero
  75. int suma(double numero) {
  76.  
  77. int resultado=0;
  78. while (numero>0) {
  79.  
  80. resultado+=fmod(numero, 10);
  81. numero/=10;
  82. }
  83. return resultado;
  84. }
  85.  
  86. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  87. double aleatorio(int max, int min) {
  88.  
  89.  
  90. return rand() % max + min;
  91.  
  92.  
  93. }
  94. //Genera una clave optimidada y la guarda en la variable global clave.
  95. void generar_clave(int numero_suma) {
  96.  
  97.  
  98. int maximo, minimo, x, y, num_random;
  99.  
  100. int max=120;
  101. int min=60;
  102.  
  103. maximo=numero_suma*max/20;
  104. minimo=numero_suma*min/20;
  105.  
  106.  
  107. for(x=0;x<27;) {
  108. num_random=aleatorio(maximo, minimo);
  109. if (comprobar_repetir_vector(num_random, &clave[0])==1) {
  110. continue;
  111. }
  112. clave[x]=num_random;
  113. x++;
  114. }
  115.  
  116. printf("se ha generado la clave: \n");
  117. for(y=0;y<27;y++) {
  118.  
  119. printf("(%d)", clave[y]);
  120.  
  121. }
  122. printf("\n");
  123. }
  124.  
  125. // Permite ingresar el valor de cualquier array en la variable global clave.
  126. void ingresar_clave(int array[]) {
  127.  
  128. int x;
  129.  
  130. for(x=0;x<27;x++) {
  131.  
  132. clave[x]=array[x];
  133. }
  134.  
  135. }
  136. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  137. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  138.  
  139. srand(time(NULL));
  140. int y, z, h;
  141. double num_random;
  142.  
  143. double min=(double)pow(10, numero_cifras-1);
  144. double max=(double)pow(10, numero_cifras)-1;
  145.  
  146.  
  147.  
  148. for(z=0; z<27; z++) {
  149. printf("Inicializando letra %c\n", letras[z]);
  150. for(h=0; h<cantidad_numeros;) {
  151. num_random=aleatorio(max, min);
  152. if ((suma(num_random)==clave[z]) && (comprobar_repetir_matriz(num_random, claves))==0) {
  153.  
  154. claves[z][h]=num_random;
  155. printf("%.0lf\n", num_random);
  156. h++;
  157.  
  158.  
  159.  
  160. } else { continue;  }
  161.  
  162.  
  163. }
  164. }
  165. printf("se ha generado la clave: \n");
  166. for(y=0;y<27;y++) {
  167.  
  168. printf("(%d)", clave[y]);
  169.  
  170. }
  171. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  172.  
  173. printf("minimo: %lf:", min);
  174. printf("maximo: %lf:", max);
  175. }
  176.  
  177. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  178. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  179.  
  180.  
  181. int letra, letrass, x;
  182. char cifrado_inside[strlen(texto)*numero_cifras];
  183. char string_auxiliar[numero_cifras-1];
  184. for(letra=0; strlen(texto)>letra; letra++) {
  185.  
  186.  
  187. for(letrass=0; letrass<27; letrass++) {
  188.  
  189. if (texto[letra]==letras[letrass]) {
  190. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  191. strcat(cifrado_inside, string_auxiliar);
  192. break;
  193. }
  194.  
  195. }
  196.  
  197. }
  198. strcpy(cifrado, cifrado_inside);
  199.  
  200. }
  201.  
  202. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  203. void descifrar(int numero_cifras, char cifrado[]) {
  204.  
  205.  
  206. char auxiliar[numero_cifras];
  207. int x, y=0, z;
  208.  
  209. for(x=0; x<strlen(cifrado); x++) {
  210.  
  211. auxiliar[y]=cifrado[x];
  212. y++;
  213.  
  214.  
  215. if(y==numero_cifras) {
  216.  
  217. for(z=0; z<27; z++) {
  218.  
  219. if(suma(atof(auxiliar))==clave[z]) {
  220.  
  221. descifrado[strlen(descifrado)]=letras[z];
  222. y=0;
  223. break;
  224.  
  225.  
  226. }
  227.  
  228.  
  229. }
  230.  
  231.  
  232. }
  233.  
  234.  
  235.  
  236.  
  237.  
  238. }
  239.  
  240.  
  241.  
  242. }
  243.  
  244.  

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  Programación / Programación C/C++ / Problema con rand y srand en este codigo en: 21 Abril 2015, 17:55 pm
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:

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.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines