Decriptografa texto padrão RSA

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);
	}
}
1 curtida

@staroski deu certo, cara obrigado pela força!

1 curtida

@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 … "