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?
#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);
}
esta es una version algo primitiva pero hace precisamente lo que dije