Criptografia Java - Guia rápido
A criptografia é a arte e a ciência de fazer um criptosistema capaz de fornecer segurança às informações.
A criptografia lida com a proteção real dos dados digitais. Refere-se ao projeto de mecanismos baseados em algoritmos matemáticos que fornecem serviços fundamentais de segurança da informação. Você pode pensar na criptografia como o estabelecimento de um grande kit de ferramentas contendo diferentes técnicas em aplicativos de segurança.
O que é criptoanálise?
A arte e a ciência de quebrar o texto cifrado são conhecidas como criptoanálise.
A criptoanálise é o ramo irmão da criptografia e ambos coexistem. O processo criptográfico resulta no texto cifrado para transmissão ou armazenamento. Envolve o estudo de mecanismos criptográficos com a intenção de quebrá-los. A criptoanálise também é usada durante o projeto das novas técnicas criptográficas para testar seus pontos fortes de segurança.
Primitivas de criptografia
As primitivas de criptografia nada mais são do que as ferramentas e técnicas de criptografia que podem ser usadas seletivamente para fornecer um conjunto de serviços de segurança desejados -
- Encryption
- Funções de hash
- Códigos de autenticação de mensagem (MAC)
- Assinaturas digitais
Criptografia em Java
A Java Cryptography Architecture (JCA) é um conjunto de APIs para implementar conceitos de criptografia moderna, como assinaturas digitais, resumos de mensagens, certificados, criptografia, geração e gerenciamento de chaves e geração segura de números aleatórios etc.
Usando JCA, os desenvolvedores podem construir seus aplicativos integrando segurança neles.
Para integrar a segurança em seus aplicativos, em vez de depender dos complicados algoritmos de segurança, você pode facilmente chamar as respectivas APIs fornecidas no JCA para os serviços necessários.
As funções de hash são extremamente úteis e aparecem em quase todos os aplicativos de segurança da informação.
Uma função hash é uma função matemática que converte um valor de entrada numérico em outro valor numérico compactado. A entrada para a função hash é de comprimento arbitrário, mas a saída é sempre de comprimento fixo.
Os valores retornados por uma função hash são chamados message digest ou simplesmente hash values. A seguinte imagem ilustrou a função hash.
Java fornece uma classe chamada MessageDigestque pertence ao pacote java.security. Esta classe oferece suporte a algoritmos como SHA-1, SHA 256, algoritmos MD5 para converter uma mensagem de comprimento arbitrário em um resumo de mensagem.
Para converter uma determinada mensagem em um resumo da mensagem, siga as etapas abaixo -
Etapa 1: Criar um objeto MessageDigest
A classe MessageDigest fornece um método chamado getInstance(). Este método aceita uma variável String especificando o nome do algoritmo a ser usado e retorna um objeto MessageDigest implementando o algoritmo especificado.
Crie o objeto MessageDigest usando o getInstance() método conforme mostrado abaixo.
MessageDigest md = MessageDigest.getInstance("SHA-256");
Etapa 2: passe os dados para o objeto MessageDigest criado
Depois de criar o objeto de resumo da mensagem, você precisa passar a mensagem / dados para ele. Você pode fazer isso usando oupdate() método do MessageDigest , este método aceita uma matriz de bytes que representa a mensagem e a adiciona / passa para o objeto MessageDigest criado acima.
md.update(msg.getBytes());
Etapa 3: gerar o resumo da mensagem
Você pode gerar o resumo da mensagem usando o digest() método da classe MessageDigest esse método calcula a função hash no objeto atual e retorna o resumo da mensagem na forma de uma matriz de bytes.
Gere o resumo da mensagem usando o método digest.
byte[] digest = md.digest();
Exemplo
A seguir está um exemplo que lê dados de um arquivo e gera um resumo da mensagem e o imprime.
import java.security.MessageDigest;
import java.util.Scanner;
public class MessageDigestExample {
public static void main(String args[]) throws Exception{
//Reading data from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter the message");
String message = sc.nextLine();
//Creating the MessageDigest object
MessageDigest md = MessageDigest.getInstance("SHA-256");
//Passing data to the created MessageDigest Object
md.update(message.getBytes());
//Compute the message digest
byte[] digest = md.digest();
System.out.println(digest);
//Converting the byte array in to HexString format
StringBuffer hexString = new StringBuffer();
for (int i = 0;i<digest.length;i++) {
hexString.append(Integer.toHexString(0xFF & digest[i]));
}
System.out.println("Hex format : " + hexString.toString());
}
}
Resultado
O programa acima gera a seguinte saída -
Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3
MAC (Mensaio Aautenticação Code) o algoritmo é uma técnica criptográfica de chave simétrica para fornecer autenticação de mensagens. Para estabelecer o processo MAC, o emissor e o receptor compartilham uma chave simétrica K.
Essencialmente, um MAC é uma soma de verificação criptografada gerada na mensagem subjacente que é enviada junto com uma mensagem para garantir a autenticação da mensagem.
O processo de uso do MAC para autenticação é descrito na ilustração a seguir -
Em Java o Mac classe do javax.cryptopacote fornece a funcionalidade de código de autenticação de mensagem. Siga as etapas fornecidas abaixo para criar o código de autenticação de mensagem usando esta classe.
Etapa 1: Criar um objeto KeyGenerator
o KeyGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um KeyGenerator objeto que gera chaves secretas.
Crio KeyGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
Etapa 2: Criar objeto SecureRandom
o SecureRandom classe do java.SecurityO pacote fornece um gerador de número aleatório forte que é usado para gerar números aleatórios em Java. Instancie esta classe conforme mostrado abaixo.
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
Etapa 3: inicializar o KeyGenerator
o KeyGenerator classe fornece um método chamado init() este método aceita o SecureRandom objeto e inicializa o atual KeyGenerator.
Inicialize o objeto KeyGenerator criado na etapa anterior usando este método.
//Initializing the KeyGenerator
keyGen.init(secRandom);
Etapa 4: Gerar chave
Gerar chave usando generateKey() método do KeyGenerator classe como mostrado abaixo.
//Creating/Generating a key
Key key = keyGen.generateKey();
Etapa 5: inicializar o objeto Mac
o init() método da classe Mac aceita um objeto Key e inicializa o objeto Mac atual usando a chave fornecida.
//Initializing the Mac object
mac.init(key);
Etapa 6: Conclua a operação do mac
o doFinal()método da classe Mac é usado para terminar a operação Mac. Passe os dados necessários na forma de array de bytes para este método e finalize a operação conforme mostrado abaixo.
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
Exemplo
O exemplo a seguir demonstra a geração do Message Authentication Code (MAC) usando JCA. Aqui, pegamos uma mensagem simples "Olá, tudo bem" e geramos um Mac para essa mensagem.
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
public class MacSample {
public static void main(String args[]) throws Exception{
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
//Initializing the KeyGenerator
keyGen.init(secRandom);
//Creating/Generating a key
Key key = keyGen.generateKey();
//Creating a Mac object
Mac mac = Mac.getInstance("HmacSHA256");
//Initializing the Mac object
mac.init(key);
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
System.out.println("Mac result:");
System.out.println(new String(macResult));
}
}
Resultado
O programa acima irá gerar a seguinte saída -
Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?
Um criptosistema é uma implementação de técnicas criptográficas e sua infraestrutura de acompanhamento para fornecer serviços de segurança da informação. Um criptosistema também é conhecido como umcipher system.
Os vários componentes de um criptosistema básico são Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Chave de criptografia e Chave de descriptografia.
Onde,
Encryption Keyé um valor conhecido pelo remetente. O remetente insere a chave de criptografia no algoritmo de criptografia junto com o texto simples para calcular o texto cifrado.
Decryption Keyé um valor conhecido pelo receptor. A chave de descriptografia está relacionada à chave de criptografia, mas nem sempre é idêntica a ela. O receptor insere a chave de descriptografia no algoritmo de descriptografia junto com o texto cifrado para calcular o texto simples.
Fundamentalmente, existem dois tipos de chaves / criptosistemas baseados no tipo de algoritmos de criptografia-descriptografia.
Criptografia de chave simétrica
O processo de criptografia onde same keys are used for encrypting and decrypting as informações são conhecidas como criptografia de chave simétrica.
O estudo de criptosistemas simétricos é referido como symmetric cryptography. Os criptossistemas simétricos também são às vezes referidos comosecret key cryptosystems.
A seguir estão alguns exemplos comuns de criptografia de chave simétrica -
- Padrão de criptografia digital (DES)
- Triple-DES (3DES)
- IDEA
- BLOWFISH
Criptografia de chave assimétrica
O processo de criptografia onde different keys are used for encrypting and decrypting the informationé conhecido como criptografia de chave assimétrica. Embora as chaves sejam diferentes, elas estão matematicamente relacionadas e, portanto, é possível recuperar o texto simples descriptografando o texto cifrado.
As chaves e certificados utilizados / gerados são armazenados em um banco de dados denominado keystore. Por padrão, este banco de dados é armazenado em um arquivo chamado.keystore.
Você pode acessar o conteúdo deste banco de dados usando o KeyStore classe do java.securitypacote. Isso gerencia três entradas diferentes, a saber, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
Armazenamento de uma chave no armazenamento de chaves
Nesta seção, aprenderemos como armazenar uma chave em um armazenamento de chaves. Para armazenar uma chave no armazenamento de chaves, siga as etapas fornecidas abaixo.
Etapa 1: Criar um objeto KeyStore
o getInstance() método do KeyStore classe do java.security pacote aceita um valor de string que representa o tipo de armazenamento de chaves e retorna um objeto KeyStore.
Crie um objeto da classe KeyStore usando o getInstance() método conforme mostrado abaixo.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Etapa 2: carregar o objeto KeyStore
o load() O método da classe KeyStore aceita um objeto FileInputStream que representa o arquivo keystore e um parâmetro String que especifica a senha do KeyStore.
Em geral, o KeyStore é armazenado no arquivo denominado cacerts, no local C:/Program Files/Java/jre1.8.0_101/lib/security/ e sua senha padrão é changeit, carregue-o usando o load() método conforme mostrado abaixo.
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
Etapa 3: Crie o objeto KeyStore.ProtectionParameter
Instancie o KeyStore.ProtectionParameter conforme mostrado abaixo.
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
Etapa 4: crie um objeto SecretKey
Crie o SecretKey objeto (interface) instanciando sua Subclasse SecretKeySpec. Durante a instanciação, você precisa passar a senha e o algoritmo como parâmetros para seu construtor, conforme mostrado abaixo.
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
Etapa 5: crie um objeto SecretKeyEntry
Crie um objeto do SecretKeyEntry classe passando no SecretKey objeto criado na etapa acima, conforme mostrado abaixo.
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
Etapa 6: definir uma entrada para o KeyStore
o setEntry() método do KeyStore classe aceita um parâmetro String que representa o alias de entrada do keystore, um SecretKeyEntry objeto, um objeto ProtectionParameter e, armazena a entrada no alias fornecido.
Defina a entrada para o armazenamento de chaves usando o setEntry() método conforme mostrado abaixo.
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
Example
O exemplo a seguir armazena as chaves no armazenamento de chaves existente no arquivo “cacerts” (sistema operacional Windows 10).
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class StoringIntoKeyStore{
public static void main(String args[]) throws Exception {
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
//Storing the KeyStore object
java.io.FileOutputStream fos = null;
fos = new java.io.FileOutputStream("newKeyStoreName");
keyStore.store(fos, password);
System.out.println("data stored");
}
}
Output
O programa acima gera a seguinte saída -
System.out.println("data stored");
Neste capítulo, aprenderemos como recuperar uma chave do armazenamento de chaves usando a criptografia Java.
Para recuperar uma chave do armazenamento de chaves, siga as etapas fornecidas abaixo.
Etapa 1: Criar um objeto KeyStore
o getInstance() método do KeyStore classe do java.security pacote aceita um valor de string que representa o tipo de armazenamento de chaves e retorna um objeto KeyStore.
Crie um objeto da classe KeyStore usando este método conforme mostrado abaixo.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Etapa 2: carregar o objeto KeyStore
o load() método da classe KeyStore aceita um FileInputStream objeto que representa o arquivo keystore e um parâmetro String especificando a senha do KeyStore.
Em geral, o KeyStore é armazenado no arquivo denominado cacerts, no local C:/Program Files/Java/jre1.8.0_101/lib/security/ e sua senha padrão é changeit, carregue-o usando o load() método conforme mostrado abaixo.
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
Etapa 3: Crie o objeto KeyStore.ProtectionParameter
Instancie o KeyStore.ProtectionParameter conforme mostrado abaixo.
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
Etapa 4: crie um objeto SecretKey
Crie o SecretKey objeto (interface) instanciando sua Subclasse SecretKeySpec. Durante a instanciação, você precisa passar a senha e o algoritmo como parâmetros para seu construtor, conforme mostrado abaixo.
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
Etapa 5: crie um objeto SecretKeyEntry
Crie um objeto do SecretKeyEntry classe passando no SecretKey objeto criado na etapa acima, conforme mostrado abaixo.
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
Etapa 6: definir uma entrada para o KeyStore
o setEntry() método do KeyStore classe aceita um parâmetro String que representa o alias de entrada do keystore, um SecretKeyEntry objeto, um objeto ProtectionParameter e, armazena a entrada no alias fornecido.
Defina a entrada para o armazenamento de chaves usando o setEntry() método conforme mostrado abaixo.
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
Etapa 7: Crie o objeto KeyStore.SecretKeyEntry
o getEntry() método da classe KeyStore aceita um alias (parâmetro String) e um objeto da classe ProtectionParameter como parâmetros e retorna um KeyStoreEntry objeto, então você pode lançá-lo em KeyStore.SecretKeyEntry objeto.
Crie um objeto da classe KeyStore.SecretKeyEntry passando o alias da chave necessária e o objeto de parâmetro de proteção criado nas etapas anteriores para o getEntry() método conforme mostrado abaixo.
//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
Etapa 8: Crie o objeto-chave da entrada recuperada
o getSecretKey() método do SecretKeyEntryclasse retorna um objeto SecretKey. Usando este método, crie um objeto SecretKey conforme mostrado abaixo.
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println(mysecretKey);
Exemplo
O exemplo a seguir mostra como recuperar chaves de um armazenamento de chaves. Aqui, armazenamos uma chave em um armazenamento de chaves, que está no arquivo "cacerts" (sistema operacional Windows 10), a recuperamos e exibimos algumas de suas propriedades, como o algoritmo usado para gerar a chave e, o formato de a chave recuperada.
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class RetrievingFromKeyStore{
public static void main(String args[]) throws Exception{
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
//Loading the the KeyStore object
char[] password = "changeit".toCharArray();
java.io.FileInputStream fis = new FileInputStream(
"C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
keyStore.load(fis, password);
//Creating the KeyStore.ProtectionParameter object
ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
//Creating SecretKeyEntry object
SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
//Storing the KeyStore object
java.io.FileOutputStream fos = null;
fos = new java.io.FileOutputStream("newKeyStoreName");
keyStore.store(fos, password);
//Creating the KeyStore.SecretKeyEntry object
SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());
System.out.println("Format used for the key: "+mysecretKey.getFormat());
}
}
Resultado
O programa acima gera a seguinte saída -
Algorithm used to generate key: DSA
Format of the key: RAW
Java fornece KeyGenerator classe esta classe é usada para gerar chaves secretas e os objetos desta classe são reutilizáveis.
Para gerar chaves usando a classe KeyGenerator, siga as etapas fornecidas a seguir.
Etapa 1: Criar um objeto KeyGenerator
o KeyGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyGenerator que gera chaves secretas.
Crio KeyGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
Etapa 2: Criar objeto SecureRandom
o SecureRandom classe do java.SecurityO pacote fornece um gerador de número aleatório forte que é usado para gerar números aleatórios em Java. Instancie esta classe conforme mostrado abaixo.
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
Etapa 3: inicializar o KeyGenerator
o KeyGenerator classe fornece um método chamado init() este método aceita o objeto SecureRandom e inicializa o atual KeyGenerator.
Inicialize o objeto KeyGenerator criado na etapa anterior usando o init() método.
//Initializing the KeyGenerator
keyGen.init(secRandom);
Exemplo
O exemplo a seguir demonstra a geração da chave secreta usando a classe KeyGenerator do javax.crypto pacote.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.SecureRandom;
public class KeyGeneratorExample {
public static void main(String args[]) throws Exception{
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
//Initializing the KeyGenerator
keyGen.init(secRandom);
//Creating/Generating a key
Key key = keyGen.generateKey();
System.out.println(key);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, key);
String msg = new String("Hi how are you");
byte[] bytes = cipher.doFinal(msg.getBytes());
System.out.println(bytes);
}
}
Resultado
O programa acima gera a seguinte saída -
com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4
Java fornece o KeyPairGeneratorclasse. Esta classe é usada para gerar pares de chaves públicas e privadas. Para gerar chaves usando oKeyPairGenerator classe, siga as etapas abaixo.
Etapa 1: Crie um objeto KeyPairGenerator
o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.
Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Etapa 2: inicializar o objeto KeyPairGenerator
o KeyPairGenerator classe fornece um método chamado initialize()este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.
Inicialize o objeto KeyPairGenerator criado na etapa anterior usando este método conforme mostrado abaixo.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Etapa 3: gerar o KeyPairGenerator
Você pode gerar o KeyPair usando o generateKeyPair() método do KeyPairGeneratorclasse. Gere o par de chaves usando este método conforme mostrado abaixo.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Etapa 4: Obtenha a chave privada / chave pública
Você pode obter a chave privada do objeto KeyPair gerado usando o getPrivate() método conforme mostrado abaixo.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Você pode obter a chave pública do objeto KeyPair gerado usando o getPublic() método conforme mostrado abaixo.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Exemplo
O exemplo a seguir demonstra a geração da chave secreta usando a classe KeyPairGenerator do javax.crypto pacote.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class KeyPairGenertor {
public static void main(String args[]) throws Exception{
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
//Generating the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
System.out.println("Keys generated");
}
}
Resultado
O programa acima gera a seguinte saída -
Keys generated
As assinaturas digitais permitem-nos verificar o autor, data e hora das assinaturas, autenticar o conteúdo da mensagem. Também inclui função de autenticação para recursos adicionais.
Vantagens da assinatura digital
Nesta seção, aprenderemos sobre os diferentes motivos que exigem o uso de assinatura digital. Existem várias razões para implementar assinaturas digitais para comunicações -
Autenticação
As assinaturas digitais ajudam a autenticar as fontes das mensagens. Por exemplo, se a filial de um banco enviar uma mensagem ao escritório central, solicitando a alteração do saldo de uma conta. Se o escritório central não puder autenticar que a mensagem foi enviada de uma fonte autorizada, atender a essa solicitação pode ser um erro grave.
Integridade
Assim que a mensagem for assinada, qualquer alteração na mensagem invalidará a assinatura.
Não repúdio
Por esta propriedade, qualquer entidade que tenha assinado alguma informação não pode mais tarde negar que a tenha assinado.
Criação da assinatura digital
Vamos agora aprender como criar uma assinatura digital. Você pode criar uma assinatura digital usando Java seguindo as etapas abaixo.
Etapa 1: Crie um objeto KeyPairGenerator
o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.
Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Etapa 2: inicializar o objeto KeyPairGenerator
o KeyPairGenerator classe fornece um método chamado initialize()este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.
Inicialize o objeto KeyPairGenerator criado na etapa anterior usando o initialize() método conforme mostrado abaixo.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Etapa 3: gerar o KeyPairGenerator
Você pode gerar o KeyPair usando o generateKeyPair()método. Gere o par de chaves usando ogenerateKeyPair() método conforme mostrado abaixo.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Etapa 4: obtenha a chave privada do par
Você pode obter a chave privada do objeto KeyPair gerado usando o getPrivate() método.
Obtenha a chave privada usando o getPrivate() método conforme mostrado abaixo.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Etapa 5: criar um objeto de assinatura
o getInstance() método do Signature classe aceita um parâmetro de string que representa o algoritmo de assinatura necessário e retorna o respectivo objeto de assinatura.
Crie um objeto da classe Signature usando o getInstance() método.
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
Etapa 6: inicializar o objeto de assinatura
o initSign() método da classe de assinatura aceita um PrivateKey objeto e inicializa o objeto de assinatura atual.
Inicialize o objeto de assinatura criado na etapa anterior usando o initSign() método conforme mostrado abaixo.
//Initialize the signature
sign.initSign(privKey);
Etapa 7: adicionar dados ao objeto de assinatura
o update() O método da classe de assinatura aceita uma matriz de bytes que representa os dados a serem assinados ou verificados e atualiza o objeto atual com os dados fornecidos.
Atualize o objeto de assinatura inicializado passando os dados a serem assinados para o update() método na forma de matriz de bytes, conforme mostrado abaixo.
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
Etapa 8: Calcule a assinatura
o sign() método do Signature classe retorna os bytes de assinatura dos dados atualizados.
Calcule a assinatura usando o sign() método conforme mostrado abaixo.
//Calculating the signature
byte[] signature = sign.sign();
Example
O programa Java seguinte aceita uma mensagem do usuário e gera uma assinatura digital para a mensagem fornecida.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class CreatingDigitalSignature {
public static void main(String args[]) throws Exception {
//Accepting text from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter some text");
String msg = sc.nextLine();
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initialize the signature
sign.initSign(privKey);
byte[] bytes = "msg".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Printing the signature
System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
}
}
Output
O programa acima gera a seguinte saída -
Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?
Você pode criar uma assinatura digital usando Java e verificá-la seguindo as etapas abaixo.
Etapa 1: Crie um objeto KeyPairGenerator
o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.
Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Etapa 2: inicializar o objeto KeyPairGenerator
o KeyPairGenerator classe fornece um método chamado initialize()método. Este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.
Inicialize o objeto KeyPairGenerator criado na etapa anterior usando o initialize() método conforme mostrado abaixo.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Etapa 3: gerar o KeyPairGenerator
Você pode gerar o KeyPair usando o generateKeyPair()método. Gere o par de chaves usando este método conforme mostrado abaixo.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Etapa 4: obtenha a chave privada do par
Você pode obter a chave privada do objeto KeyPair gerado usando o getPrivate() método.
Obtenha a chave privada usando o getPrivate() método conforme mostrado abaixo.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Etapa 5: criar um objeto de assinatura
o getInstance() método do Signature classe aceita um parâmetro de string que representa o algoritmo de assinatura necessário e retorna o respectivo objeto de assinatura.
Crie um objeto da classe Signature usando o getInstance() método.
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
Etapa 6: inicializar o objeto de assinatura
o initSign() método da classe de assinatura aceita um PrivateKey objeto e inicializa o objeto de assinatura atual.
Inicialize o objeto de assinatura criado na etapa anterior usando o initSign() método conforme mostrado abaixo.
//Initialize the signature
sign.initSign(privKey);
Etapa 7: adicionar dados ao objeto de assinatura
o update() O método da classe de assinatura aceita uma matriz de bytes que representa os dados a serem assinados ou verificados e atualiza o objeto atual com os dados fornecidos.
Atualize o objeto de assinatura inicializado passando os dados a serem assinados para o update() método na forma de matriz de bytes, conforme mostrado abaixo.
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
Etapa 8: Calcule a assinatura
o sign() método do Signature classe retorna os bytes de assinatura dos dados atualizados.
Calcule a assinatura usando o método sign () conforme mostrado abaixo.
//Calculating the signature
byte[] signature = sign.sign();
Etapa 9: inicializar o objeto de assinatura para verificação
Para verificar um objeto de assinatura, você precisa inicializá-lo primeiro usando o initVerify() método, este método aceita um PublicKey objeto.
Portanto, inicialize o objeto de assinatura para verificação usando o initVerify() método conforme mostrado abaixo.
//Initializing the signature
sign.initVerify(pair.getPublic());
Etapa 10: atualize os dados a serem verificados
Atualize o objeto inicializado (para verificação) com os dados - os dados a serem verificados usando o método de atualização conforme mostrado abaixo.
//Update the data to be verified
sign.update(bytes);
Etapa 11: verificar a assinatura
o verify()O método da classe Signature aceita outro objeto de assinatura e o verifica com o atual. Se ocorrer uma correspondência, ele retorna verdadeiro, caso contrário, ele retorna falso.
Verifique a assinatura usando este método conforme mostrado abaixo.
//Verify the signature
boolean bool = sign.verify(signature);
Exemplo
O programa Java seguinte aceita uma mensagem do usuário, gera uma assinatura digital para a mensagem fornecida e a verifica.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class SignatureVerification {
public static void main(String args[]) throws Exception{
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the privatekey from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initializing the signature
sign.initSign(privKey);
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Initializing the signature
sign.initVerify(pair.getPublic());
sign.update(bytes);
//Verifying the signature
boolean bool = sign.verify(signature);
if(bool) {
System.out.println("Signature verified");
} else {
System.out.println("Signature failed");
}
}
}
Resultado
O programa acima gera a seguinte saída -
Signature verified
Você pode criptografar dados fornecidos usando a classe Cipher do javax.cryptopacote. Siga as etapas fornecidas abaixo para criptografar dados fornecidos usando Java.
Etapa 1: Crie um objeto KeyPairGenerator
o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.
Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Etapa 2: inicializar o objeto KeyPairGenerator
o KeyPairGenerator classe fornece um método chamado initialize()este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.
Inicialize o objeto KeyPairGenerator criado na etapa anterior usando o initialize() método conforme mostrado abaixo.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Etapa 3: gerar o KeyPairGenerator
Você pode gerar o KeyPair usando o generateKeyPair() método do KeyPairGeneratorclasse. Gere o par de chaves usando este método conforme mostrado abaixo.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Etapa 4: Obtenha a chave pública
Você pode obter a chave pública do KeyPair objeto usando o getPublic() método conforme mostrado abaixo.
Obtenha a chave pública usando este método conforme mostrado abaixo.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Etapa 5: Criar um objeto Cipher
o getInstance() método de Cipher classe aceita uma variável String que representa a transformação necessária e retorna um objeto Cipher que implementa a transformação fornecida.
Crie o objeto Cipher usando o getInstance() método conforme mostrado abaixo.
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Etapa 6: inicializar o objeto Cipher
o init() método do Cipher A classe aceita dois parâmetros, um parâmetro inteiro que representa o modo de operação (criptografar / descriptografar) e um objeto Key que representa a chave pública.
Inicialize o objeto Cypher usando o init() método conforme mostrado abaixo.
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
Etapa 7: Adicionar dados ao objeto Cipher
o update() O método da classe Cipher aceita uma matriz de bytes que representa os dados a serem criptografados e atualiza o objeto atual com os dados fornecidos.
Atualize o objeto Cipher inicializado passando os dados para o update() método na forma de matriz de bytes, conforme mostrado abaixo.
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
Etapa 8: criptografar os dados
o doFinal()método da classe Cipher completa a operação de criptografia. Portanto, conclua a criptografia usando este método conforme mostrado abaixo.
//Encrypting the data
byte[] cipherText = cipher.doFinal();
Exemplo
O programa Java seguinte aceita texto do usuário, criptografa-o usando o algoritmo RSA e imprime o formato criptografado do texto fornecido.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
public class CipherSample {
public static void main(String args[]) throws Exception{
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withRSA");
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generating the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
//encrypting the data
byte[] cipherText = cipher.doFinal();
System.out.println(new String(cipherText, "UTF8"));
}
}
Resultado
O programa acima gera a seguinte saída -
Encrypted Text:
"???:]J_?]???;Xl??????*@??u???r??=T&???_?_??.??i?????(?$_f?zD??????ZGH??g??? g?E:_??bz^??f?~o???t?}??u=uzp\UI????Z??l[?G?3??Y?UAEfKT?f?O??N_?d__?????a_?15%?^? 'p?_?$,9"{??^??y??_?t???,?W?PCW??~??[?$??????e????f?Y-Zi__??_??w?_?&QT??`?`~?[?K_??_???
Você pode descriptografar os dados criptografados usando a classe Cipher do javax.cryptopacote. Siga as etapas fornecidas a seguir para descriptografar dados fornecidos usando Java.
Etapa 1: Crie um objeto KeyPairGenerator
o KeyPairGenerator classe fornece getInstance() método que aceita uma variável String que representa o algoritmo de geração de chave necessário e retorna um objeto KeyPairGenerator que gera chaves.
Crio KeyPairGenerator objeto usando o getInstance() método conforme mostrado abaixo.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Etapa 2: inicializar o objeto KeyPairGenerator
o KeyPairGenerator classe fornece um método chamado initialize()este método é usado para inicializar o gerador de par de chaves. Este método aceita um valor inteiro que representa o tamanho da chave.
Inicialize o objeto KeyPairGenerator criado na etapa anterior usando o initialize() método conforme mostrado abaixo.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Etapa 3: gerar o KeyPairGenerator
Você pode gerar o KeyPair usando o generateKeyPair() método do KeyPairGeneratorclasse. Gere o par de chaves usando este método conforme mostrado abaixo.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Etapa 4: Obtenha a chave pública
Você pode obter a chave pública do objeto KeyPair gerado usando o getPublic() método conforme mostrado abaixo.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Etapa 5: Criar um objeto Cipher
o getInstance() método de Cipher classe aceita uma variável String que representa a transformação necessária e retorna um objeto Cipher que implementa a transformação fornecida.
Crie o objeto Cipher usando o getInstance() método conforme mostrado abaixo.
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Etapa 6: inicializar o objeto Cipher
o init() método da classe Cipher aceita dois parâmetros
- Um parâmetro inteiro que representa o modo de operação (criptografar / descriptografar)
- Objeto de chave que representa a chave pública
Inicialize o objeto Cypher usando o init() método conforme mostrado abaixo.
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
Etapa 7: Adicionar dados ao objeto Cipher
o update() O método da classe Cipher aceita uma matriz de bytes que representa os dados a serem criptografados e atualiza o objeto atual com os dados fornecidos.
Atualize o objeto Cipher inicializado passando os dados para o update() método na forma de matriz de bytes, conforme mostrado abaixo.
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
Etapa 8: criptografar os dados
o doFinal()método da classe Cipher completa a operação de criptografia. Portanto, conclua a criptografia usando este método conforme mostrado abaixo.
//Encrypting the data
byte[] cipherText = cipher.doFinal();
Etapa 9: inicializar o objeto Cipher para descriptografia
Para descriptografar a cifra criptografada nas etapas anteriores, você precisa inicializá-la para descriptografia.
Portanto, inicialize o objeto de cifra passando os parâmetros Cipher.DECRYPT_MODE e objeto PrivateKey conforme mostrado abaixo.
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
Etapa 10: descriptografar os dados
Finalmente, descriptografe o texto criptografado usando o doFinal() método conforme mostrado abaixo.
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
Exemplo
O programa Java seguinte aceita texto do usuário, criptografa-o usando o algoritmo RSA e imprime a cifra do texto fornecido, descriptografa a cifra e imprime o texto descriptografado novamente.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;
import javax.crypto.Cipher;
public class CipherDecrypt {
public static void main(String args[]) throws Exception{
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withRSA");
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//Add data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
//encrypting the data
byte[] cipherText = cipher.doFinal();
System.out.println( new String(cipherText, "UTF8"));
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
System.out.println(new String(decipheredText));
}
}
Resultado
O programa acima gera a seguinte saída -
Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{
Decrypted Text:
Welcome to Tutorialspoint