— Otimizações e Desempenho
Rodolfo Barros Chiaramonte1Fábio Dacêncio Pereira1, 2
Edward Moreno1, 2
[email protected], [email protected], [email protected]
1 UNIVEM Centro Universitário Eurípides de Marília
Fundação de Ensino Eurípides Soares da Rocha
Av. Hygino Muzzi Filho 529, CEP 17525-901, Marília, SP
2 LSI Laboratório de SistemasIntegráveis
EPUSP Escola Politécnica da Universidade de São Paulo Av. Prof. Luciano Gualberto, Trav 3 – 158
Cidade Universitária – CEP 05508-900, São Paulo, S.P
Phone: + 55 11 – 3091-5675
Resumo
Este trabalho apresenta implementações e otimizações de um algoritmo para criptografar dados, chama-do de Posicional. Inicialmente explica-se o algoritmo e apresentam-se alguns exemplos de seu funciona-mento. Posteriormente, se implementa o algoritmo em linguagem C e em VHDL (VHSIC Hardware Description Language) e se fornecem alguns dados de sua performance. Posteriormente são propostas algumas otimizações para obter uma maior segurança. Finalmente, é realizada uma comparação entre os resultados obtidos.
Abstract
This paper shows implementations and optimizations about a cryptography algorithm called Positional. Initially the algorithm is explained and some examples are shown. Then the algorithm is implemented in C language and in VHDL (VHSIC Hardware Description Language) and some data about its performance are shown. Later are proposed some optimizations to obtain a higher level of security. Finally, a comparison between the results is done.
1.
Introdução
A segurança da informação digital é questão de preocupação para muita gente. Com isso foram de-senvolvidas várias técnicas para dificultar o roubo de dados informatizados. Uma dessas técnicas é a criptografia digital, que consiste em transformar informações em códigos para evitar o acesso de pessoas não autorizadas e é utilizada desde a an-tigüidade. Com o surgimento dos computadores vários tipos de algoritmos criptográficos foram in-ventados, no entanto, os algoritmos considerados seguros necessitam de grande processamento e algumas vezes o tamanho da mensagem cripto-grafada aumenta significativamente [1] [2]. Com a evolução das máquinas, uma chave de 56 bits como a usada pelo algoritmo DES não poderia mais garantir a segurança desejada por muito tem-po [3]. Com isso, em 1997 iniciou-se um processo de escolha de um sucessor para este algoritmo. Este processo resultou em um novo padrão de criptografia simétrico denominado AES (Advanced
Encryption Standard).
Com o crescimento do uso da internet para aplica-ções como home banking, comércio eletrônico, e outras aplicações que necessitam de um meio se-guro para a transmissão dos dados, a criptografia vem ganhando cada vez mais importância e sen-do tópico de várias discussões. Desta forma, este artigo propõe um algoritmo de criptografia didático onde é possível perceber seus conceitos básicos, apresentando e destacando algumas falhas de se-gurança e alguns métodos simples para prover um aumento na segurança deste algoritmo. Importan-te destacar que por ser desenvolvido para fins di-dáticos este algoritmo possui algumas falhas e não deve ser utilizado em sistemas que exigem muita segurança. No entanto é um algoritmo simples que permite facilitar o estudo sobre a criptografia e ve-rificar métodos de análise de desempenho abor-dando aspectos de implementação em software e hardware [3] [4].
Dessa maneira, o artigo apresenta as seguintes contribuições: (i) Apresenta os conceitos básicos do algoritmo Posicional; (ii) Propõe implementações desse algoritmo utilizando funções baseadas em polinômios posicionais de diferentes graus; (iii) Analisa o desempenho dessa nova proposta com-parando os resultados obtidos nas implementações em software e em hardware; (iv) propõe otimizações para o aumento da segurança; (v) implementa as otimizações em software realizan-do uma comparação de desempenho com as ver-sões anteriores em software.
Portanto é realizada uma comparação de desem-penho das implementações em software (em lin-guagem C) e em hardware (VHDL) do algoritmo Posicional com diferentes graus. Alguns testes de desempenho foram realizados mostrando que o algoritmo posicional é significativamente rápido. Algumas otimizações para o aumento da seguran-ça são propostas e implementadas em software (em linguagem C) e o seu desempenho é comparado com as implementações anteriores.
O algoritmo Posicional apresentou um bom desem-penho o que se deve à maior simplicidade de im-plementação, o que decorre em uma menor segu-rança quando comparado com algoritmos que uti-lizam funções matemáticas mais complexas [5]. Ainda assim, pode-se obter bons resultados na ten-tativa de quebrar o sistema cifrado, uma vez que os tempos obtidos através de uma criptoanálise exaustiva (testando todas as chaves possíveis) mostra que é inviável este tipo de ataque sobre o algoritmo Posicional. No projeto implementou-se também o programa que obtém as chaves através de busca exaustiva e obtivemos surpreendente-mente bons resultados [6]. No entanto é possível através de métodos matemáticos obter a chave do algoritmo Posicional simples rapidamente. Este problema foi solucionado através das otimizações proposta na seção 5 deste artigo.
O restante do artigo está organizado da seguinte maneira: na seção 2 são descritos alguns
concei-tos básicos do algoritmo Posicional e apresenta-se alguns exemplos, na apresenta-seção 3 descreve-apresenta-se uma implementação em software do algoritmo Posicio-nal utilizando a linguagem C e dados sobre sua performance são apresentados, na seção 4 des-creve-se uma implementação do algoritmo Posici-onal em hardware utilizando FPGAs, na seção 5 são apresentadas otimizações do Posicional para obter uma maior segurança e seu desempenho é analisado. Finalmente, a seção 6 apresenta as con-clusões.
2.
Descrição do Algoritmo Posicional
Conceito: O algoritmo de criptografia Posicionalconsiste em que a posição do byte interfere sobre a chave utilizada na cifragem. O algoritmo Posicio-nal se baseia no bem conhecido Cifra de César [7]. Em nossa proposta, o Algoritmo Posicional, foi introduzida uma função sobre o algoritmo Cifra de César para que cada posição seja cifrada de for-ma diferente eliminando o problefor-ma de freqüência de letras.
Exemplos de Funcionamento: Com o algoritmo
Posicional Básico a seqüência AAABBB, por exem-plo, poderia ser cifrada como BCDFGH, sem acres-cer a ela nenhum bit. Para isso, admita-se o valor decimal dos bytes A, B, C, D, E ,F ,G e H de acor-do com a tabela ASCII (65, 66, 67, 68, 69, 70, 71 e
72 respectivamente). A esses valores são
acresci-dos os valores de sua posição. Agora vamos su-por o exemplo da tabela 1 onde existe uma se-qüência AAABBB. Como o primeiro A está na posi-ção um, o seu valor decimal cifrado será 66 (que eqüivale na tabela ASCII ao caracter B), mas como o segundo A está na posição dois, deve-se acres-cer 2 ao seu valor ASCII, assim o valor decimal do segundo byte será 67 (que eqüivale na tabela ASCII ao caracter C).
Tabela 1. Tabela exemplo – Algoritmo Posicional Básico
Infelizmente esse modelo ainda é simples de ser decifrado. Por esse motivo, na nossa proposta de algoritmo Posicional é recomendável somar ao va-lor do byte original representado em ASCII um nú-mero gerado utilizando-se de uma expressão matemática que usa a posição do byte (variável x). Por exemplo: usando uma expressão do tipo a*x+b. Nesse tipo de cifragem, quanto maior o grau da expressão posicional, maior será a complexidade do algoritmo e por sua vez a segurança dos dados cifrados usando-se desse algoritmo. Por exem-plo: Se a expressão posicional for do terceiro grau, terá uma segurança maior que um sistema com expressão do segundo grau.
A seguir é apresentado um exemplo completo de cifragem utilizando grau 3. Neste exemplo ocorre o estouro de um byte, ou seja, o valor decimal do código cifrado é maior que 256 que é o valor máxi-mo que pode ser armazenado em um byte (o códi-go ASCII tem a capacidade de 28=256
possibilidades). No caso de estouro, assume-se que o valor do byte será “valor encontrado mod
256” onde mod retorna o resto da divisão.
A expressão posicional utilizada será:
f(x) = 23x3 + 26x2 – 45x – 63 à Os coeficientes
(23,26,-45,-63) foram selecionados aleatoriamente. Considerando o mesmo exemplo anterior cuja se-qüência original é AAABBB, temos as seguintes fases (ver tabela 2).
As colunas em destaque com sombra indicam aquelas onde ocorreu o estouro de um byte. Os valores 722, 1711, 3303 e 5637 ultrapassam 256 e
não podem ser armazenados em apenas um byte. Para solucionar esse problema é realizada uma divisão e o resto da divisão é utilizado como o va-lor cifrado. Por exemplo: dividindo o vava-lor 722 por 256 o resto obtido é 210 que é utilizado na penúlti-ma linha da tabela. Os outros valores são calcula-dos do mesmo modo.
Tabela 2. Exemplo Posicional Grau 3 (23x3 + 26x2 – 45x – 63)
Figura 1. Exemplo do algoritmo utilizando a chave (1,1,1,1,1,1,1,1,1,1) – Grau 10
Similarmente na figura 2 solicita-se uma chave de entrada: (123,423,573,567,234) o que significa que: f(x) = 123x5 + 423x4 + 573x3 + 567x2 + 234x1.
Figura 2. Exemplo de algoritmo utilizando a chave (123,423,573,567,234) – Grau 5
A tabela 3 mostra como uma mesma mensagem fica cifrada utilizando-se chaves diferentes. Nessa tabela, pode-se perceber mais uma vantagem do algoritmo posicional. Independentemente do grau do polinômio usado e dos coeficientes usados, a mensagem cifrada permanece do mesmo tamanho que a mensagem original.
Tabela 3. Mensagens cifradas com chaves diferentes.
3.
Implementação em Software
O algoritmo Posicional foi implementado em lingua-gem C. A seguir são colocados exemplos de funcio-namento do algoritmo com vários tipos de chaves diferentes. Os exemplos foram obtidos através da captura da tela de execução do algoritmo.
Os números utilizados para compor a chave podem ser gerados aleatoriamente, contudo, critérios para a formação das chaves estão sendo estudados para evitar a duplicidade das chaves, isto é, evitar que mais que uma chave possa decifrar determinada mensagem.
As figuras 1 e 2 mostram o algoritmo implementado sendo executado. Inicialmente, o programa solici-ta o texto que deve ser cifrado, depois o programa solicita ao usuário a chave. Na figura 1 foi digitado para a chave (1,1,1,1,1,1,1,1,1,1) o que significa que está-se usando uma função de grau 10 na seguinte maneira:
f(x) = 1x10+1x9+1x8+1x7+1x6+1x5+1x4+1x3+1x2+1x1
Tabela 4. Desempenho do algoritmo Posicional Desempenho do algoritmo Posisional:
A tabela 4 mostra o desempenho da implementação do algoritmo Posicional em software (em linguagem C). O desempenho apresentado foi obtido através de um computador AMD Duron – 950 Mhz com 128 Mb de memória. Através da tabela 4 pode-se notar que o algoritmo Posicional tem um bom desempe-nho, demorando cerca de 2,5 segundos para cifrar 1,5Mbytes utilizando o grau máximo de segurança.
4.
Implementação em Hardware utilizando
FPGAs (linguagem VHDL).
Nesta seção é feita uma análise do desempenho em hardware implementação real e física em um circuito programável (FPGA) da ALTERA e usando VHDL como linguagem de descrição de hardware, e uma comparação com o desempenho obtido com a implementação em software.
Para a implementação em VHDL foi utilizada a ferramenta MAX PLUS II da Altera utilizando a FPGA EPF10K20RC240-4. Todas as estatísticas e testes apresentados foram obtidos utilizando esse dispositivo.
Inicialmente, foi proposto um circuito para realizar a cifragem de um caracter. Para isso, estudou-se o algoritmo de criptografia de um caracter e pro-pôs-se uma arquitetura (em hardware) que define o seu funcionamento. Após isso, os diferentes módulos necessários para a implementação foram descritos em VHDL separadamente, logo depois se integraram para cumprir a função toda. Final-mente, foram realizadas simulações usando-se a ferramenta da ALTERA e conseguiu-se mapear com sucesso em uma FPGA real.
O algoritmo para realizar a cifragem de um caractere é descrito a seguir:
PARA i DE 1 ATÉ grau_da_chave
soma = soma + (valor_da_chave * posição i ) FIM PARA
caracter_cifrado=caracter_original + soma % 256;
A arquitetura do algoritmo consiste de: contado-res, um módulo para calcular a potência, uma me-mória, um multiplicador, um acumulador, um comparador, e um registrador especial. Além dis-so são necessárias uma parte de controle para ci-frar um único caractere e uma parte que define a criptografia de uma mensagem (usando como base o circuito que cifra um único caractere).
Uma vez que o acesso à memória ocorre a cada 100ns e a programação da chave requer somente acessos à memória para gravação de seus valo-res e considerando que uma chave de grau n pos-sui n valores e requer n acessos à memória; o tempo de programação de uma chave pode ser cal-culado pela fórmula 100ns * grau da chave. Os tempos obtidos, da implementação real em uma placa FPGA, durante a cifragem de um caractere nos diversos graus possíveis para a chave são apre-sentados na tabela 5. A figura 3 mostra os resulta-dos das simulações em uma FPGA.
Tabela 5. Tempos obtidos na criptografia de um caractere
Com base nesses tempos, podemos calcular o tem-po necessário para cifrar textos com vários tama-nhos e assim comparar os resultados com os obtidos na implementação em software.
A tabela 6 mostra o tempo estimado para a cifragem de textos com os tamanhos de 0,5Mb, 1,0Mb e 1,5Mb.
Tabela 6. Tempo estimado (em segundos) para a cifragem de arquivos de 0,5Mb, 1,0Mb e 1,5Mb
A figura 4 mostra o gráfico de desempenho obtido através das estimativas calculadas na tabela 6. Nota-se que a implementação em hardware pos-sui um desempenho mais lento que a implementa-ção em software. Isso ocorre pois os tempos obtidos são tempos estimados através da multipli-cação do tamanho do arquivo pelo tempo neces-sário para cifrar um caractere. Uma otimização possível é permitir que mais de um caractere pos-sam ser cifrados em paralelo, o que melhorará muito o desempenho.
Os módulos utilizados no circuito para realizar a cifragem de um caractere foram dois contadores, uma memória, um acumulador, um multiplicador, um circuito para calcular potências, um comparador, um registrador e dois módulos para sincronizar si-nais internos. As estatísticas de cada módulo são apresentadas abaixo na tabela 7.
Tabela 7. Sumário – Estatísticas de uso da FPGA
Figura 3. Resultados da simulação em hardware
Figura 4. Desempenho da implementação em hardware
5.
Otimizações de Segurança do
Algoritmo
Esta seção apresenta otimizações propostas ao al-goritmo Posicional para obter uma maior segurança.
5.1. Utilização de blocos de 32 e 64 bits
Motivação para a otimização: Como descritoan-teriormente na seção 2, quando ocorre o estouro de um byte é calculado o resto da divisão do valor obtido por 256, ou seja, valor cifrado = valor
ob-tido (mod 256). Isso faz com que a cifra tenha um
período curto de 256 bytes, ou seja, o resultado da
expressão (mod 256) vai coincidir a cada 256 bytes
como mostra o exemplo da tabela 8 utilizando a chave (23,26,45,63):
Com isso um criptoanalista pode facilmente dividir o texto cifrado em blocos de 256 bytes e conseguir obter o texto legível. Para evitar esse ataque é ne-cessário ampliar o período da cifra considerando blocos ao invés de bytes. Utilizando blocos de 32 bits (4 bytes) o período da cifra é alongado para 232,
ou seja, a repetição dos valores só ocorrerá a cada 232 bytes (4.294.967.296 bytes – ou 4 giga bytes).
Para implementar esta operação basta fazer com que a função de leitura do arquivo leia 32 bits; e alterar o tipo de dados utilizado de char para int. Como blocos de 32 bits estão sendo utilizados, são cifrados 4 bytes ao mesmo tempo, o que melhorou significativamente o desempenho.
É possível realizar implementações com blocos maiores, no entanto, foi constatado que isso não oferece muitas vantagens. Dois motivos principais serão descritos abaixo:
1 – As mensagens raramente excedem o limite de 4 giga bytes;
2 – Com blocos maiores, maior é a probabilidade de parte do bloco cifrado coincidir com o bloco origi-nal, pois o valor do resultado da expressão tende a ser pequeno no início das mensagens, princi-palmente quando a chave utilizada é pequena.
Desempenho da otimização: Como descrito
an-teriormente o desempenho melhorou significativa-mente. Na tabela 9 são apresentadas estatísticas de funcionamento de duas versões em blocos (blo-cos de 32 e de 64 bits) utilizando chaves de grau 1 até 10. Os tempos foram obtidos com base em um computador com processador AMD – Duron 950 Mhz e 128 Mb de memória.
Tabela 9. Desempenho do algoritmo Posicional – Blocos de 32 e 64 bits
A figura 5 mostra um gráfico comparativo de desem-penho sobre as implementações. O gráfico mostra a taxa de cifragem em Mbytes/segundo. Através dele pode se observar que quanto maior o tamanho do bloco maior a taxa de cifragem (principalmente utili-zando chaves pequenas como a de grau 1 ou 2), no entanto, o uso de blocos acima de 32 bits não é recomendável por questões de segurança.
Pode-se observar que utilizando blocos de 32 bits é possível conseguir um bom desempenho (1,61 Mytes/segundo) utilizando chaves no grau máximo (grau 10); o que oferece também um bom nível de segurança. Essa taxa de cifragem é 2,78 vezes maior que a taxa de cifragem do algoritmo Posicio-nal sem blocos utilizando chaves de grau máximo (grau 10) que corresponde a 0,58 Mbytes/segundo.
Figura 5. Gráfico comparativo de desempenho
5.2. Inclusão de bits aleatórios
Motivação: Como visto no capitulo anterior,
reali-zar a criptografia em blocos alongando o período da cifra aumenta significativamente a segurança. No entanto, este algoritmo continua vulnerável a um ataque por texto legível conhecido, onde um criptoanalista de posse de um texto legível e seu correspondente ilegível consegue obter a chave. Veja a seguir um exemplo de como isso ocorre com o algoritmo Posicional:
A função de cifragem tem como entrada e saída um valor do tamanho do bloco que está sendo
uti-lizado e as operações são realizadas mod (2t), onde
t = tamanho do bloco.
Vamos supor que o criptanalista tem acesso à se-guinte parte “ABCDEFGHIJKL” que começa na posição 111 de um texto que foi cifrado utilizando uma versão com blocos de 32 bits e com a chave “10,20,30”, no entanto o criptoanalista não conhe-ce a chave, apenas a mensagem ilegível corres-pondente àquela parte do texto.
A tabela 10 a seguir mostra como os dados foram cifrados e a tabela 11 mostra quais são os dados que o criptoanalista tem acesso.
Tabela 10. Exemplo de criptografia
Tabela 11. Dados em posse do criptanalista
O criptoanalista em posse dos dados na tabela 11 calcula “Criptografado – (menos) Original” obten-do os valores equivalentes ao resultaobten-do da expres-são na tabela 10. Com posse desses valores ele pode montar o seguinte sistema:
Para montar o sistema o criptoanalita pode utilizar
o seguinte raciocínio: Para gerar o resultado da expressão para a posição 111 foi realizado o se-guinte calculo:
chave1 * 1113 + chave2 * 1112 + chave3 * 1111
Como sobraram três incógnitas (chave1, chave2 e
chave3) é necessário ter pelo menos três expressões
para poder resolver o sistema. O criptoanalista deve então gerar expressões utilizando os valores obtidos com as outras posições (112 e 113) para montar o sistema completo que foi apresentado acima. No sistema apresentado acima as incógnitas
cha-ve1, chave2 e chave3 foram substituídas por a, b
e c respectivamente.
Existem métodos matemáticos de permitem resol-ver rapidamente até os sistemas de grau 10 (grau máximo de segurança oferecido pelas implemen-tações do Posicional).
Para solucionar esse problema a função de cifragem foi alterada e passou a ter como entrada três caracteres de 8 bits (24 bits de entrada) e como saída um inteiro de 32 bits. A função calcula inter-namente 8 bits aleatórios e acrescenta à entrada (formando o bloco completo de 32 bits) antes de realizar a cifragem do bloco (que ainda é de 32 bits). Isso dificulta ao criptoanalista a criação do sistema apresentado acima, pois não será possí-vel a ele saber com certeza qual era o bloco origi-nal antes de ser cifrado, pois os bits aleatórios fo-ram inseridos dentro da função de cifragem. Para que o criptoanalista consiga gerar um sistema capaz de calcular a chave, ele terá que descobrir quais foram os bits acrescentados. Para uma chave de grau 1, como é necessário apenas um bloco para conse-guir montar o sistema completo ele terá de testar 256 possibilidades. Já para um sistema de grau 3, em que é necessário utilizar 3 blocos para montar o sistema, uma vez que em um sistema com grau 3 existem três incógnitas, ele terá de testar 224 possibilidades, ou seja,
16777216 possibilidades. Em um sistema com grau 10, que é o que oferece o maior nível de segurança, é necessário testar 280 possibilidades, ou seja,
1208925819614629174706176 possibilidades; o que torna esse tipo de ataque inviável ao criptoanalista.
Implementação da otimização: Foram
implemen-tadas três versões da implementação proposta, que diferem entre si apenas pelo modo em que os bits são acrescentados. Uma primeira versão apenas
acrescenta os bits aleatórios ao final do bloco. Uma segunda versão implementada realiza o desloca-mento para a esquerda um número variável de vezes, de acordo com o número de vezes que a função de cifragem é chamada. Uma terceira ver-são, considerada a mais aconselhável, distribui os bits aleatórios por todo o bloco.
Desempenho da otimização: Como era de se
esperar o desempenho dessa otimização diminuiu um pouco, no entanto reflete a maior segurança obtida por esse algoritmo. O maior problema quanto ao desempenho dessa otimização é quanto ao quivo de saída cifrado, que é 25% maior que o ar-quivo de entrada original. Na figura 6 a seguir é apresentado um gráfico que mostra o desempe-nho das três versões dessa otimização, comparan-do com o desempenho da versão que cifra blocos de 32 bits sem acréscimo de nenhum bit aleatório.
Figura 6. Comparação de desempenho entre as otimizações
Através dos dados da figura 6 pode-se notar que o desempenho das três versões que inserem bits alea-tórios no bloco é parecido e são todos mais lentos que a versão em blocos de 32 bits. No entanto pode-se dizer que o algoritmo pode-se tornou muito mais pode-seguro sem perder muito em eficiência, pois nos maiores níveis de segurança (próximos ao grau 10) o desem-penho dos algoritmos que incluem bits aleatórios é muito parecido com o desempenho do algoritmo que cifra blocos de 32 bits sem a inclusão de bits.
6.
Conclusão
Neste artigo apresentou-se a proposta do algorit-mo Posicional e respectivas implementações em software (linguagem C) e hardware (VHDL). No entanto o nível de segurança obtido por este algo-ritmo ainda não era satisfatório.
Foram então propostas e implementadas várias otimizações ao algoritmo Posicional para aumentar a sua segurança. Os resultados obtidos mostram que foi possível melhorar significativamente a se-gurança do algoritmo Posicional sem que este per-desse performance significativamente. A solução de cifragem em blocos com o algoritmo Posicional per-mite um aumento na segurança e ao mesmo tempo fez com que ele se tornasse muito mais rápido, pois com a cifragem em blocos, vários caracteres são cifrados em uma única vez (no caso de blocos de 32 bits são quatro caracteres cifrados ao mesmo tempo). A outra solução adotada para aumentar a segurança fez com que o desempenho diminuísse um pouco, pois exige tempo para a geração de se-qüências aleatórias e diminui o número de caracteres cifrados de quatro para três (utilizando blocos de 32 bits). Ainda assim o desempenho apresentado é melhor que o desempenho apresentado pela ver-são original do algoritmo Posicional.
Como trabalhos futuros, pretende-se implementar as otimizações apresentadas em linguagem VHDL para a utilização em FPGAs.
Referências
[1] Segurança de Dados Criptografia em Redes de Computadores. Routo Terada, Ed. Edgard Blücher, 1a Edição, (2000).
[2] Cryptography and Networks Security: Principles and Practices. William Stallings, Ed. Prentice Hall, Second Edition, (1995).
[3] Criptografia em Software e Hardware, Edward Moreno, Fábio D. Pereira, Rodolfo B. Chiaramonte, Novatec Editora (www.novateceditora.com.br), 1ª Edição, (2005).
[4] Chiaramonte, Rodolfo B.; Moreno, Edward D.. Criptografia Posicional em Hardware; Revista Eletrô-nica de Iniciação Científica REIC, (Dezembro 2002). [5] The Art of Computer Programming – Volume 2: Seminumerical Algorithms – Third Edition, Donald E. Knuth, Ed. Addison Wesley, (1997).
[6] Chiaramonte, Rodolfo B.; Moreno, Edward D.. Criptografia Posicional: Uma Solução para Segu-rança de Dados: Conceitos, Exemplos e desem-penho; Revista Eletrônica de Iniciação Científica REIC, (Novembro 2001).
[7] Bruce Schneier. Applied Cryptography: Protocols, Algorithms and Source in C. 2nd Ed. John Wiley and Sons, New York, (1996).
Autores
*:
Rodolfo Barros Chiaramonte
Bacharel em Ciência da Computação
UNIVEM – Centro universitário Eurípides de Marília. Atualmente mestrando em Ciência da Computa-ção - UNIVEM
Fábio Dacêncio Pereira
Bacharel e Mestre em Ciência da Computação do UNIVEM – Centro universitário Eurípides de Marília. Atualmente doutorando em Engenharia Elétrica – Universidade de São Paulo, USP.
Edward Moreno
Doutor pela EPUSP, e Pós-Doutorado na UFSCAR Professor no UNIVEM – Centro universitário Eurípides de Marília e Professor convidado no LSI – EPUSP Escola Politécnica da Universidade de São Paulo
* Os autores publicaram recentemente, pela Editora Novatec,