Olá,
Sou iniciante em java e tenho um texto encriptografado no padrão RSA e preciso decriptografar.
Tenho uma variável (string) que armazena a minha chave privada.
Já procurei vários exemplos na internet, mas os que encontrei é através de arquivo, não consegui adaptar para minha necessidade.
Achei esse exemplo (Criptografia Assimétrica: Criptografando e Descriptografando Dados em Java), como falei sou iniciante em Java não consegui ajustar para minha necessidade.
Se alguém poder me ajudar.
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;
public class Exemplo {
private static final String ALGORITMO = "RSA";
public static void main(String[] args) {
try {
Exemplo programa = new Exemplo();
programa.executar();
} catch (Throwable t) {
t.printStackTrace();
}
}
public void executar() throws Exception {
String textoCifrado = " aqui você usa seu texto encriptado ";
String chavePrivada = " aqui você usa sua chave privada ";
final String textoOriginal = decifra(textoCifrado, chavePrivada);
System.out.println("Mensagem Cifrada: " + textoCifrado);
System.out.println("Mensagem Decifrada: " + textoOriginal);
}
public String decifra(String texto, String chave) throws Exception {
try {
byte[] bytes = texto.getBytes();
PrivateKey privateKey = chavePrivada(chave);
final Cipher cipher = Cipher.getInstance(ALGORITMO);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] dectyptedText = cipher.doFinal(bytes);
return new String(dectyptedText);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
private PrivateKey chavePrivada(String texto) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITMO);
byte[] bytes = Base64.getDecoder().decode(texto);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
return keyFactory.generatePrivate(keySpec);
}
}
@staroski passou batido, está dando o erro “jjavax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes”, depois que executa a linha “dectyptedText = cipher.doFinal(bytes)”
A mensagem está bastante clara.
Isso é limitação do RSA.
Você pode pegar o dado a ser encriptado e quebrar em pedaços menores, aí encripta cada pedaço desse com sua chave.
Depois para decriptar faz o contrário.
Ok.
Nessa linha “final String textoOriginal = decifra(textoCifrado, chavePrivada);”, está estranho está retornando algo do tipo “D��,���R��N!��u��W72��xz��’�N���G”, não deveria está o texto original?
O texto recebido está no encoding certo?
Na função decifra(textoCifrado, chavePrivada) está recebendo os parâmetros dessa forma:
decifra(‘eEpyJ08UictmVxYiqBXNp805fRn/7…’, ‘MIIEvAIBADANBgkqhkiG9w0BAQEKWD…’)
Estava analisando, na função:
dectyptedText = cipher.doFinal(texto.getBytes())
O cipher.doFinal ele recebe o texto “eEpyJ08UictmVxYiqBXNp805fRn/7…” e converte em byte, ira gravar na váriavel dectyptedText algo do tipo “[68, -116, -30, 44, -22, -110]”, q é um byte.
Tenho que pegar esse byte e “transformar” em algo legivel? Ai coloquei o “UTF-8”, ficando dessa forma “return new String(dectyptedText , “UTF-8”)”. Mas me retorna isso "D , R N! u W72 xz ’ N ", será q preciso utilizar outro tipo de conversão?
Mas quais eram os bytes originais, antes de criptografar? Era um texto mesmo?
Não tenho byte original … estou consumindo um serviço que os dados estão criptografado no padrão RSA e que preciso decriptografa para manipular as informações.
Uma parte do dado criptogrado "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggS … "