1 / 20

Projeto de Criptografia

Projeto de Criptografia. Jorge Ferraz (jfof) Marcus Vinicius (mvgs). Dois Projetos. Implementação de um esquema de assinatura digital utilizando-se das classes comuns de java (pacote java.math) Implementação do esquema de assinatura digital, usando classes alto nível (pacote java.security);.

luyu
Télécharger la présentation

Projeto de Criptografia

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Projeto de Criptografia Jorge Ferraz (jfof) Marcus Vinicius (mvgs)

  2. Dois Projetos • Implementação de um esquema de assinatura digital utilizando-se das classes comuns de java (pacote java.math) • Implementação do esquema de assinatura digital, usando classes alto nível (pacote java.security);

  3. Primeiro • java.math: • classe BigInteger: • Representação Binária; • Operações comuns sobre inteiros; • Operações sobre bits; • Operações de aritmética modular; • Geração de números primos;

  4. Primeiro • Algoritmo RSA • Rivest, Shamir, Adleman • Sistema de Chaves Assimétricas • Resistente (difícil de quebrar) • Exponenciação e aritmética modular

  5. Algoritmo RSA a)      Um número p, primo; b)      Um número q, igualmente primo; c)      Um número N (módulo), tal que N = p * q; d)      Um número e (expoente); e e)      Um número d (expoente), tais que e * d mod[(p-1)(q-1)] = 1

  6. RSA – classe java public RSA(int bitlen) { SecureRandom r = new SecureRandom(); p = new BigInteger(bitlen / 2, 100, r); q = new BigInteger(bitlen / 2, 100, r); n = p.multiply(q); BigInteger m = (p.subtract(BigInteger.ONE)) .multiply(q.subtract(BigInteger.ONE)); e = new BigInteger("3"); while(m.gcd(e).intValue() > 1) e = e.add(new BigInteger("2")); d = e.modInverse(m); }

  7. Considerações sobre a classe acima • O problema de geração de números primos – resolvido pela classe BigInteger de java. O construtor utilizado produz um número primo do tamanho desejado com uma probabilidade de 1 – 1/2100 • Igualmente, as demais funções da classe – GCD (Máximo Divisor Comum) e operadores de aritmética modular – tornam simples a geração dos demais números.

  8. Assinatura Digital • Problema da autenticidade • Autenticação (o destinatário deve ser capaz de checar a assinatura) • Integridade (a assinatura deve ser não-falsificável) • Não-Repúdio (o remetente não pode negar sua autenticidade)

  9. Dois paradigmas implementados • Trapdoor (utilização direta do algoritmo RSA) • Hash Then Invert (utilização de uma função Hash nos algoritmos de assinatura e verificação)

  10. TrapDoor • Extremamente Vulnerável • Consegue-se produzir falsificações com grande facilidade

  11. Solução: Hash-Then-Invert • Utilização de uma Função Hash antes da aplicação do RSA

  12. Na Implementação... • Foi utilizada uma implementação da função SHA1 • Freenet by Ian Clarke (02-02-2000) public class SHA1 { ... public String doHash(String s); }

  13. No final das contas • Percebemos que a utilização da Função Hash garante uma melhoria enorme do sistema. • Os Forgers que quebravam o TrapDoor passam a não mais quebrar o Hash-Then-Invert • Ao mesmo tempo, a mesma não acarreta um overhead computacional muito grande

  14. Segundo • Utilizando package java.security; • Define uma maneira simples de utilizar os algoritmos de segurança; • Porém não fornece uma implementação dos mesmo – necessidade de utilizar Provider’s de terceiros; • A utilização dos algoritmos – dado que eles estão prontos – é feita em poucas linhas de código.

  15. Segundo Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyPairGenerator kpg; KeyPair kp; kpg = KeyPairGenerator.getInstance("RSA", "BC"); kpg.initialize(512); kp = kpg.genKeyPair();

  16. Segundo ASSINATURA publicbyte[] Assinatura(){ Signature sig = Signature.getInstance("MD5withRSA", "BC"); /* Initialize for signing */ sig.initSign(kp.getPrivate()); /* Process the document */ sig.update(mensagemchar); /* Sign it */ return sig.sign(); }

  17. Segundo VERIFICAÇÃO publicboolean Verificar() { /* Get Signature object */ Signature sig = Signature.getInstance("MD5withRSA", "BC"); /* Initialize for verifying */ sig.initVerify(kp.getPublic()); /* Process the document */ sig.update(mensagemchar); /* Verify authenticity */ return sig.verify(assinatura); }

  18. Segundo • Fizemos uma pequena simulação:

  19. Segundo • Problemas: • Conversões de String para byte[]; • É necessário conhecer muito bem a linguagem para poder garantir as propriedades de segurança da aplicação; • A partir do que foi exercitado, fica simples adicionar segurança a uma aplicação java.

  20. Referências • Artigo sobre java.security: http://java.sun.com/developer/technicalArticles/Security/Crypto/ • Endereço do provider gratuito: http://www.bouncycastle.org/ • Notas de aula • Capítulo 8 • Capítulo 12

More Related