Creo que a Zero le había comentado de mi idea de darle una pequeña variación al cifrado ROT común.
Idea:
- Utilizar una contraseña numérica con la cual se hará la rotación.
- Se operará en bloques igual a la longitud de números de la contraseña.
- Individualmente actuará cada número a la hora de cifrar.
- Si el dígito actual es menor que 5 se suma, de lo contrario se resta.
- El tercer parámetro es para evitar prácticamente replicar la función para descifrar.
Les dejo un pequeño ejemplo, lo pueden adaptar y optimizar. Si quieren adaptarlo a binarios deberán añadir comprobación del límite ASCII y no usar strlen.
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> char * ROTPassword(char * String, int password,int descifrar); int main() { printf("%s ", ROTPassword("hsec",152,0)); printf("%s ", ROTPassword("jnfe",152,1)); getchar(); return 0; } char * ROTPassword(char * String, int password, int descifrar) { int array[10] = {0}; int passcopy = password, counter = 0,i,strlength, passlength = 0; char * cifrado; strlength = strlen(String); while(passcopy >= 1) { array[counter] = (passcopy % 10); passcopy /= 10; counter++; } cifrado = (char*) malloc(strlength+1); memset(cifrado,0,strlength+1); for (i = 0; i < strlength; i++) { if (array[passlength] < 5) { (descifrar == 1)?cifrado[i] = String[i] - array[passlength]: (cifrado[i] = String[i] + array[passlength]); } else { (descifrar == 1)?cifrado[i] = String[i] + array[passlength]: (cifrado[i] = String[i] - array[passlength]); } passlength++; if (passlength >= counter) passlength = 0; } return cifrado; }
Un saludo, Gracias Zero.