Estou recebendo a seguinte mensgem de erro:
[code]Exception in thread "Chat" java.lang.ClassCastException: java.lang.String cannot be cast to javax.crypto.SealedObject
at DecryptMsg.decrypt(DecryptMsg.java:51)
at GrafClient$Reader.run(GrafClient.java:268)[/code]
A linha do erro (linha 51) está em negrito e marcada como comentário.
Os códigos que estão envolvidos com a mensagem acima estão logo abaixo:
[code]public class Reader extends Thread {
protected GrafClient cliente;
private JTextArea OutputArea;
public Reader(GrafClient c, JTextArea OutputArea) {
super("Chat");
this.cliente=c;
this.OutputArea = OutputArea;
}
public void run() {
DataInputStream in = null;
String line, result = "";
Object objcif;
try {
in = new DataInputStream(cliente.clisoc.getInputStream());
while(true){
line = in.readLine();
objcif = line;
result = DecryptMsg.decrypt(key2, objcif);
OutputArea.append(name + "> " +result +"\r\n");
}
} catch(IOException e) {
System.out.println("Reader:"+e);
}
}
}[/code]
[code] public static String decrypt(PrivateKey privk, Object objcif) {
Cipher c;
String s ="";
SealedObject objcifrado;
try {
c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, privk);
// linha do erro (51)
[b]objcifrado = (SealedObject) objcif;[/b]
s = (String)objcifrado.getObject(c);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}[/code]
Neste caso eu envio um objeto tipo SealedObject criptografado para o Servidor e depois que recebo dele para assim descriptografá-lo e assim compreender a mensagem.
Raphael
A classe DecryptMsg é uma classe separada que implementa o método decrypt, que tem objetivo de : utilizando a chave privada do usuário, fazer a descriptografia do objeto criptografado SealedObject.
Então, sem conhecer o método eu não posso te esclarecer o que acontece. Só sei que o método em questão grava uma String na referência recebida!
[quote=rapha]
A classe DecryptMsg é uma classe separada que implementa o método decrypt, que tem objetivo de : utilizando a chave privada do usuário, fazer a descriptografia do objeto criptografado SealedObject.
Ahuahuahuahua, lembrei do Bart Simpson na lousa agora…
É verdade… então veja essa linha:
s = (String)objcifrado.getObject(c);
Claramente o objeto devolvido é uma String, somente por isso o casting (String) não causa uma ClassCastingException, vide o que o Thingol disse, mas esse objeto nunca será diferente de uma String (um SealedObject, por exemplo).
Agora veja a linha anterior:
objcifrado = (SealedObject) objcif;
Veja que o SealedObject é o objcif (senão haveria também uma ClassCastingException, vide o que o Thingol disse)… então, somando 1 + 1…
O objcifrado contém uma String. O método está devolvendo essa String, não o próprio SealedObject.
Pense mais um pouco com calma… você está perto de desvendar o mistério!
Valeu Thingol… mas não vou rezar não. Já entendi a questão. E não estou desesperado também não. Estou só querendo entender a questão que estou tentando explicar. Eu já tinha lido uma parte da documentação do SealedObject, mas então o método que você cita pode resolver tudo q preciso?
Então… vou pensar mais um pouco Fox McCloud, mas pode me dar uma luz agora?
Eu recebo uma String do servidor e armazeno na variável line como está logo abaixo:
line = in.readLine();
Detalhe importante... um dos parâmetros que devo passar para o método decrypt é do tipo SealedObject, que no caso é o objeto que foi encriptado por outro método [i]encrypt[/i]. No caso eu recebo uma String e não um SealedObject.
Podem me dar a luz que preciso?
Raphael
Basicamente você quer saber como é que se chega a uma String, dado um SealedObject, e como se chega a um SealedObject, dada uma String.
A ideia é que um SealedObject é equivalente ao objeto original, só que criptografado. Para tanto, você precisa de uma forma de cifrar ou decifrar os dados.
Quando você usa o construtor de SealedObject que recebe um objeto qualquer que possa ser serializado, o que o tal construtor faz? Ele pega o tal objeto, efetua sua serialização para um array de bytes, cifra-o usando o objeto do tipo Cipher que você passou como parâmetro, e então monta o tal objeto SealedObject.
Quando você usa o método getObject de SealedObject, que recebe um Cipher como parâmetro, ele decifra um array de bytes que ele tem internamente, e então “desserializa” para um objeto equivalente ao objeto original (que seria uma String).