200 likes | 294 Vues
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);.
E N D
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);
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;
Primeiro • Algoritmo RSA • Rivest, Shamir, Adleman • Sistema de Chaves Assimétricas • Resistente (difícil de quebrar) • Exponenciação e aritmética modular
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
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); }
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.
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)
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)
TrapDoor • Extremamente Vulnerável • Consegue-se produzir falsificações com grande facilidade
Solução: Hash-Then-Invert • Utilização de uma Função Hash antes da aplicação do RSA
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); }
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
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.
Segundo Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyPairGenerator kpg; KeyPair kp; kpg = KeyPairGenerator.getInstance("RSA", "BC"); kpg.initialize(512); kp = kpg.genKeyPair();
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(); }
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); }
Segundo • Fizemos uma pequena simulação:
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.
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