Cifrado de Vigenère

El cifrado de Vigenère es un cifrado basado en diferentes series de caracteres o letras del cifrado César formando estos caracteres una tabla, llamada tabla de Vigenère, que se usa como clave. El cifrado de Vigenère es un cifrado por sustitución simple polialfabético.

Cuadro de Vigènere con las 27 letras del español

El cifrado de Vigenère se ha reinventado muchas veces. El método original fue descrito por Giovan Battista Belasso en su libro de 1553 La cifra del Sig. Giovan Battista Belasso. Sin embargo, fue incorrectamente atribuido más tarde a Blaise de Vigenère, concretamente en el siglo XIX, y por ello aún se le conoce como el "cifrado de Vigenère".

Este cifrado es conocido porque es fácil de entender e implementar, además parece irresoluble; esto le hizo valedor del apodo el código indescifrable (le chiffre indéchiffrable, en francés).

Historia

El primer cifrado polialfabético fue el llamado cifrado de Alberti, creado por Leon Battista Alberti hacia 1467. Para facilitar los cálculos se aprovechaba de un disco de metal que permitía cambiar fácilmente entre los diferentes alfabetos disponibles. El sistema de Alberti solo cambiaba entre alfabetos después de muchas palabras, y los cambios se indicaban escribiendo la letra del correspondiente alfabeto en el mensaje cifrado. Más tarde, en 1508, Johannes Trithemius, en su trabajo Poligraphia, inventó la tabula recta, que es básicamente la tabla de Vigenère. Trithemius, sin embargo, solo proporcionó un sistema de cambio progresivo, rígido y predecible entre alfabetos.

Lo que ahora se le conoce como el cifrado de Vigenère, fue originalmente descrito por Giovan Battista Belasso en su mencionado libro de 1533, quien construyó el cifrado basándose en la tabula recta de Trithemius, pero añadió una clave repetida para cambiar cada carácter entre los diferentes alfabetos.

Blaise de Vigenère publicó su descripción de un cifrado de autoclave parecido, pero más robusto, antes del reinado de Enrique III de Francia, en 1586. Más tarde, en el siglo XIX, la invención del cifrado dejó de atribuirse a Vigenère.

El cifrado de Vigenère ganó una gran reputación por ser excepcionalmente robusto. Incluso el escritor y matemático Charles Lutwidge Dodgson (Lewis Carroll) dijo que el cifrado de Vigenère era irrompible en un artículo titulado "The Alphabet Cipher" para una revista infantil. En 1917, la revista Scientific American afirmó que el cifrado de Vigenère era imposible de romper. Esta reputación era inmerecida, considerando que el método Kasiski resolvió el cifrado en el siglo XIX, y que algunos criptoanalistas habilidosos pudieron romper ocasionalmente el cifrado en el siglo XVI.

A lo largo del siglo XIX, se propusieron distintas variaciones sobre este sistema, pero que no incrementaban significativamente la seguridad y presentaban similares vulnerabilidades; entre estas estaban las siguientes:[1]

  • Método de Auray
  • Método de Beaufort
  • Método de Gronsfeld

Gilbert Vernam trató de arreglar el cifrado (creando el cifrado Vernam-Vigenère en 1918), pero a pesar de sus esfuerzos, el cifrado sigue siendo vulnerable al criptoanálisis.

Funcionamiento

mensaje:      P A R I S  V A U T  B I E N  U N E  M E S S E
clave:        L O U P L  O U P L  O U P L  O U P  L O U P L 
criptograma:  A O M X D  K U K E  P C T X  J H T  W S N I O

En este alfabeto solo existen 27 letras:

A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

En términos matemáticos, puede expresarse la función de cifrado como:

Donde es la letra en la posición del texto a cifrar, es el carácter de la clave correspondiente a , pues se encuentran en la misma posición, y es el tamaño del alfabeto. En este caso .

Para descifrar realizamos la operación inversa:

Cuando

Cuando

Donde es el carácter en la posición del texto cifrado, viene siendo el carácter de la clave correspondiente a , y el tamaño del alfabeto.

Se observa que a una misma letra en el texto plano le pueden corresponder diferentes letras en el texto cifrado.

Código en Batch para Windows

