ALGORITMOS BÁSICOS EM CRIPTOGRAFIA
Rafael Antonio da Silva Rosa (IC)
Instituto Tecnológico de Aeronáutica (ITA)
Pça. Mal. Eduardo Gomes, 50, Vila das Acácias, 12228-901, S. José dos Campos – SP
[email protected]
Antonio Cândido Faleiros (PQ)
Instituto Tecnológico de Aeronáutica (ITA)
Divisão de Ensino Fundamental
[email protected]
RESUMO
Devido ao nível avançado da criptografia atual, faz-se necessária a possibilidade de se operar com
números relativamente grandes, mas para isso deve ter uma estrutura de dados para tal. Esse foi o
enfoque principal deste trabalho, juntamente com a elaboração de funções de operações utilizando
essa estrutura. Posteriormente, a titulo de exemplificação, estudou-se e simulou-se a máquina
criptográfica Enigma, importante arma alemã na Segunda Guerra Mundial.
ABSTRACT
Because of advanced level of present criptography, operations with large numbers are necessary, but
one should have a data structure. That was our main goal, together with the elaboration of functions
which utilize it.As an example, it is studied and simulated the criptographic machine Enigma,
important German device in the Second World War.
1. INTRODUÇÃO
Nos dias de hoje, com a ampliação das comunicações via Internet, a questão de segurança dos
dados transmitidos tem se mostrado crucial. A cada dia que passa, amplia -se o número de pessoas
dedicadas ao estudo e desenvolvimento de técnicas que têm por finalidade proteger a informação. Uma
das técnicas a nossa disposição para garantir a integridade dos dados é justamente a criptografia, unida
aos diversos protocolos desenvolvidos para assegurar uma comunicação sem interferências indevidas e
não autorizadas. Apesar disso, a criptografia é, provavelmente, tão antiga quanto a própria escrita.
Entretanto, só recentemente, se tornou alvo de extenso estudo científico.
Esse assunto tem se tornado cada vez mais importante e já existem restrições para a venda de
programas que realizam uma criptografia segura. Trata-se, portanto, de um assunto emergente e
urgente para ser estudado e desenvolvido aqui em nosso país, com o intuito de evitar a dependência de
produtos cujo fornecimento pode ser descontinuado a qualquer momento.
Nesse trabalho, foi proposto primordialmente o desenvolvimento de uma série de algoritmos
que deveriam ser implementados em forma de programas em linguagem C, necessários para a
execução de criptografia de textos e de dados, também em linguagem C. Numa etapa inicial, a
proposta foi o estudo de alguns algoritmos básicos e, logo após, o início de suas respectivas
implementações:
· operações de expansão e redução;
· operações de adição, subtração e multiplicação de números inteiros;
· aritmética modular: módulo de Barret;
·
·
máximo divisor comum;
simulação em linguagem C da máquina Enigma, usada pelos alemães na Segunda Grande
Guerra Mundial, e análise de suas seqüências.
2. AS FERRAMENTAS CRIPTOGRÁFICAS
Iniciados os estudos, começou-se a implementação de algumas operações inteiras. Na
criptografia moderna é importante, freqüentemente, fazer operações algébricas com números inteiros
muito grandes (100 algarismos decimais ou mais), e essa foi a tarefa inicial: implementar algoritmos
para se efetuar essas operações de maneira eficiente. E como as operações normais de um computador
não são suficientes para essa criptografia, teve-se que criar “novas” técnicas envolvendo números
inteiros muito grandes.
2.1. A Primeira Forma de Armazenamento de Dados
Usou-se inicialmente como modo de armazenamento o tipo “caracter”, em que cada algarismo
era armazenado como um “caracter”, ou seja, um número era uma “string”, e o sinal era armazenado
como sendo o “+” ou o “-”.
A primeira operação feita (na verdade é uma pseudo-operação, pois não altera o valor do
número) foi a redução, que verifica e faz com que o número fique com o menor número possível de
algarismos. Essa operação é normalmente usada no fim de algoritmos, para que se tenha certeza de
que o número não estará desperdiçando memória.
Depois ainda foram implementados com esse método de armazenamento os programas:
Conversão de Bases; Operação de Módulo Clássico (“resto” de uma divisão); MDC de Euclides
(algoritimo de Euclides para o cálculo do máximo divisor comum); MDC de Euclides Extendido (que
fornece X e Y, sendo que A.X + B.Y = D, onde D = mdc (A,B) ); MDC Binário; e MDC Binário
Extendido.
2.2. Armazenamento de Dados Utilizando Números Binários
Foi percebido que uma nova forma de armazenamento dos números seria mais viável, mais
prática, mais simples para se fazer cálculos e ainda ocuparia menos posições da memória. Essa idéia
de armazenamento consistia em se trabalhar puramente com os números binários, sem pensar em
qualquer correspondência em decimal, ou seja, o número binário não era “divido” por algarismos, era
um número só, era um binário puro.
Os bits mais significativos eram armazenados nas posições de menor endereço da memória. E
o sinal era armazenado no bit mais significativo do número (o bit menos significativo na memória),
sendo que “0” correspondia a um número positivo e “1” logicamente a um negativo.
Mas agora, era preciso criar até as funções para o armazenamento dos números, já que se
estaria trabalhando com um “novo” tipo de variável. E o primeiro programa feito utilizando esse novo
método foi o mais básico e importante para a continuação do trabalho: leitura e armazenamento de
dados, usando-se leitura do teclado, para fins de testes, assim como a função que rotaciona o número e
a função que o imprime na tela.
Outros algoritmos também implementados, agora com esse tipo de armazenamento, foram os
seguintes: Operação de Redução, Operação Maior ( > ), Operação de Expansão, Operação de Soma de
Dois Números Inteiros Positivos, Operação de Subtração de Dois Números Inteiros Positivos, e
Operação de Soma de Dois Números Inteiros Quaisquer (utiliza os dois últimos programas: soma e
subtração de dois números positivos).
2.3. Utilizando “Structs” para Fazer a Passagem de Dados
Para resolver alguns problemas que surgiram na execução dos programas, devido ao grande
número de ponteiros , teve-se a idéia de criar estruturas de dados em que vários ponteiros fazem parte
de uma “mesma variável”: as chamadas “structs”. Assim, quando for necessário fazer a passagem de
dados para uma função, todos os dados são passados de uma só vez.
Os programas feitos que utilizaram essas idéias descritas até aqui foram a Operação de Soma
de Dois Números Inteiros Quaisquer (que teve pouquíssimas mudanças) e a Operação de Subtração de
Dois Números Inteiros Quaisquer.
3. A CONSTRUÇÃO E A UTILIZAÇÃO DE UMA BIBLIOTECA PRÓPRIA
A partir desses programas, utilizou-se uma biblioteca “criptográfica” exclusivamente
construída nesse trabalho. Essa biblioteca contém, nada mais nada menos que, todas as funções já
implementadas, e com o passar do tempo, essa biblioteca foi sempre alterada (acrescentada de novas
funções), assim os programas ficam pequenos, com somente a função principal. É uma maneira muita
mais prática de se trabalhar com essas funções.
O primeiro programa implementado utilizando essa biblioteca foi a Operação de Multiplicação
de Dois Números Inteiros Quaisquer, que usa como função a operação de soma.
4. A FORMA MAIS EFICIENTE DE ARMAZENAMENTO: O USO DA BASE 256
Descobriu-se uma outra nova idéia de armazenamento de dados, que funciona como se o
número fosse escrito na base 256 (duzentos e cinqüenta e seis), de forma que todos os bytes são
completamente preenchidos, ou seja, se um número não ocupar um número de bits que seja múltiplo
de 8 (oito), ele é remanejado de forma a ocupar completamente o byte menos significativo e
completando o mais significativo com zeros, ou melhor, esse número é expandido de forma a ocupar
perfeitamente uma “quantidade inteira” de bytes. Assim, os operações ficam incrivelmente mais
simples, mais rápidas e mais fáceis de serem implementadas e executadas, com uma menor chance de
erro.
Outra mudança feita conjuntamente de forma a facilitar ainda mais as implementações foi a do
armazenamento do sinal. A partir de agora o sinal é armazenado em uma outra variável e não mais
junto com o próprio número. É armazenado na variável que contém o tamanho do número (possui a
quantidade de bytes) da seguinte forma, se o número for positivo, a variável que contém o número de
bytes possui um número positivo, caso contrário, essa variável guarda um número negativo, portanto
essa variável armazena um número que em módulo é igual à quantidade de bytes do número.
Mas devido a essa mudança completa na estrutura de dados, foi necessário mais uma vez refazer todos
os programas anteriormente já feitos: Leitura e Armazenamento de Dados, Operação de Redução,
Operação de Expansão, Operação Maior ( > ), e a Operação de Soma de Dois Números Inteiros
Positivos. E assim, a biblioteca criptográfica foi totalmente alterada.
5. SIMULAÇÃO DO ENIGMA
5.1. A Máquina
O Enigma foi uma máquina de codificação de mensagens utilizada pelos alemães na Segunda Guerra
Mundial. Era uma máquina eletromecânica constituída basicamente de discos com circuitos elétricos
que transmitiam um sinal proveniente de um teclado, indicando para cada dígito uma outra letra,
codificando assim a mensagem.
Cada um de seus discos possuía 26 pontos em cada uma de suas faces, correspondendo às
letras do alfabeto, sendo que cada ponto de uma face era conectado a um outro ponto da face oposta
por meio de circuitos elétricos. E cada disco se interligava com outro através do simples contato. O
último disco era diferente, chamado de refletor, possuía pontos em apenas uma das faces, e cada ponto
era ligado a outro da mesma face.
Quando um tecla era acionada, um sinal gerado passava por todos os discos percorrendo um
caminho de acordo com as conexões, indo até o disco refletor e voltando até o primeiro disco, e uma
lâmpada era acesa indicando uma outra letra.
Além disso, a cada tecla digitada, o primeiro disco girava uma posição (um ponto, ou 1/26 de
uma volta), e a cada volta completa do primeiro disco, o segundo também girava uma posição, e assim
por diante. Assim, o enigma era uma excelente máquina criptográfica, dificílima de ser decodificada,
pois para isso era preciso saber quais eram as ligações internas de cada um dos discos, sua ordem e
suas respectivas posições iniciais.
5.2. O Programa Simulador
Este programa simula a máquina descrita acima, sendo que o principal artifício utilizado foi a
utilização de matrizes para a simulação dos discos. São matrizes numéricas, com 52 posições (26
extras para facilitar a rotação), que possuem em cada posição o índice da próxima matriz, ou seja, em
que ponto do próximo disco o ponto do disco “atual” está em contato.
Para cada um dos discos existem duas matrizes: uma de “ida” e outra de “volta”, pois não há
como utilizar a mesma matriz para os dois sentidos. E como os dois sentidos tem que seguir
rigorosamente o mesmo “caminho”, a matriz de volta é construída através da matriz de ida, da
seguinte forma: “mv [ mi [ i ] ] = i”, onde “mi” é a matriz de ida e “mv” a matriz de volta. Por
exemplo: se a posição 5 da matriz de ida possui o valor 7, a posição 7 da matriz de volta possui o valor
5. Apenas o disco refletor possui uma única matriz. E todas as matrizes são utilizadas uma só vez por
tecla digitada.
Neste programa, utiliza-se a função randômica para construir os discos, e a rotação desses
discos é feita através da adição de uma variável a cada índice de cada uma das matrizes,
incrementando-os nos momentos necessários.
Foi feito neste programa a decodificação, voltando cada disco à sua posição inicial, para que
assim, através da digitação da mensagem codificada, obtenha-se a mensagem original.
6. CONCLUSÕES
Com todo o estudo inicial, conclui-se que a criptografia deve ser pesquisada bem a fundo, de
forma a se desenvolver bons programas criptográficos no país, garantindo assim a nossa segurança,
pois hoje, o que realmente poderia nos preocupar seria uma “guerra eletrônica”, e a criptografia busca
justamente uma proteção nessa área.
Claramente pode-se ver que as liberdades individuais estão comprometidas. Cabe ao nosso
país concorrer nessa competição criptográfica, tanto na área comercial quanto na militar, além do que
todas as pessoas têm direito a uma proteção criptográfica eficaz.
No desenvolvimento desse trabalho, encontrou-se mais dificuldades do que se imaginava no
início. As operações entre números binários causavam “bugs” na memória, da mesma forma que os
diversos “ponteiros” utilizados.
Foi preciso diversas vezes encontrar formas “alternativas” para contornar esses problemas, o
que causou a necessidade de refazer diversas vezes os mesmos programas, ocasionando assim um
grande “atraso” no cronograma inicial, pois alguns programas foram feitos até quatro vezes.
Essas formas, aqui chamadas de “alternativas”, foram encontradas mediante árduo estudo,
pesquisa e criação. E como isso demanda um tempo considerável, essa foi mais uma causa do grande
“atraso”. Cada um desses problemas e suas respectivas soluções foram explicados anteriormente no
decorrer do relatório.
Este fato também é verificado quando se analisa a quantidade de programas/algoritmos
implementados. Fez-se até aqui exatamente 22 (vinte e dois) programas, 4 (quatro) versões de
bibliotecas criptográficas e um programa de simulação, sendo que apesar destes números expressivos,
não foram implementados nem 20% do esperado em número de funções diferentes; pois nunca fora
cogitada a possibilidade de implementar mais de uma vez cada um dos programas propostos.
E finalmente, na etapa final do trabalho, realizou-se uma simulação do Enigma (máquina
criptográfica alemã utilizada na II Grande Guerra Mundial), que não chegou a ser uma versão
definitiva, podendo assim ser melhorada, mas que mesmo assim alcançou grande sucesso.
AGRADECIMENTOS
Os autores gostariam de agradecer à professora Tania Nunes Rabelo pela ajuda e pelo
acompanhamento neste trabalho.
REFERÊNCIAS BIBLIOGRÁFICAS
1. Carvalho, D.B.; Segurança de Dados com Criptografia: Métodos e Algoritmos; Book Express; Rio
de Janeiro, 2000.
2. Stinson, D.R.; Cryptography: Theory and Practice; CRC Press; New York, 1995.
3. Terada, R.; Segurança de Dados: Criptografia em Redes de Computadores; Edgard Blücher; Rio de
Janeiro, 2000.
4. Singh, S.; O Livro dos Códigos - A Ciência do Sigilo: do Antigo Egito à Criptografia Quântica;
Record; Rio de Janeiro, 2001.
Download

ALGORITMOS BÁSICOS EM CRIPTOGRAFIA Rafael Antonio da