Ao executar o processo de descriptografia de um um array de bytes de um String já criptografado me deparo com o seguinte erro:
javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at DecryptMsg.decrypt(DecryptMsg.java:19)
at GrafClient$Reader.run(GrafClient.java:281)
O código da classe Decrypt está logo abaixo (Obs.: Fiz um comentário na linha onde está o erro)
import java.security.Key;
import javax.crypto.Cipher;
import java.security.Security;
public class DecryptMsg {
/* Construtor da classe */
public DecryptMsg() {
}
public byte[] decrypt(Key privk, byte[] cipherText) throws Exception {
Cipher c;
c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, privk);
byte[] plainText = c.doFinal(cipherText); // linha que gera o erro
System.out.println("plaintext: " + new String (plainText));
return plainText;
}
}
Já pesquisei em outros Fóruns mas nada. Utilizo sockets e recebo do servidor a mensagem criptografada e o cliente faz o processo inverso.
Abaixo tem o exemplo em uma única classe que funcionou perfeitamente e faz o processo de captura da chave privada/pública da mesma forma que o programa.
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.crypto.Cipher;
public class RSAexample {
public static void main(String[] args) throws Exception {
byte[] input = "Raphael".getBytes();
String password = "123456", alias = "usuario1";
/* begin public key */
FileInputStream fis = new FileInputStream("src/pub_usuario1.cert");
CertificateFactory certF = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)certF.generateCertificate(fis);
PublicKey pubKey = cert.getPublicKey();
fis.close();
/* end public key */
/* begin private key */
KeyStore ks = KeyStore.getInstance ("JKS");
char[] pwd = password.toCharArray();
InputStream is = new FileInputStream("src/usuario1.jks");
ks.load(is, pwd);
is.close();
Key privKey = ks.getKey(alias, pwd);
is.close();
/* end private key */
/* encrypt */
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(input);
System.out.println("cipher: " + new String(cipherText));
/* decrypt */
Cipher cipher2 = Cipher.getInstance("RSA");
cipher2.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher2.doFinal(cipherText);
System.out.println("plain : " + new String(plainText));
}
}
Por favor me ajudem nesta questão.
Grato desde já pela oportunidade.