Java Cryptography Architecture e Java Cryptography Extension

Introdução
   Este Artigo trata exclusivamente de fornecer ao leitor uma visão geral dessas duas APIs, apresentando de forma rápida a sua arquitetura e funcionamento, também serão apresentados pequenos trechos de código demonstrando os principais serviços criptográficos existentes.

JCA / JCE
  
    As funcionalidades básicas relacionadas a criptografia em Java estão disponiveis na Java Cryptography Extension (JCE) e na sua irmã Java Cryptography Extension (JCE),  a diferença entre elas está em questões históricas relacionadas exportação de algoritimos criptográficos, principalmente patentes desses algorítimos, contudo, pode-se dizer que com a  JCA você obtem serviços como: MessageDigest,  Security, KeyFactory, KeyPair, SecureRandom, and Provider classes. Já a JCE  estende a JCA  adicionando serviços, como: Cipher, CipherIn/OutputStream, KeyGenerator, SecretKeyFactory, SealedObject, KeyAgreement and Mac classes.

Arquitetura baseada em provedor de serviços criptográficos
   As classes e interfaces que compoem a JCA/JCE foram criadas com intuito de serem extremamente extensiveis, em outras palavras, forma criadas para permitir que sejam adicionadas implementações de diferentes fornecedores, daí o porque de se dizer que a arquitetura JCA/JCE é “provider-based”.
   Olhando a figura1, logo abaixo, dá pra perceber que o código da aplicação fica escondido da implementação especifica do provedor, acessando apenas classes e interfaces da JCA/JCE.

Figura 1. Visão geral da arquitetura baseada em provedor.

Principais funcionalidades da JCA/JCE

  • Cipher – cifra.
  • CipherInputStream/CipherOutputStream/SealedObject – Abstrações de alto nível sobre objectos de cifra.
  • SecureRandom – gerador de números aleatórios seguro.
  • KeyGenerator/KeyPairGenerator – geradores de chaves.
  • KeyFactory – conversão de formatos para chaves.
  • KeyAgreement – acordo de chaves.
  • AlgorithmParameterGenerator – gerador de parâmetros (a serem passados a outros objectos, como cifras…).
  • MessageDigest/MAC — funções de hash criptográficas, MACs.
  • Signature — assinaturas digitais.
  • X509Certificate — certificados X509.


Providers Existentes


      Segue uma lista de alguns providers disponíveis :

Instalando um provider

      A instalação de um provider pode ser feita de duas formas, estaticamente ou dinamicamente, para esse exemplo estou utilizando o Bouncy Castle provider, vejamos então essas duas formas:


Instalação dinamica

  • Realize o import
     import org.bouncycastle.jce.provider.BouncyCastleProvider; 
  • Adicione a seguinte linha de código no seu programa, antes de usar qualquer função criptográfica.
     Security.addProvider(new BouncyCastleProvider()); 
 

Instalação estática

  • Para instalar estaticamente você precisará adicionar uma entrada ao arquivo  java.security   qual está localizado em $JAVA_HOME/jre/lib/security/java.security.
  • Procure or uma lista de linhas parecidas com security.provider.X, onde X é algum número ao final da ultima linha adicione:

       security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider, onde N é o ultimo número da lista.
 

Exemplo de código

      No exemplo abaixo, estou o utilizando o algorítimo DES ( Chave Simétrica ) para encriptar e decriptar a frase: “Tomar café faz muito bem a saúde”.


package com.blogsport.thecodingoflife.bc.padding;

import java.security.*;
import javax.crypto.*;

public class PrivateExample {
  
   public static void main (String[] args) throws Exception {
       //
       // Check args and get plaintext
       byte[] plainText = “Tomar café faz muito bem a saúde“.getBytes(“UTF8”);
       //
       // Get a DES private key
       System.out.println( “\nStart generating DES key” );
       KeyGenerator keyGen = KeyGenerator.getInstance(“DES”);
      
       // If you do not initialize the KeyGenerator, each provider supply a default initialization.
       keyGen.init(56);
       Key key = keyGen.generateKey();
       System.out.println( “Finish generating DES key” );
       //
       // Creates the DES Cipher object (specifying the algorithm, mode, and padding).
       Cipher cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”);
       // Print the provider information      
       System.out.println( “\n” + cipher.getProvider().getInfo() );
       //
       System.out.println( “\nStart encryption” );
       // Initializes the Cipher object.
       cipher.init(Cipher.ENCRYPT_MODE, key);
       // Encrypt the plaintext using the public key
       byte[] cipherText = cipher.doFinal(plainText);
       System.out.println( “Finish encryption: ” );
       System.out.println( new String(cipherText, “UTF8”) );
       //
       System.out.println( “\nStart decryption” );
       // Initializes the Cipher object.
       cipher.init(Cipher.DECRYPT_MODE, key);
       // Decrypt the ciphertext using the same key
       byte[] newPlainText = cipher.doFinal(cipherText);
       System.out.println( “Finish decryption: ” );
       System.out.println( new String(newPlainText, “UTF8”) );
   }
}

Saída



Start generating DES key
Finish generating DES key

SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)

Start encryption
Finish encryption:
??_6f??<@
?shO? n?^5?”??? ??#* ?Ht?? )

Start decryption
Finish decryption:
Tomar café faz muito bem a saúde

Conclusao

    Em vista dos argumentos apresentados, pode-se dizer que a plataforma Java fornece os subsidios necessários para se trabalhar com criptografia. Através das APIs JCA e JCE e a escolha de um bom provedor de serviços criptográficos o desenvolvedor consegue alcançar uma gama enorme de opções na hora de implementar uma solução que envolva criptografia.

Referencias

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s