lunes, 16 de marzo de 2020

JavaScript: cifrado César

Hoy veremos una manera sencilla de programar el cifrado César y evitarnos tener que cifrar y descifrar con lápiz y papel. Para ello, emplearé elementos muy mínimos de JavaScript, pero se podría replicar en cualquier otro lenguaje. Por supuesto, la manera que propongo aquí no es la única y es probable que no la mejor. Siéntete libre de sugerir modificaciones o mejoras.

En primer lugar, necesitamos tres valores: el texto que estamos utilizando, la clave (el número de letras que corremos) y si estamos cifrando o descifrando. Al primero, le vamos a asignar una variable llamada "text"; al segundo, "key"; y al tercero, "isCipher". Observamos que isCipher sólo puede tomar dos valores, verdadero o falso (si es verdadero, ciframos; y si no, desciframos).

Recordemos que el algoritmo del cifrado toma cada letra del mensaje y la mueve tantas letras en el alfabeto como le indica la clave. Por lo tanto, trabajaremos con cada letra del mensaje por separado. En otras palabras, iteraremos sobre la longitud de text. Nuestro programa empezaría así.

length = text.length;
for(i=0; i < length; i++){
   currentLetter = text.charAt(i);
   ...
}


Lo que estamos haciendo es recorrer el mensaje y tomar cada vez una letra, que guardamos en la variable "currentLetter". Para ello, hemos usado la función de JavaScript "charAt", que devuelve el carácter de un texto que ocupa una posición que le pasamos como parámetro. Por ejemplo, si text fuera "ABCDE", text.charAt(2) = "D", ya que normalmente en JavaScript la primera posición es la 0.

Ahora debemos ver qué posición ocupa esa letra dentro del alfabeto. Por lo tanto, necesitamos una variable "alphabet" inicializada al principio del programa de la siguiente manera:

var alphabet = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";

Y, ahora sí, podríamos continuar con lo que estábamos haciendo.

   index = alphabet.indexOf(currentLetter);

Hemos guardado la posición de la letra en el alfabeto en la variable "index". Por ejemplo, si la letra era "E", index vale 4 (recuerda que en JavaScript la primera posición, la "A", vale 0). Ahora, si estamos cifrando, tendremos que correr la letra hacia adelante; y si desciframos, hacia atrás. Tratemos el primer caso:

   if(isCipher){
      index = (index + key)%27;
      result += alphabet.charAt(index);
   }else{
      ...
   }


Hemos sumado los valores de index y la clave para ver cuál es la nueva posición. Si el resultado es mayor que 26, la instrucción "%27" ("módulo 27"), le resta 27 para que esté dentro de los límites del alfabeto. Esto es lo que hacíamos ayer: si corro dos posiciones la Z, llego a la B, pues supongo que el alfabeto es un círculo cerrado. Por último, vuelvo a usar alphabet y tomo el carácter que ocupa la posición que hemos calculado. Y añado esta letra al resultado.

Si en vez de cifrar, desciframos, el proceso es análogo, pero tenemos que restar la clave.

      index = index - key;
      if(index < 0){
         index += 27;
      }
      result += alphabet.charAt(index);


Las primeras líneas son para asegurarnos de que, como antes, el índice está dentro de los límites del alfabeto y no es un número negativo.

Y, con esto, completaríamos nuestro programa. Hemos hecho muchas simplificaciones implícitas por no complicar la comprensión del post. Algunas de ellas, las tengo en cuenta en el programa final que puedes ver en el código fuente de la página. Otras, como los acentos, no son complicadas de implementar y quedan como ejercicio para el lector.

Escribe el texto con el que quieras trabajar y la clave. También puedes decidir si quieres cifrarlo (deja la casilla marcada) o descifrarlo (desmarca la casilla).

TEXTO
CLAVE  CIFRAR




No hay comentarios:

Publicar un comentario