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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Vuelta a la desesperación con este código.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Vuelta a la desesperación con este código.  (Leído 1,583 veces)
pacosn1111

Desconectado Desconectado

Mensajes: 59



Ver Perfil
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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines