Sei sulla pagina 1di 3

Curso de Ciência da Computação

Linguagens e Técnicas de Programação I


Trabalho prático para o 2º bimestre de 2002
Entrega até 15 de junho de 2002

Um fator decisivo para as vitórias durante as duas Grandes Guerras foi a adoção em massa de criptografia
para a comunicação entre a frente de batalha e os generais.

Uma das primeiras cifras criadas no século XX foi a ADFGVX que inclui técnicas de substituição1 e
transposição2. Criada pelos Alemães em 5 de março de 1918, foi usada primeiro na ofensiva de 21 de março
e, depois, em outras ofensivas até ser quebrada. A cifragem começa com uma grade de 6 x 6 (36 posições)
preenchida de forma aleatória com as 26 letras do alfabeto ocidental e mais 10 símbolos (números, caracteres
especiais ou o que for necessário para a mensagem que está sendo cifrada). As linhas e colunas da grade são
identificadas por uma das seis letras (A, D F, G, V, X). O preenchimento da grade é parte da chave e
condição necessária (porém não suficiente) para o destinatário decifrar as mensagens.

A D F G V X
A 8 p 3 d 1 n
D l t 4 o a h
F 7 k b c 5 z
G j u 6 w g m
V x s v i r 2
X e y 0 f q

O primeiro estágio da cifragem é pegar cada letra da mensagem (texto aberto), localizá-la na grade e
substituí-la pelas letras que rotulam sua linha e coluna. Por exemplo, 8 será substituído por AA; p por AD e
assim por diante. Por exemplo, a frase “o rei está morto” será codificado como:

Texto aberto o r e i e s t a m o r t o
Estágio 1 DG XA VV XD VG XA XD VD DD DV XA GX DG VV DD DG

Até esse ponto, temos uma cifra de substituição monoalfabética onde um exame simples de freqüência3 seria
suficiente para quebrá-la.

Contudo, o segundo estágio da criptografia consiste numa transposição, que torna a criptoanálise muito mais
difícil. A transposição depende de uma palavra chave, por exemplo, BOLA. Se houver letras repetidas na
palavra chave, considere cada letra apenas uma vez (e.g., SACOLA vira SACOL; CRACHÁ vira CRAH). A
forma como os símbolos foram dispostos na matriz 6 x 6 e a palavra-chave formam condição sine qua non
para decifrar a mensagem.

A transposição é feita da seguinte forma: primeiro as letras da palavra-chave são escritas na linha de topo de
uma nova grade. Em seguida, o texto cifrado no primeiro estágio é escrito embaixo, em uma série de linhas.
As colunas são reordenadas para que as letras da palavra-chave fiquem em ordem alfabética. Por fim, o texto

1
Sistema de cifragem no qual cada letra da mensagem é substituída por outro valor, mas retém sua posição dentro do
texto, ou seja um A no texto aberto permanece na mesma posição mas, eventualmente muda de valor para, por
exemplo, C
2
Sistema de cifragem no qual cada letra de uma mensagem muda de posição dentro do texto, mas não muda de valor,
ou seja, um A no texto aberto vira A no texto cifrado, apenas mudando de lugar.
3
Técnica de criptoanálise que tenta decifrar um texto pela substituição do símbolo mais comum no texto cifrado pelo
símbolo mais comum no alfabeto utilizado para escrever o texto original. Por exemplo, em inglês a letra mais
freqüente é “e”, e o símbolo mais freqüente no texto cifrado seria substituído pela letra “e”.
cifrado é obtido pela leitura de cada uma das colunas nessa ordem. Se sobrarem posições no quadro, elas são
preenchidas com pares de letras correspondentes a símbolo aleatórios da matriz 6 x 6. Por exemplo.

B O L A A B L O
D G X A A D X G
V V X D D V X V
V G X A A V X G
X D V D  D X V D
D D D V V D D D
X A G X X X G A
D G V V V D V G
D D D G G D D D

O texto cifrado final (ADADVXVGDVVXDXDDXXXVDGVDGVGDDAGD), era então transmitido em


código Morse. Como o texto cifrado é composto apenas por seis letras, uma tentativa de quebra do código
por análise de freqüência simples seria inútil4. A escolha das letras (ADFGVX) tem por base a diferença que
há entre elas no código Morse, tornando virtualmente impossível transmitir a mensagem codificada com
algum erro gerado pelo operador do transmissor Morse.

