Criptografia – Cifra de Vigenère

Cifra de Vigenère

A cifra de Vigenère é uma técnica de criptografia por substituição polialfabética que utiliza uma série de cifras de César diferentes, baseadas nas letras de uma palavra-chave.

Esse método de criptografia foi descrito originalmente pelo criptologista italiano Giovan Battista Bellaso em um livro de 1553 de nome “La cifra del. Sig. Giovan Battista Bellaso”. Curiosamente, o método foi atribuído posteriormente – e de forma errônea – a Blaise de Vigenère no século XIX, e por isso é conhecida até os dias de hoje por “Cifra de Vigenère”.

Trata-se de uma cifra muito simples de entender, implementar e até mesmo quebrar, mas mesmo assim três séculos se passaram até que alguém conseguisse quebrá-la (decifrar mensagens). Chegou a receber a alcunha de “le chiffre indéchiffrable” (“A cifra indecifrável”, em francês). Um método geral de decifrá-la foi publicado pelo criptógrafo e arqueólogo alemão Friedrich Kasiski em 1863 apenas.

Funcionamento da cifra

Essa cifra consiste em várias cifras de César utilizadas em sequência, com valores de deslocamento diferentes e obtidos a partir de uma palavra-chave (uma espécie de “senha”).

A cifragem é realizada com o uso de uma tabela de alfabetos, denominada tabula recta, ou “quadrado de Vigenère”, que consiste no alfabeto escrito 26 vezes em linhas diferentes, cada um deslocado ciclicamente para a esquerda comparado com o alfabeto anterior, de forma a corresponder às 26 cifras de César possíveis. Durante o processo de criptografia, a cifra usa um alfabeto diferente de uma das linhas, e o alfabeto a ser utilizado em cada ponto depende da palavra-chave, que é repetida caso a mensagem a ser cifrada seja maior do que ela.

Quadrado de Vigenère

A figura a seguir mostra um quadrado de Vigenère, com as combinações de alfabetos

Quadrado de Vigenère

By Brandon T. Fields (cdated) – Based upon Vigenere-square.png by en:User:Matt Crypto. This version created by bdesham in Inkscape, and modified by cdated to include visual guides. Public Domain, https://commons.wikimedia.org/w/index.php?curid=15037524

Exemplo:
Vamos encriptar a frase “Adoro programar”, usando como palavra-chave a palavra “python”. A palavra-chave deve ser repetida até completar o comprimento da mensagem a ser enviada, da seguinte forma:

Mensagem: adoro programar
Palavra-chave: pytho npythonpy
Texto cifrado: pbhyc cgmzyozpp

A primeira letra do texto, que é a letra “a”, é cifrada com o alfabeto da linha “p”, que é a primeira letra da palavra-chave. Procuramos a letra na linha p que esteja na coluna a, que no caso é a letra “p”. Esta será a primeira letra do texto cifrado.

Passando para a segunda letra do texto normal, que é “d”, procuramos a linha correspondente à letra “y”, segunda letra da chave, e localizamos a letra que esteja na intersecção dessa linha com a coluna da letra procurada, d. No caso, a letra é “b”, segunda letra do texto cifrado.

E assim sucessivamente, até o final da cifragem.

Para decriptar o texto, vamos à tabela na linha correspondente à chave, encontramos a letra do texto cifrado na linha, e então usamos o rótulo da coluna como texto plano (decriptado). No exemplo acima, na linha p (de python), a letra P do texto cifrado (primeira letra), aparece na coluna A, que é então a primeira letra do texto decifrado. Na linha da segunda letra da chave, y, encontramos a segunda letra do texto cifrado, b, que corresponde à coluna D – esta é a segunda letra do texto original – e assim sucessivamente até o final.

Podemos testar a cifra de Vigenère usando uma ferramenta online para cifragem e decifragem no site:  http://www.vigenere.net/

Outro site muito interessante, que permite decifrar textos cifrados em Vigenère escolhendo idiomas-alvo (inglês, alemão ou espanhol) é o www.guballa.de/vigenere-solver

Anterior: Cifra de César

Próximo: Técnica de criptografia One Time Pad

Sobre Fábio dos Reis (1223 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

1 Comentário em Criptografia – Cifra de Vigenère

  1. DOUGLAS LANDIM // 23/11/2017 em 21:23 // Responder

    #include
    #include
    #define MAX 200

    int main()
    {
    //variaveis de entrada
    char texto_claro[MAX];
    printf(“\n Escreva o texto claro: “);
    gets(texto_claro);
    strlwr(texto_claro);
    char chave[MAX];
    printf(“\n Escreva a chave: “);
    gets(chave);
    strlwr(chave);
    //variaveis internas do programa
    //contadores
    int i,j,
    //medidas de tamanho
    m = strlen(texto_claro),
    m2 = strlen(chave),n,
    //ids, são inteiros que correspondem aos valores ascii dos chars
    id_texto, id_chave, id_texto_cifrado, id_texto_descifrado;

    //variaveis de saida
    char texto_cifrado[m],texto_descifrado[m];

    //Criptografando
    printf(“\n Frase cifrada: \n”);
    for(i = 0,j=0; i subtrai 97 do range de contagem das letras, que vai de 0 a 25 ao invés de 97 a 122 do ascii
    id_chave = chave[j % m2] – ‘a’;// mesmo processo
    id_texto_cifrado = ((id_texto + id_chave )%26) + ‘a’; //volta o id calculado ao range normal da tabela ascii
    texto_cifrado[i] = id_texto_cifrado;
    j++;
    }else texto_cifrado[i] = texto_claro[i]; //copia os espaços
    }
    puts(texto_cifrado);

    //Descriptografando
    printf(“\n Frase descifrada: \n”);
    for(i = 0,j=0; i subtrai 97 do range de contagem das letras, que vai de 0 a 25 ao invés de 97 a 122 do ascii
    id_chave = chave[j % m2] – ‘a’;// mesmo processo
    if(id_texto >= id_chave)
    id_texto_descifrado = ((id_texto – id_chave)) + ‘a’; //subtrai o valor da chave do valor do texto, e soma ‘a’ para voltar o id calculado ao range normal da tabela ascii
    else id_texto_descifrado = ‘z’ + ((id_texto – id_chave)) + 1; //a subtração da linha acima passou do a, e o valor da negativo, então ele volta do z pra trás e soma 1 pq o valor 0 tem q ser contado
    texto_descifrado[i] = id_texto_descifrado;
    j++;
    }else texto_descifrado[i] = texto_cifrado[i]; //copia os espaços
    }
    puts(texto_descifrado);
    return 0;
    }

Escreva um comentário

Seu e-mail não será divulgado


*