#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>
// constantes
#define numero_de_letras 27
// variables globales
double claves[numero_de_letras][1000];
int clave[numero_de_letras];
// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];
// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
double aleatorio_cifras(int);
void cifrar(int, int, char []);
void descifrar(int, char []);
int main() {
generar_clave(8);
arrancar_motor(8, 20);
cifrar(8, 20, "hola esto es una prueba de un texto cifrado");
descifrar(8, cifrado);
printf("El mensaje descifrado es:\n\n %s \n", descifrado
);
}
// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {
int x;
int y;
for(x=0; x<numero_de_letras; x++) {
for(y=0;y<1000;y++) {
if (numero==matriz[x][y]) {
return 1;
}
}
}
return 0;
}
// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){
int x;
for(x=0; x<numero_de_letras;x++) {
if(numero==vector[x]) {
return 1;
}
}
return 0;
}
// Devuelve la suma de las cifras de un numero
int suma(double numero) {
int resultado=0;
while (numero>0) {
resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}
//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {
return rand () % (max
-min
+1) + min
;
}
//Genera un numero aleatorio de x cifras
double aleatorio_cifras(int cifras) {
int x;
int random;
char aux[2];
char num[cifras];
num[0]=0;
for(x=0; x<cifras; x++){
if((random==0) && (x==0)) { x--; continue; }
}
}
//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {
int maximo, minimo, x, y, num_random;
int max=120;
int min=60;
maximo=numero_suma*max/20;
minimo=numero_suma*min/20;
for(x=0;x<numero_de_letras;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}
printf("se ha generado la clave: \n"); for(y=0;y<numero_de_letras;y++) {
}
}
// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {
int x;
for(x=0;x<numero_de_letras;x++) {
clave[x]=array[x];
}
}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){
int y, z, h;
double num_random;
for(z=0; z<numero_de_letras; z++) {
printf("Inicializando letra %c\n", letras
[z
]); for(h=0; h<cantidad_numeros;) {
num_random=aleatorio_cifras(numero_cifras);
if (((fabs(suma
(num_random
)-clave
[z
])) < 0.00001) && (comprobar_repetir_matriz
(num_random
, claves
))==0) {
claves[z][h]=num_random;
printf("%.0lf\n", num_random
); h++;
} else { continue; }
}
}
printf("se ha generado la clave: \n"); for(y=0;y<numero_de_letras;y++) {
}
printf("\ncon un numero de cifras de %d\n", numero_cifras
); }
// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
int letra, letrass, x;
char cifrado_inside
[strlen(texto
)*numero_cifras
]; cifrado_inside[0] = 0;
char string_auxiliar[numero_cifras+1];
for(letra
=0; strlen(texto
)>letra
; letra
++) {
for(letrass=0; letrass<numero_de_letras; letrass++) {
if (texto[letra]==letras[letrass]) {
sprintf(string_auxiliar
, "%.0lf", claves
[letrass
][(int)(aleatorio
(cantidad_numeros
-1, 0))]); strcat(cifrado_inside
, string_auxiliar
); break;
}
}
}
strcpy(cifrado
, cifrado_inside
);
}
// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {
char auxiliar[numero_cifras];
int x, y=0, z;
for(x=0; x<strlen(cifrado); x++) {
auxiliar[y]=cifrado[x];
y++;
if(y==numero_cifras) {
for(z=0; z<numero_de_letras; z++) {
if(fabs(suma
(atof(auxiliar
))-clave
[z
]) < 0.00001) {
// printf("\n%d\n", suma(atof(auxiliar)));
descifrado
[strlen(descifrado
)]=letras
[z
]; y=0;
break;
}
}
}
}
}