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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ultima duda de snakecode (violación de segmento)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ultima duda de snakecode (violación de segmento)  (Leído 1,593 veces)
pacosn1111

Desconectado Desconectado

Mensajes: 59



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


« Última modificación: 30 Abril 2015, 12:25 pm por Eternal Idol » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con violación de segmento « 1 2 »
Programación C/C++
Triper0 17 17,138 Último mensaje 8 Noviembre 2015, 21:34 pm
por alesurf1989
Violacion de segmento en producto de matrices
Programación C/C++
forakas 2 3,372 Último mensaje 28 Diciembre 2012, 04:53 am
por durasno
ayuda violacion de segmento?
Programación General
nightcode 7 4,407 Último mensaje 31 Diciembre 2013, 18:32 pm
por nightcode
Violación de Segmento
Programación C/C++
Jaquieline_JJ 1 2,258 Último mensaje 24 Abril 2014, 04:11 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines