[C] Variación cifrado ROT.

Iniciado por The Swash, 3 Octubre 2011, 04:13 AM

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

The Swash

Buenas noches,
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 (cpp) [Seleccionar]
#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.