Um survey sobre bibliotecas criptográficas com suporte à Criptografia de Curvas Elípticas* Nelson Uto** e David Reis Jr. A Criptografia de Curvas Elípticas (ECC) surgiu como uma importante alternativa ao criptossistema RSA. Apresenta procedimentos de geração de chaves e de assinatura mais rápidos e requer parâmetros menores para prover o mesmo grau de segurança quando comparado ao RSA. Há diversas bibliotecas de código aberto disponíveis atualmente, que podem ser utilizadas para implementar segurança em aplicações usando ECC. Porém, não é uma tarefa fácil decidir qual delas é melhor em cada caso. Para ajudar nessa decisão, o presente artigo avalia seis bibliotecas com suporte a ECC, com base em desempenho, portabilidade e documentação. Palavras-chave: ECC. Criptografia de Curvas Elípticas. Bibliotecas criptográficas. Comparação de desempenho. ECDSA. 1. Introdução A criptografia assimétrica desempenha um papel fundamental em segurança da informação, fornecendo algoritmos e protocolos para cifração, assinaturas digitais e estabelecimento de chaves. O criptossistema assimétrico mais conhecido é o RSA, que apresenta a desvantagem de necessitar de chaves grandes para prover um nível de segurança adequado. Devido ao tamanho das chaves, as operações envolvendo a chave privada são lentas. Nesse contexto, a criptografia de curvas elípticas (doravante ECC) surgiu como uma alternativa atraente ao RSA. Como a ECC baseiase em um problema matemático diferente do RSA, no qual somente algoritmos completamente exponenciais são conhecidos, chaves menores podem ser empregadas. Isso significa menor necessidade de memória, consumo de energia mais baixo e operações mais rápidas, comparativamente ao RSA. Essas vantagens são de especial interesse em sistemas embarcados. Os principais algoritmos baseados em curvas elípticas são ECDSA (análogo ao DSA) para assinatura digital, ECDH e ECMQV para acordo de chaves e ECIES para cifração. Esses algoritmos, juntamente com parâmetros de domínio de curvas elípticas, têm sido adotados por diversos padrões * como ANSI X9.62, ANSI X9.63, FIPS 186-2, IEEE P1363, IEEE P1363a e SEC 1 e 2. Nos últimos anos, a adoção de criptografia de curvas elípticas tem aumentado consideravelmente. Bons exemplos são: (i) a decisão do governo americano de empregar ECC em comunicações “classificadas” e “sensíveis, mas não classificadas”; (ii) o uso de ECC pela Microsoft no esquema de proteção de direitos digitais. Com a popularização de ECC, bibliotecas criptográficas que a suportem serão essenciais no desenvolvimento de softwares demandando segurança. Neste artigo, seis bibliotecas criptográficas são avaliadas, baseadas nas linguagens C/C++, com suporte à criptografia de curvas elípticas. Somente bibliotecas livres, pelo menos para uso não comercial, são analisadas. Os critérios de avaliação incluem desempenho, qualidade da documentação, portabilidade, algoritmos suportados, existência de parâmetros de domínio previamente especificados e facilidade de uso. Com relação a desempenho, somente o tempo de execução do ECDSA foi medido, porque o tempo dos demais algoritmos pode ser estimado a partir do último. O restante deste artigo está organizado da seguinte maneira: a Seção 2 descreve as bibliotecas avaliadas, enquanto a Seção 3 aborda os testes O presente trabalho é um resumo do artigo “A Survey of Cryptographic Libraries Supporting Elliptic Curve Cryptography”, de mesma autoria, publicado nos anais do 3er Congreso Iberoamericano de Seguridad Informática (CIBSI’05), p. 159-176, Valparaíso, Chile, 21 a 25 de novembro de 2005. ** Autor a quem a correspondência deve ser dirigida: [email protected]. Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas de desempenho. Finalmente, na Seção 4, são apresentadas as conclusões do trabalho. 2. Bibliotecas C e C++ avaliadas As bibliotecas escritas em C/C++ são muito mais rápidas que as escritas em Java, uma vez que são compiladas em vez de interpretadas. Se desejável, o desempenho delas pode ser melhorado ainda mais se utilizarem código escrito em Assembly. Neste trabalho, somente serão analisadas bibliotecas baseadas em C/C++. 2.1. borZoi (Versão 1.0.2) borZoi (Dragongate Technologies Ltd., 2003) é uma biblioteca minimalista de criptografia de curvas elípticas disponibilizada pela Dragongate Technologies, sob uma licença GNU GPL. É escrita em C++ e implementa os algoritmos ECDSA, ECDH e ECIES utilizando curvas elípticas definidas sobre corpos binários. A implementação segue os padrões ANSI e IEEE e fornece parâmetros de domínio pré-especificados para as curvas binárias do NIST. O manual de 26 páginas que acompanha o produto detalha as funcionalidades da biblioteca, a representação interna e as classes, além de fornecer exemplos de uso. A interface é fácil de entender e é relativamente simples gerar e verificar assinaturas ECDSA ou realizar um acordo de chaves empregando ECDH. A biblioteca possui código próprio para a manipulação de inteiros e polinômios, mas seu desempenho é baixo. Para melhorar o desempenho, é possível compilar a biblioteca juntamente com NTL, mas encontrou-se um erro ao utilizar a versão 5.3.1 desta última. Outra otimização possível está na multiplicação escalar: borZoi implementa o algoritmo duplicação-e-soma padrão, mas pode-se utilizar wNAF ou janela deslizante. A biblioteca foi compilada com sucesso nas plataformas xScale e x86 após pequenas mudanças no makefile, mas os testes de validação falharam para o primeiro ambiente. Não foi possível medir o desempenho de borZoi em nenhuma das plataformas, pois os tempos coletados pareciam completamente aleatórios (alto desvio padrão) sem uma explicação razoável. 2.2. Crypto++ (Versão 5.2.1) Crypto++ (Dai, 2005) é uma biblioteca criptográfica escrita em C++ que inclui um grande número de algoritmos. Suporta as principais primitivas baseadas em curvas elípticas, isto é, 134 ECDSA, ECIES e ECDH, além de vir com os parâmetros de domínio definidos pelo NIST e pelo SECG. A versão 5.2.3, ainda não disponível, está passando pelo processo de certificação do ECDSA, realizado pelo NIST. A documentação ainda se encontra em desenvolvimento e, até o momento de escrita deste artigo, restringe-se a uma breve descrição das funções e dos parâmetros correspondentes. A documentação interna precisa ser melhorada, mas Crypto++ possui um número razoável de usuários e a lista de discussões da biblioteca é uma boa fonte de suporte. A estrutura interna é substancialmente baseada em templates e herança de classes. A falta de documentação e o uso excessivo de templates tornam difícil determinar a causa de erros de compilação. Outro problema é o tamanho da biblioteca; a versão otimizada padrão resulta em um arquivo-objeto de aproximadamente 13 MBytes, em ambas as plataformas. A compilação de programas usando Crypto++ é demorada, mesmo em um Pentium 4 de 2,8 GHz. A biblioteca pode ser reduzida para algoritmos essenciais, mas não há mecanismos automatizados para isso. Apesar dos problemas acima apontados, Crypto++ tem um grande suporte para a manipulação de dados: pode-se, por exemplo, ler um arquivo binário, processá-lo e gerar a saída para outro arquivo codificado em hexadecimal, utilizando-se apenas de algumas linhas de código. Durante a avaliação de desempenho, notouse que o tempo de execução para algumas curvas binárias era muito alto. A razão é que Crypto++ é otimizado somente para corpos baseados em trinômios; assim, quando são empregados pentanômios, a degradação de desempenho é grande. A biblioteca foi compilada com sucesso, em ambas as plataformas, com algumas pequenas mudanças no makefile. Porém, alguns testes de validação, não relacionados a ECC, falharam em xScale. 2.3. LibTomCrypt (Versão 1.0.5) LibTomCrypt (2005) é uma biblioteca criptográfica de código aberto desenvolvida por Tom St Denis. Suporta ECDSA e ECDH em curvas definidas sobre corpos primos. É escrita em ISO C e pode ser compilada, sem modificações, em uma grande gama de plataformas, incluindo x86_32, x86_64, ARM e PowerPC. Esta biblioteca vem com um ótimo manual, o qual possui descrições detalhadas de cada função, além de exemplos. Ela possui uma interface clara e uniforme que simplifica muito o Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas desenvolvimento. Os programas de verificação e de desempenho, que acompanham o produto, podem ser utilizados como um ponto de partida para a implementação de novos programas. As curvas incluídas são as cinco definidas pelo NIST. Teoricamente, porém, pode-se utilizar qualquer curva prima com equação y2= x3- 3x+b. Para realizar a multiplicação escalar, LibTomCrypt usa o método de janela deslizante com largura 4. A biblioteca vem com um makefile, que a compila com sucesso nas plataformas xScale e x86. O processo de geração é flexível e podem-se excluir algoritmos não desejados da biblioteca. O makefile também permite o ajuste de algumas opções de otimização. 2.4. LiDIA (Versão 2.1.3) LiDIA (Hamdy, 2004) é uma biblioteca C++ para teoria de números computacional, que provê implementações para diversos tipos de dados de precisão arbitrária e algoritmos pesados. É desenvolvido pelo grupo LiDIA, na Technische Universität Darmstadt, e é livre para uso não comercial. Supostamente, a LiDIA pode ser executada em qualquer computador POSIX que suporte nomes de arquivos longos. A biblioteca foi compilada com sucesso nas plataformas Pentium 4 e xScale, executando o sistema operacional Linux. Entretanto, alguns ajustes no script configure foram necessários para se utilizar namespaces na plataforma xScale. A biblioteca LiDIA é composta dos cinco níveis abaixo listados (Hamdy, 2004): 1. Kernel – contém um módulo de aritmética de inteiros de precisão arbitrária e um gerenciador de memória. As bibliotecas de precisão arbitrária suportadas são a libI, GNU MP, cln, piologie e freelip. Desde a versão 2.1, nenhuma delas acompanha a LiDIA. 2. Interfaces – por meio das quais os níveis mais altos acessam o kernel. 3. Classes simples – classes não parametrizadas como bigrational. 4. Classes parametrizadas – classes como base_vector <T>. 5. Interfaces de usuário – documentação online e interpretador de comandos. Embora a LiDIA não forneça algoritmos de criptografia de curvas elípticas diretamente, ela suporta toda a aritmética de inteiros de precisão arbitrária e de curvas elípticas, que é necessária para implementá-los. A LiDIA é dividida em diversos pacotes, dos quais o mais relevante para este artigo Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 é o pacote EC. Ele contém classes para manipular curvas elípticas sobre os inteiros e sobre corpos finitos. Tanto corpos binários como primos são suportados. Os pontos podem ser representados em coordenadas afins ou projetivas e nenhum algoritmo para otimizar multiplicação de pontos é disponibilizado. A API da biblioteca é simples de usar e a documentação (Hamdy, 2004) é muito boa; além de diversos exemplos, contém descrições ricas de classes e métodos. 2.5. MIRACL (Versão 4.85) A biblioteca Multiprecision Integer and Rational Arithmetic C/C++ Library (Shamus Software Ltd., 2005), ou simplesmente MIRACL, é uma biblioteca de números grandes que contém as rotinas necessárias para implementar algoritmos assimétricos como RSA e ECDSA. É desenvolvida pela Shamus Software Ltd. e é livre para fins não lucrativos: qualquer uso comercial requer uma licença a ser obtida da Shamus. A MIRACL é implementada como uma biblioteca C, mas um wrapper C++ é fornecido. A documentação consiste do manual de usuário, que descreve a instalação, otimização, representação interna, interface C++ e as rotinas MIRACL. A biblioteca vem com vários exemplos (tanto em C como em C++), os quais são muito úteis, uma vez que a API não é muito intuitiva. Bons conhecimentos criptográficos são necessários para construir as primitivas a partir das rotinas de baixo nível fornecidas, ou para adaptar os exemplos para necessidades específicas. Das bibliotecas avaliadas, a MIRACL é a mais rápida de todas, o que é resultado da implementação de rotinas críticas em linguagem Assembly. A biblioteca fornece versões Assembly para algumas plataformas e também código C genérico para os casos em que o código Assembly não está disponível. Para curvas definidas sobre corpos primos, é possível melhorar o desempenho ainda mais, gerando-se uma biblioteca especificamente otimizada para o corpo desejado. Nesse caso, uma pequena degradação de desempenho pode ocorrer, caso a biblioteca seja utilizada para um corpo de diferente ordem. De acordo com a documentação, a MIRACL pode ser instalada com sucesso nas plataformas VAX 11/780, estações de trabalho Unix, IBM PC, computadores baseados em ARM, Apple Macintosh, Itanium e AMD 64 bits. Em nosso caso, as bibliotecas foram facilmente portadas para Pentium 4 e xScale executando Linux. A MIRACL suporta a cifra de blocos AES e a família de funções de hash criptográficas SHA-2. 135 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas Os algoritmos de geração e verificação de assinaturas ECDSA podem ser facilmente adaptados a partir do conjunto de exemplos fornecidos. Podem ser utilizadas curvas definidas sobre corpos primos e binários e alguns parâmetros de domínio são fornecidos previamente em arquivos. Esses parâmetros podem ser carregados pela função ECP_DOMAIN_INIT, que também pode pré-calcular alguns pontos, se desejado. Os pontos podem ser representados em coordenadas afins ou projetivas e a multiplicação de pontos pode ser acelerada pelo método de janela fixa de autoria de Brickell et al (1992). 2.6. OpenSSL (Versão 0.9.8) OpenSSL (OpenSSL Project, 2005) é uma biblioteca criptográfica de código aberto disponibilizada sob uma licença do tipo BSD. Suporta os algoritmos ECDSA e ECDH para todas as curvas binárias e primas padronizadas por NIST, ANSI e SECG. É escrita em linguagem C e possui rotinas em Assembly para diversos processadores, conseguindo, dessa maneira, um ótimo desempenho em uma grande gama de plataformas. A multiplicação escalar pode ser otimizada por meio da précomputação de pontos e usa o método wNAF com largura 4. A documentação da biblioteca ainda não está completamente pronta. O tópico sobre ECDSA descreve a funcionalidade dos procedimentos e seus parâmetros e inclui um código de exemplo mostrando como assinar uma mensagem e verificar a assinatura. A interface é simples e podem-se escrever aplicações usando ECDSA com base no manual e no programa speed. O ECDH não é documentado, mas o programa speed mostra um exemplo de uso simples. Embora o grupo da OpenSSL não tenha incluído um makefile na distribuição, a biblioteca possui um sistema de geração maduro, que funciona em um grande número de plataformas. É possível excluir alguns algoritmos por meio do script configure. A compilação em Pentium 4 foi trivial, mas um patch foi necessário para xScale. 3. Testes de desempenho 3.1. Plataformas As seguintes plataformas foram utilizadas para testar o desempenho das bibliotecas avaliadas: 1. Intel Pentium 4 2.80 GHz, 512 MB RAM, Linux Kernel 2.4.20.8, gcc 3.2.2 e g++ versão 3.2.2. 2. Intel PXA27x 520 MHz, 64MB RAM, Linux Kernel 2.6.11.8, arm-Linux-gcc 3.4.3 e armLinux-g++ 3.4.3. 3.2. Metodologia de teste Os testes avaliaram o desempenho dos procedimentos de geração (com e sem précomputação) e verificação de assinaturas ECDSA1. Mensagens de tamanho fixo foram usadas, correspondendo a exatamente um bloco da função de hash criptográfica SHA-1. Com essa abordagem, objetivou-se minimizar a influência do cálculo de resumos criptográficos nos tempos medidos para a geração e a verificação de assinaturas ECDSA. Para cada iteração, gerou-se um par de chaves, embora os testes tenham demonstrado que a utilização de um único par de chaves não acarretaria mudanças substanciais nos tempos obtidos. Para cada biblioteca, foram coletadas cinco rodadas de tempos para todas as curvas definidas pelo padrão SEC 2. Cada rodada executou os três procedimentos acima 2 mencionados um determinado número de vezes (dependente de plataforma). Como a plataforma xScale possui freqüência muito inferior à do Pentium 4, foi necessário utilizar um número reduzido de iterações para ela. O número de iterações para cada plataforma foi definido com base no desempenho da OpenSSL: cem repetições para xScale e mil para Pentium 4. 3.3. Comparação de desempenho Os resultados para as curvas primas (P) e binárias (B) do NIST estão consolidados nas Tabelas 2 e 3, respectivamente. Como os tempos para as curvas B e K foram muito similares, não se incluiu uma tabela com os valores desta última no presente trabalho. Por esse fato, também, concluiu-se que nenhuma otimização em especial é implementada pelas bibliotecas para acelerar a computação em curvas de Koblitz. Os rótulos das colunas A, AP e V significam geração de assinatura, geração de assinatura com pré-cálculo e verificação de assinatura, respectivamente. Cada célula da tabela corresponde à média dos tempos coletados nas 1 O desempenho do ECDH e do ECIES podem ser estimados pelo desempenho do ECDSA. No caso da biblioteca LiDIA, foi medido o tempo da multiplicação escalar, que pode ser tomado como uma boa estimativa do tempo de execução da geração de assinatura ECDSA. 2 136 Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas Figura 1 Tempos (em ms) para geração de assinatura sem pré-computação em Pentium 4 Figura 2 Tempo (em ms) para geração de assinatura sem pré-computação em xScale cinco rodadas realizadas para a tripla (biblioteca, curva, operação). Verificou-se se o desvio padrão era pequeno, uma vez que valores altos podem ser um indicativo da existência de bugs na implementação. Quando a operação ou a característica do corpo não é suportada, a célula é deixada em branco. Os melhores tempos para cada curva/operação aparecem em negrito. Para comparar visualmente os resultados das bibliotecas, os tempos para geração de assinaturas Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 sem pré-computação também estão consolidados nas Figuras 1 e 2 para as plataformas Pentium 4 e xScale, respectivamente. Pode-se ver pelos gráficos que, conforme o tamanho do corpo aumenta, os tempos também aumentam. Como o desempenho de Crypto++ para curvas binárias não aumenta monotonicamente (depende de o polinômio irredutível ser um trinômio ou um pentanômio), foram usadas linhas tracejadas para representá-la. 137 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas De um modo geral, a melhor biblioteca foi a MIRACL, que apresentou o melhor desempenho em quase todos os testes, em ambas as plataformas, sendo superada pela OpenSSL somente em dois de todos os testes. A MIRACL foi compilada usando-se código especializado em Assembly para xScale e x86 e isso fez toda a diferença. A segunda melhor biblioteca é a OpenSSL, que possui código especializado em Assembly para aritmética de inteiros no x86. Entretanto, mesmo com essas otimizações, a OpenSSL é cerca de 50% mais lenta que a MIRACL para a geração e a verificação de assinaturas empregando-se curvas primas. Somente quando a pré-computação é utilizada, o desempenho dessas bibliotecas se torna relativamente próximo. Considerando-se curvas primas em xScale e curvas binárias em ambas as plataformas, a superioridade da MIRACL sobre a OpenSSL é notável. As outras três bibliotecas, LibTomCrypt, Crypto++ e LiDIA apresentaram desempenho muito pior que a MIRACL e a OpenSSL. Para curvas primas, a LibTomCrypt foi a que melhor se saiu entre as bibliotecas desse grupo. É de se notar que LiDIA + GMP, que é apenas uma biblioteca de teoria de números computacional, superou amplamente a Crypto++ sobre corpos binários. 5. Esta última é incrivelmente lenta para os corpos cujos polinômios irredutíveis são pentanômios. O desempenho é tão ruim que a Crypto++ chega a ficar atrás das bibliotecas escritas em Java (Reis e Uto, 2005). Finalmente, a combinação de LiDIA com cln e libI não é tão boa quanto com GMP. O comentário final é que, de um modo geral, curvas definidas sobre corpos primos apresentam desempenho superior, principalmente para corpos maiores. Por exemplo, comparando-se os tempos de assinatura para as curvas P-521 e B-571, usando a MIRACL em um Pentium 4, a diferença é de três vezes. 4. Conclusões Neste trabalho, foram avaliadas diferentes opções para integrar criptografia de curvas elípticas em aplicações, considerando-se as plataformas xScale e Pentium 4. Há alguns produtos maduros com bom desempenho, mas o “campeão geral” foi a biblioteca MIRACL, com o melhor desempenho e com um bom suporte a várias plataformas. A OpenSSL é, em média, 50% mais lentsa que a MIRACL, mas é livre para uso comercial e possui o melhor suporte a curvas padronizadas. Referências BRICKELL, E.; GORDON, D.; MCCURLEY, K.; WILSON, D. Fast exponentiation with precomputation. In: Eurocrypt 1992; 1992. Anais... pp. 200-207. DAI, W. Crypto++: a free C++ class library of cryptographic scheme; versão 5.2.1; 2005. Disponível em <http://www.cryptopp.com>. DRAGONGATE TECHNOLOGIES LTD. borZoi Manual. 2003. LIBTOMCRYPT. Versão 1.0.5. 2005. Disponível em <http://libtomcrypt.org>. OPENSSL PROJECT. OpenSSL 0.9.8. 2005. Disponível em <http://www.openssl.org>. REIS, D.; UTO, N. A Survey of Cryptographic Libraries Supporting Elliptic Curve Cryptography. In: 3er Congreso Iberoamericano de Seguridad Informática; 2005. HAMDY, S. LiDIA: A library for computational number theory – Reference Manual.Technische Universität Darmstadt, 2004. SHAMUS SOFTWARE LTD. MIRACL Users Manual. 2005. A. GPL IEEE Lista de acrônimos AES AMD ANSI BSD DSA ECC ECDH ECIES ECMQV FIPS GNU 138 Advanced Encryption Standard Advanced Micro Devices American National Standards Institute Berkeley Software Distribution Digital Signature Algorithm Elliptic Curve Cryptography Elliptic Curve Diffie-Hellman Elliptic Curve Integrated Encryption Scheme Elliptic Curve Menezes-Qu-Vanstone Federal Information Processing Standards GNU’s Not UNIX General Public License Institute of Electrical and Electronics Engineers MIRACL Multiprecision Integer and Rational Arithmetic C Library NIST National Institute of Standards and Technology POSIX Portable Operating System Interface for UNIX RSA Rivest-Shamir-Adleman SECG Standards for Efficient Cryptography Group SHA-1 Secure Hashing Algorithm 1 SHA-2 Secure Hashing Algorithm 2 Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas B. Curvas suportadas A tabela a seguir mostra as curvas pré-especificadas definidas por cada biblioteca. Tabela 1 Curvas pré-especificadas Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 139 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas Tabela 2 Tempos (em ms) para as curvas elípticas do NIST definidas sobre corpos primos Tabela 3 Tempos (em ms) para as curvas elípticas do NIST definidas sobre corpos binários 140 Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 Um survey sobre bibliotecas criptográficas com suporte à criptografia de curvas elípticas Abstract Elliptic Curve Cryptography (ECC) has emerged as an important alternative to RSA cryptosystem. It has faster key generation and signing procedures and requires smaller parameters to provide the same degree of security compared to RSA. There are various open-source libraries available today that can be used to secure new applications using ECC. However, it is not a simple task to assess which one is best for a specific case. To help with this decision, this paper evaluates six libraries supporting ECC, providing information about performance, portability and documentation. Key word: ECC. Elliptic Curve Cryptography. Cryptographic libraries. Performance comparison. ECDSA. Cad. CPqD Tecnologia, Campinas, v. 1, n. 1, p. 133-141, jan./dez. 2005 141