Introdução §
A cifra Enigma era uma cifra de campo usada pelos alemães durante a Segunda Guerra Mundial. O Enigma é uma das mais conhecidas máquinas de encriptação histórica, e na verdade refere-se a uma gama de máquinas cifradoras semelhantes. A primeira máquina Enigma foi inventada por um engenheiro alemão chamado Arthur Scherbius no final da primeira guerra mundial. Foi usada comercialmente a partir do início dos anos 20, e também foi adotada pelos serviços militares e governamentais de várias nações – a mais famosa pela Alemanha nazista antes e durante a Segunda Guerra Mundial. Uma variedade de modelos diferentes de Enigma foram produzidos, mas o modelo militar alemão, o Wehrmacht Enigma, é a versão mais comumente discutida.
Se você gostaria de criptografar algumas de suas próprias mensagens Enigma, dê uma olhada no exemplo javascript.
O Algoritmo §
Esta seção falará sobre o Enigma I, também conhecido como Wehrmacht Enigma, outras variantes são similares em operação. A ‘chave’ para o Enigma consiste em vários elementos:
- Os rotores e sua ordem
- As posições iniciais do rotor
- As configurações dos anéis de partida
- As configurações dos anéis de partida
- Steckerverbindungen, ou configurações do Plug Board
Para informações sobre os procedimentos usados pelos alemães durante a Segunda Guerra Mundial ao enviar mensagens Engima, incluindo como os indicadores foram definidos, veja esta descrição.
Os Rotores §
Partir do princípio que os nossos rotores estão I,II,III movendo-se da esquerda para a direita, e estamos tentando decifrar a letra ‘A’. Vamos assumir por agora que como a letra ‘A’ é cifrada cada rotor está na sua posição inicial (‘AAA’). Como os nossos rotores são I,II,III movendo-se da esquerda para a direita, o caracter A passará primeiro pelo rotor III. Cada rotor aplica uma simples operação de substituição. A tabela de substituição do rotor III pode ser vista abaixo.
ABCDEFGHIJKLMNOPQRSTUVWXYZBDFHJLCPRTXVZNYEIWGAKMUSQO
B é substituído por D, C é substituído por F, etc. Assim, depois que a letra ‘A’ passa pelo rotor, ela resulta como um ‘B’. A letra ‘B’ é agora introduzida através do rotor II, onde é substituída por ‘J’, etc. Isto é melhor ilustrado usando uma tabela (para uma descrição completa das ligações do rotor para cada rotor, veja esta página wikipedia):
III | II | I | Reflector | inv(I) | inv(II) | inv(III) | A -> B | B -> J | J -> Z | Z -> T | T -> L | L -> K | K -> U |
Após a letra passar pelos rotores III,II,I depois atinge o refletor e passa por outra simples substituição. Após sair do refletor, a letra é enviada de volta através dos rotores no sentido inverso (isto significa que a substituição inversa é aplicada). Podemos ver na tabela que após a letra cifrada voltar a sair do rotor III no final, ficamos com a letra U. Um passo importante que ainda não mencionei é o fato de que os rotores aumentam antes de cada letra ser cifrada. Se as posições iniciais dos rotores são ‘FEQ’, então eles serão primeiro incrementados para ‘FER’ antes da primeira letra ser cifrada.
Incrementing The Rotors §
Um erro comum ao implementar o enigma é assumir que os rotores agem como um odômetro padrão, existem no entanto algumas diferenças chave. Cada rotor tem um entalhe que faz com que o rotor se desloque à sua esquerda. O rotor I faz com que o próximo rotor pise na transição de Q para R, o rotor II na transição de E para F, etc. Rotores I até V são utilizados no enigma Wermacht, mais tarde foram adicionados mais rotores que tinham dois entalhes.
I | II | III | IV | V | V | VI | VII | VIII |
Q | E | V | J | Z | Z,M | Z,M | Z,M |
Existe um detalhe extra confuso, o de ‘passo duplo’. Quando um rotor pisa, ele também faz com que o terotropo passe para o seu direito de pisar. Isto não é notado quando o segundo rotor pisa, uma vez que o primeiro rotor pisa todas as teclas. No entanto, quando o 3º (mais à esquerda) passo de rotor, faz com que o segundo rotor também pise. Isto significa que o período de máquinas não é 26x26x26, mas apenas 26x25x26.
O Ringstellung §
O Ringstellung (ajustes de anel) são geralmente fornecidos como uma string de 3 letras, por exemplo, ‘FAM’ (ou alternativamente como números entre 1 e 26, representando as letras). Na discussão anterior eu assumi que a cifra de substituição simples de cada rotor foi fixada. Os anéis de comando fornecem a capacidade de deslocar as cifras de substituição que se seguem. Com um anel de ‘A’ (ou 1), a substituição do rotor I se parece com isto:
ABCDEFGHIJKLMNOPQRSTUVWXYZEKMFLGDQVZNTOWYHXUSPAIBRCJ
Com um anel de ‘B’ (ou 2), a substituição do rotor I se parece com isto:
ZABCDEFGHIJKLMNOPQRSTUVWXYEKMFLGDQVZNTOWYHXUSPAIBRCJ
The Steckerverbindungen §
The steckerverbindungen (plugboard) é uma camada adicional de segurança que consiste em 13 fios que se conectam em soquetes na parte frontal da máquina enigma.Cada fio liga 2 letras, por exemplo, P a O. Estes emparelhamentos são especificados como parte do material chave. Quando uma letra é digitada, antes de entrar no primeiro rotor, ela passa pela substituição de acordo com a placa de encaixe, depois que a letra sai, ela é colocada novamente através da substituição da placa de encaixe antes da saída. Um exemplo de configuração da placa de encaixe é o seguinte: PO ML IU KJ NH YT GB VF RE AC (Isto significa que P e O são trocados, M e L são trocados, etc.).
Se usarmos o exemplo acima onde a letra ‘A’ foi encriptada com os rotores I, II e III com as posições iniciais AAA, tivemos a letra A encriptada como um U. Se agora levarmos em conta a Plugboard, usando as configurações da Plugboard no parágrafo anterior, o ‘A’ é primeiro traduzido para um ‘C’ antes da encriptação. O ‘C’ é traduzido como um ‘J’. Esta letra é então encaminhada através do plugboard novamente para ser substituída por ‘K’. Então agora temos um ‘A’ sendo listrado como um ‘K’ com o plugboard em uso. O plugboard aumenta significativamente a força da cifra enigma como um todo, mais do que adicionar outro rotor poderia.
Javascript Example §
Plaintext
key settings:
Configurações do anel:
Rotores:
Configurações do Plug board:
Configurações do Plug board:
Ciphertext
Outras Implementações §
Para cifrar suas próprias mensagens em python, você pode usar o módulo pycipher. Para instalá-lo, utilize o pip install pycipher. Para cifrar mensagens com a cifra Enigma (ou outra cifra, veja aqui a documentação), veja o exemplo aqui.
Cryptanalysis §
Para algum código para quebrar automaticamente mensagens Enigma veja Cryptanalysis of Enigma.
Muito trabalho foi feito para quebrar Enigma, alguns métodos como rodding e buttoning up foram usados durante a segunda guerra mundial, mas requerem ‘berços’, ou pedaços conhecidos de texto em quadrado. Estes métodos são discutidos na página wikipedia.
Outras abordagens modernas incluem o artigo de Jim Gillogly ‘Ciphertext only Cryptanalysis of the Enigma’. Uma carta de acompanhamento corrigindo alguns erros no artigo pode ser encontrada aqui. Outro trabalho que se baseia no trabalho de Jim Gillogly é ‘Aplicando Técnicas de Reconhecimento de Linguagem Estatística no Texto Cifráfico apenas Criptanálise do Enigma’ de Heidi Williams. Outro recurso interessante é The Cryptographic Mathematics of Enigma.