Un ejemplo para usar se debe guardar como .cmd para ejecutar el programa y ver su funcionamiento.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
title VIGENERE (Batch limpio)

rem === AJUSTES ===
set "ALPH=abcdefghijklmnopqrstuvwxyz"   rem Cambia por abcdefghijklmnñopqrstuvwxyz si quieres «ñ»

echo Key:
set /p "KEY=> "
echo Plaintext (mensaje):
set /p "PLAINTEXT=> "

rem Longitudes
call :strLen KEY KLEN
call :strLen PLAINTEXT PLEN

set "OUT="
set /a J=0

for /l %%I in (0,1,!PLEN!-1) do (
    set "CH=!PLAINTEXT:~%%I,1!"
    call :idx "!CH!" PPOS
    if not defined PPOS (
        rem Carácter fuera del alfabeto: se pasa tal cual
        set "OUT=!OUT!!CH!"
    ) else (
        rem Tomar letra de la llave correspondiente (solo avanza en letras)
        set /a R=J%%KLEN
        call set "KCH=%%KEY:~!R!,1%%"
        call :idx "!KCH!" KPOS

        rem (ppos + kpos) mod 26  -> letra cifrada
        set /a EPOS=(PPOS+KPOS)%%26
        call :char !EPOS! ECH
        set "OUT=!OUT!!ECH!"
        set /a J+=1
    )
)

echo(
echo Ciphertext:
echo !OUT!
echo(
pause
exit /b

rem ----- Funciones -----

:strLen  varName  retVar
setlocal DisableDelayedExpansion
set "s=!%~1!"
set len=0
if defined s (
  for /f "delims=:" %%N in ('"(cmd /v:on /c echo(!s!&echo()|findstr /o ^^")') do set /a "len=%%N-3"
)
endlocal & set "%~2=%len%"
exit /b

:idx  char retVar
rem Devuelve posición 0..(N-1) en ALPH o deja vacío si no pertenece
setlocal EnableDelayedExpansion
set "c=%~1"
set "c=!c:~0,1!"
for /l %%P in (0,1,25) do (
  if /I "!ALPH:~%%P,1!"=="!c!" (
    endlocal & set "%~2=%%P" & exit /b
  )
)
endlocal & set "%~2=" & exit /b

:char index retVar
setlocal EnableDelayedExpansion
set "c=!ALPH:~%~1,1!"
endlocal & set "%~2=%c%"
exit /b

Ejemplo código en C

#include <ctype.h>
#include <stdio.h>
#include <string.h>
void cifrarVigenere(char* texto, char* clave) {
    int textoLen = strlen(texto), claveLen = strlen(clave), i, j;
    char nuevaClave[textoLen], cifradoTexto[textoLen];
    // Generar nueva clave en caso de que la longitud del texto original y la clave no coincidan
    for(i = 0, j = 0; i < textoLen; ++i, ++j){
        if(j == claveLen)
            j = 0;
        nuevaClave[i] = clave[j];
    }
    nuevaClave[i] = '\0';
    // Cifrado
    for(i = 0; i < textoLen; ++i)
        cifradoTexto[i] = ((texto[i] + nuevaClave[i]) % 26) + 'A';
    cifradoTexto[i] = '\0';
    printf("Texto cifrado: %s\n", cifradoTexto);
}
int main() {
    char texto[] = "TEXTOPLANO";
    char clave[] = "CLAVE";
    cifrarVigenere(texto, clave);
    return 0;
}

Vulnerabilidades

Las principales vulnerabilidades del método de Vigenère derivan de su regularidad. Al proponer una serie de cifras cíclicas, el analista simplemente tiene que buscar una serie de grupos de letras que se repitan periódicamente. Al comparar las distintas repeticiones, puede deducir el número de letras de la clave, tras lo cual basta con separar esos alfabetos distintos y aplicar el análisis de frecuencias a cada uno de esos alfabetos (Método Kasiski).

Otra posibilidad sería aplicar el índice de coincidencia para encontrar el número de letras de la clave.

Véase también

Enlaces externos

Referencias

  1. J. G. Carmona, Tratado de criptografía con aplicación especial al ejército, Ministerio de Defensa, 2011.