Em 2 de junho, o tenente francês George Paivin conseguiu descobrir o funcionamento da cifra e, com isso
decodificar as mensagens dos alemães, encerrando um ciclo de alguns meses de comunicação perfeitamente
segura entre os alemães, onde eles puderam avançar sem se preocupar com os inimigos, como mostram
algumas das mensagens decodificadas.

Suas tarefas
1. Definir um algoritmo capaz de cifrar um texto ou decifrá-lo utilizando a cifra ADFGVX. A massa de
texto (cifrada ou aberta) e a chave utilizada serão fornecidas através de um arquivo texto; a saída do
programa também deve ser feita para um arquivo texto;
2. Escrever o programa em ANSI C correspondente ao algoritmo pedido na questão 1.

Observações gerais e recomendações de implementação


O arquivo a ser cifrado ou decifrado deve ser passado ao programa como um parâmetro de linha de
comando, como mostra o exemplo:

[dclobato @servlinux ~$] cifra arquivo.in


[dclobato @servlinux ~$]

O arquivo a ser processo pelo programa deve ter o seguinte formato (arquivo.in no exemplo acima):

1
cifra.out
8p3d1nlt4oah7kbc5zju6wgmxsvir2 ey0fq
BOLA
O rei esta morto
FDM

A primeira linha contém o valor 1 ou 0, indicando respectivamente se o texto deve ser cifrado ou decifrado.
A segunda linha do arquivo contém o nome do arquivo que deve ser gerado pelo programa, de acordo com o
modelo que será apresentado a seguir. A terceira linha contém as letras e símbolos que devem ser usados
para o preenchimento da matriz 6 x 6; o primeiro símbolo corresponde ao elemento na posição AA, o
segundo ao da posição AD, e assim por diante. A quarta linha contém a palavra que será usada no segundo

4
É possível quebrar a cifra através de uma análise de freqüência modificada
estágio da cifragem ou decifragem. É possível utilizar palavras de qualquer tamanho, contendo apenas as 26
letras do alfabeto.

As linhas seguintes contêm a mensagem; as linhas devem ser processadas até que seja encontrada uma linha
contendo, apenas, as letras “FDM”, que indicam final da mensagem. Essa linha não deve ser cifrada ou
decifrada.

Abaixo, o modelo do arquivo de saída, produzido para o arquivo de entrada apresentado anteriormente.

Texto cifrado produzido em 10/06/2002 as 03:23


--- Inicio da mensagem
ADADVXVGDVVXDXDDXXXVDGVDGVGDDAGD
--- Fim da mensagem

A primeira linha contém a mensagem “texto cifrado (ou decifrado) produzido em” seguido da data e hora em
que o arquivo foi gerado. A segunda linha contém um delimitador para indicar onde começa a mensagem
cifrada ou o texto aberto. As linhas seguintes contêm as linhas cifradas ou decifradas informadas no arquivo
de entrada. Por fim, a última linha contém um delimitador indicando final de mensagem.

Seu programa deve ser capaz de manipular qualquer massa de texto que esteja em conformidade com o
modelo apresentado, independente do número de linhas ou tamanho da palavra utilizada no segundo estágio
da cifragem ou decifragem.

Para ordenar as letras da palavra usada no segundo estágio da cifragem, você pode utilizar o algoritmo de
Bubble Sort, codificado na função em ANSI C abaixo:

void BubbleSort (char[], int);

void BubbleSort (char x[], int limite)


{
int i, j, troca;
char z;

limite--;
troca = 1;
for (i = 0; (i < limite) && (troca != 0); i++)
{
troca = 0;
for (j = 0; j < (limite - i); j++)
if (x[j] > x[j + 1])
{
troca = 1;
z = x[j + 1];
x[j + 1] = x[j];
x[j] = z;
}
}
}

Essa função recebe um vetor de caracteres e um inteiro que indica quantos caracteres há na cadeia. Por
exemplo, se a palavra escolhida para o segundo estágio for BOLA, a função deve ser chamada como
BubbleSort(estagio2, 4), supondo que a palavra (já sem as letras repetidas!) está armazenada na variável
estagio2.

Potrebbero piacerti anche