Salve galera!
O entalangment me passou uma classe e deu uma ajudona pra fazela funcionar através desta thread http://www.guj.com.br/posts/list/226191.java
a zica é q só funciona no eclipse… nem no prompt nem no jgrasp ela acha os algoritmos. No caso da chave ele não acha por exemplo o PBKDF2WithHmacSHA1 mas só o PBEWithMD5AndDES… depois desse não acha o AES/OFB/NoPadding nem a PKCS5Padding… mas no eclipse o treco roda… dae pensei q era problema de biblioteca, já q no eclipse eu tenho uma pá e também nao entendo do eclipse, então baixei da sun o arquivo q tem as bibliotecas jce1_2_2.jar e o sunjce_provider.jar, olhei nelas e elas tinham as classes utilizadas pela classe de criptografica, fiz as importações direto explícitas e nada!
os traces:
java.security.NoSuchAlgorithmException: No such algorithm: AES/OFB/NoPadding
at javax.crypto.Cipher.getInstance(DashoA13*…)
at javax.crypto.Cipher.getInstance(DashoA13*…)
at comuns.Cripto.cifrar(Cripto.java:48)
at comuns.Cripto.main(Cripto.java:92)
e o outro
java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA1 SecretKeyFactory not available
at javax.crypto.SecretKeyFactory.(DashoA13*…)
at javax.crypto.SecretKeyFactory.getInstance(DashoA13*…)
at comuns.Cripto.senha(Cripto.java:41)
at comuns.Cripto.main(Cripto.java:91)
ae está a classe, mas estou realizando testes…
package comuns;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//import javax.crypto.Cipher;
//import javax.crypto.SecretKey;
//import javax.crypto.SecretKeyFactory;
//import javax.crypto.spec.IvParameterSpec;
//import javax.crypto.spec.PBEKeySpec;
//import javax.crypto.spec.SecretKeySpec;
import com.sun.crypto.provider.*;//esses são direto do arquivo q baixei da sun... tem todas as classes comentadas acima
import javax.crypto.*;
import javax.crypto.spec.*;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Cripto {
private byte[] salt;
private PBEKeySpec ks;
private SecretKey skey;
private SecretKeyFactory skf;
public BASE64Decoder dec;
public BASE64Encoder enc;
public Cripto() {
dec = new BASE64Decoder();
enc = new BASE64Encoder();
}
public void senha(char[] chars) throws Exception {
//System.out.println (System.getProperties());
skf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
salt = new byte[4]; // deixamos 4 bytes zerados :(
ks = new PBEKeySpec(chars, salt, 100, 128);
skey = new SecretKeySpec(skf.generateSecret(ks).getEncoded(), "AES");
}
public String cifrar(String original) throws Exception {
Cipher cf = Cipher.getInstance("AES/OFB/NoPadding", "SunJCE");
cf.init(Cipher.ENCRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
return enc.encode(cf.doFinal(original.getBytes()));
}
public byte[] cifrarBytes(byte[] original) throws Exception {
Cipher cf = Cipher.getInstance("AES/OFB/NoPadding", "SunJCE");
cf.init(Cipher.ENCRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
return cf.doFinal(original);
}
public String decifrar(String cifrado) throws Exception {
Cipher cf = Cipher.getInstance("AES/OFB/NoPadding", "SunJCE");
cf.init(Cipher.DECRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
return new String(cf.doFinal(dec.decodeBuffer(cifrado)));
}
public byte[] decifrarBytes (byte[] bytes) throws Exception {
Cipher cf = Cipher.getInstance("AES/OFB/NoPadding", "SunJCE");
cf.init(Cipher.DECRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
return cf.doFinal(bytes);
}
private static byte[] serializar (Object obj) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject(obj);
oos.close();
return baos.toByteArray();
}
private static Object desserializar (byte[] bytes) throws IOException, ClassNotFoundException {
Object obj;
ByteArrayInputStream bais = new ByteArrayInputStream (bytes);
ObjectInputStream ois = new ObjectInputStream (bais);
obj = ois.readObject();
ois.close();
return obj;
}
public static void main(String[] args) {
try{
Cripto ecs = new Cripto();
ecs.senha("YjMIzg+3dhgc7a3EPoH/OA==".toCharArray());
String s = ecs.cifrar("10/11/2010 - 18:06:45 - Local 3A - Profissional 2r");
// Esperado: "6A63+uTkapyT8h9GNvYaklLyfIVUCxrCZ+7zIE9XRbJyt6f4i7jBs/13JvsLPNSHpm8="
System.out.println(s);
String t = ecs.decifrar(s);
System.out.println(t);
// Agora serializando uma lista de objetos.
System.out.println ("Efetuando a serialização e desserialização");
List<Object> list = new ArrayList<Object>();
list.add (Integer.valueOf (12345678));
list.add (Boolean.TRUE);
list.add ("abacaxi");
list.add (Math.PI);
System.out.println ("Lista Original: " + list);
BASE64Encoder enc = new BASE64Encoder ();
byte[] original = serializar(list);
System.out.println ("Base-64 (original ): \n" + enc.encode (original));
byte[] cifrado = ecs.cifrarBytes (serializar (list));
System.out.println ("Base-64 (cifrado ): \n" + enc.encode (cifrado));
byte[] decifrado = ecs.decifrarBytes (cifrado);
System.out.println ("Base-64 (decifrado): \n" + enc.encode (decifrado));
System.out.println ("Original = Cifrado? " + Arrays.equals (original, decifrado));
List<Object> listaDecifrada = (List<Object>) desserializar (decifrado);
System.out.println ("Lista Decifrada: " + listaDecifrada);
}catch(Exception e){
e.printStackTrace();
}
}
}
A zica é q nao roda no jre