Criptografia Java - Verificando a assinatura
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 Signature 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