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 :
- SUN provider que vem com a JCA.
- SunJCE que vem com a JCE.
- Cryptix ( http://www.cryptix.org/ )
- BouncyCastle ( http://www.bouncycastle.org/ )
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
Referencias
|
|