ayuda con un cifrado vernam

Iniciado por tca153, 25 Agosto 2017, 21:10 PM

0 Miembros y 1 Visitante están viendo este tema.

tca153

hola estoy tratando de hacer un cifrador vernam para lo que se me ocurrio utilizar la clave como semilla de un generador de numeros pseudo-aleatorios para cifrar el mensaje y hacerla lo suficientemente grande como para eludir al test de kasinsky, pero lei que los generadores que hay no son criptograficamente seguros, asi que improvise uno, pero no se que tan bueno es. Alguien sabra o podra hacerle los test para saber si es bueno o no, o explicarme como hacerlo?

el codigo basico del generador (no del cifrador) es este:

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

void main() {
char clave[30];
unsigned char *subc;
int i,j,n,k,l,m,salto;
long numero;
unsigned long long semilla;

printf("ingrese la clave\n");
gets(clave);

n=strlen(clave);

subc=malloc(n*n);

semilla ^= semilla;
l ^= l;

for(i=0;i<n;i++)
   semilla += (long long)clave[i];
   
semilla <<= 1;
semilla++;

for(m=0;m<n;m++) {
for(i=0;i<n;i++) {
for(j=0;j<clave[i];j++) {
semilla *= semilla;
semilla %= 2147483629;
semilla *= 16811;
semilla %= 2147483629;
}

numero = (long) semilla;
// printf("%12u   %08X\n",numero,numero);

salto ^= salto;
for(k=7;k>=0;k--) {
if(!clave[i]&1<<k)
    salto++;
subc[l] <<=1;
if(numero & 1<<(k+23-salto))
    subc[l]++;
}
l++;
}
}

printf("\n");

for(i=0;i<n;i++) {
   for(j=0;j<n;j++)
      printf("%4d\n",subc[i*n+j]);
   //printf("\n");
}

for(i=0;i<(n*n-1);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-1);i++)
   printf("%4d\n",subc[i]);

for(i=0;i<(n*n-2);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-2);i++)
   printf("%4d\n",subc[i]);

for(i=0;i<(n*n-3);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-3);i++)
   printf("%4d\n",subc[i]);

free(subc);
}


esto es lo basico, solo saca por pantalla la secuencia generada.