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
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
#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;
}