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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con un generador pseudo-aleatorio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con un generador pseudo-aleatorio  (Leído 1,670 veces)
tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
ayuda con un generador pseudo-aleatorio
« en: 25 Agosto 2017, 03:58 am »

hola, estoy tratando da hacer un cifrador tipo vernam pero en lugar de una clave corta, esta la uso como semilla de un generador pseudo-aleatorio que improvise, este usa un generador congruencial lineal multiplicativo como el que usa mathlab pero con valores ligeramente distintos y una forma de seleccion de bits de ese numero para generar el numero final ( 8 bits) luego uso un xor entre los numeros generados para generar otra secuencia n-1 mas chica, mi problema es que no se si los numeros son lo suficientemente aleatorios y fuertes como para ser usados en el cifrado, alguien puede o sabe hacer las pruebas necesarias?

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void main() {
  6. char clave[30]="";
  7. unsigned char *subc;
  8. int i,j,n,k,l,m,salto;
  9. long numero;
  10. unsigned long long semilla;
  11.  
  12. printf("ingrese la clave\n");
  13. gets(clave);
  14.  
  15. n=strlen(clave);
  16.  
  17. subc=malloc(n*n);
  18.  
  19. semilla ^= semilla;
  20. l ^= l;
  21.  
  22. for(i=0;i<n;i++)
  23.   semilla += (long long)clave[i];
  24.  
  25. semilla <<= 1;
  26. semilla++;
  27.  
  28. for(m=0;m<n;m++) {
  29. for(i=0;i<n;i++) {
  30. for(j=0;j<clave[i];j++) {
  31. semilla *= semilla;
  32. semilla %= 2147483629;
  33. semilla *= 16811;
  34. semilla %= 2147483629;
  35. }
  36.  
  37. numero = (long) semilla;
  38. // printf("%12u   %08X\n",numero,numero);
  39.  
  40. salto ^= salto;
  41. for(k=7;k>=0;k--) {
  42. if(!clave[i]&1<<k)
  43.   salto++;
  44. subc[l] <<=1;
  45. if(numero & 1<<(k+23-salto))
  46.   subc[l]++;
  47. }
  48. l++;
  49. }
  50. }
  51.  
  52. printf("\n");
  53.  
  54. for(i=0;i<n;i++) {
  55.   for(j=0;j<n;j++)
  56.      printf("%4d\n",subc[i*n+j]);
  57.   //printf("\n");
  58. }
  59.  
  60. for(i=0;i<(n*n-1);i++)
  61. subc[i] ^= subc[i+1];
  62.  
  63. for(i=0;i<(n*n-1);i++)
  64.   printf("%4d\n",subc[i]);
  65.  
  66. for(i=0;i<(n*n-2);i++)
  67. subc[i] ^= subc[i+1];
  68.  
  69. for(i=0;i<(n*n-2);i++)
  70.   printf("%4d\n",subc[i]);
  71.  
  72. for(i=0;i<(n*n-3);i++)
  73. subc[i] ^= subc[i+1];
  74.  
  75. for(i=0;i<(n*n-3);i++)
  76.   printf("%4d\n",subc[i]);
  77.  
  78. free(subc);
  79. }

esta es una version algo primitiva pero hace precisamente lo que dije


« Última modificación: 25 Agosto 2017, 04:02 am por engel lex » 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