Cifra de Vigenère (vários caracteres) - GregorioFornetti/CriPython GitHub Wiki

Vídeo tutorial

Caso goste de assistir vídeos tutorias, clique aqui para assistir um vídeo sobre a cifra de Vigenère no modo vários caracteres.

Cifra de Vigenère - vários caracteres

Essa opção da cifra de Vignère ao invés de utilizar apenas o alfabeto e seus valores (A=0,B=1...) será utilizados mais caracteres para a criptografia (ao todo 668 caracteres). Esses caracteres possuem códigos que são definidos pela tabela unicode. Para encriptar uma mensagem, o caractere encriptado terá o valor igual a soma do valor do caractere da chave com o valor do caractere da mensagem atual.

OBS 1: Para fazer a tradução de uma mensagem, a chave será adaptada para que todos caracteres encriptados voltem ao seu normal, e para isso todos caracteres da chave adaptada serão iguais a 668 - valor do caractere da chave antiga (ou seja, cada letra nova da chave será o valor que faltava para o caractere da chave antiga completar 668). Isso funciona pois toda vez que um caractere "anda" 668 casas, ele volta a ser ele mesmo (toda vez que um novo valor passa do valor final, ele volta para o inicio, podendo assim voltar a ser ele mesmo).

OBS 2: Os valores que serão utilizados não serão exatamente iguais ao do unicode, já que existem alguns caracteres não imprimíveis. Esses valores passarão por um filtro que será explicado logo abaixo.

Filtros

Como pode ser visto na tabela unicode existem alguns caracteres que não podem ser imprimidos na tela (como por exemplo, os valores de 0 a 31 do unicode), o que resultaria em um problema na encriptação/tradução, já que alguns caracteres poderiam ser perdidos. Para resolver isso, eles são ignorados como valores possíveis, portanto, a contagem começa pelo espaço (primeiro caractere imprimível) que tem valor unicode igual a 32, porém, por ser o primeiro imprimível, terá o valor igual a 0 no programa. Ou seja, para saber qual é o valor atual da letra que está sendo lida, basta pegar o seu valor unicode e subtrair pelo número de caracteres não imprimíveis antes dela. EX: A letra "a" tem valor unicode igual a 97, porém, existem 32 caracteres não imprimíveis antes dele, portanto ele vale 65 nesse programa (97 - 32).

Exemplos de funcionalidade

EX 1: considerando a mensagem igual a "a" (valor = 65), e a chave igual a "!" (valor = 33 - 32 = 1), a mensagem encriptada será igual a "b" (valor = 65 + 1 = 66)

EX 2: considerando a mensagem igual a "a" (valor = 65), e a chave igual a "a" (valor = 65), a nova mensagem será igual a "Å" (valor = 197 = 97 + 97 - 34 - 32 - 1)

EX 3: Agora vamos fazer um exemplo de tradução. Considerando que a mensagem "a" (valor = 65) foi encriptada com a chave "!" (valor = 1) se transformando em "b", a chave de tradução será "˞˞"(668 - 1 = 667). Agora aplicando essa nova chave em "b", o valor calculado passa do valor máximo (667 + 66 = 733, que passou do limite de 667), portanto, é preciso que esse valor seja corrigido, e para isso, ele é subtraído por 668 para voltar para o início da contagem, resultando em "a" (733 - 668 = 65 = "a").

Chaves disponíveis

Qualquer tipo de texto será aceito como chave. Até mesmo textos com caracteres especias serão aceitos.

Algumas indicações

Para entender melhor essa opção de cifra, é interessante ler mais sobre a cifra de vigenere(apenas letras) para entender sobre o funcionamento geral da cifra. Além disso, é interessante olhar o código de implementação da cifra que está disponível no arquivo "cifra_de_vigenere.py" na pasta "Cifras".