Pessoal estou desenvolvendo uma rotina de criptografia em java usando o algoritmo de codigo aberto DES.
O meu problema é o seguinte:
Preciso ler um codigo criptografado em delphi e descriptografalo, essa criptografia é a DES, mas não to conseguindo
obter resultado igual no java.
Exemplo:
tenho minha cheve privada = minhachaveprivada
meu texto a ser criptografado = Secreto
e preciso que me retorne o codigo emcriptado = Yab3AnukkE8=
mas ta me retornando outros valores não compativeis que estão no codigo que postei abaixo.
Se alguem puder me ajudar agradeço desde ja.
/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package br.com.viasoft.bean;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
/**
*
-
@author Wolmir
*/
public class criptografia {static Cipher ecipher;
static Cipher dcipher;//inicia os objetos public static void inicializa(SecretKey key) { try { ecipher = Cipher.getInstance("DES"); dcipher = Cipher.getInstance("DES"); ecipher.init(Cipher.ENCRYPT_MODE, key); dcipher.init(Cipher.DECRYPT_MODE, key); } catch (javax.crypto.NoSuchPaddingException e) { } catch (java.security.NoSuchAlgorithmException e) { } catch (java.security.InvalidKeyException e) { }
}
//Encriptar Testo apartir da chave privada
public static String encrypt(String str, SecretKey key) {
try {byte[] iso = str.getBytes("ISO-8859-1"); // Codifica o String como ISO88591 // criptografa byte[] enc = ecipher.doFinal(iso); // Retorna um string com o encode base64 return new sun.misc.BASE64Encoder().encode(enc); } catch (javax.crypto.BadPaddingException e) { } catch (IllegalBlockSizeException e) { } catch (UnsupportedEncodingException e) { } catch (java.io.IOException e) { } return null;
}
//Decripta testo apartir da chave privada
public static String decrypt(String str, SecretKey key) {
try {// Decodifica o string em bytes byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str); // descriptografa byte[] iso = dcipher.doFinal(dec); // Retorna o string em utf8 return new String(iso, "ISO-8859-1"); } catch (javax.crypto.BadPaddingException e) { } catch (IllegalBlockSizeException e) { } catch (UnsupportedEncodingException e) { } catch (java.io.IOException e) { } return null;
}
//Gerar a chave apartir dew um texto
private static SecretKey convertPasswordToKey (final String password) throws InvalidKeyException, UnsupportedEncodingException {
SecretKey skey = null;
try {//01 //SecretKeyFactory skf1 = SecretKeyFactory.getInstance("DES"); //DESKeySpec ks1 = new DESKeySpec (password.getBytes("ISO-8859-1")); // E aqui temos o resultado final, que é a chave secreta. //skey = skf1.generateSecret (ks1); //02 //usando array de bits //skey = new SecretKeySpec(password.getBytes("ISO-8859-1"), "DES"); //03 SecretKeyFactory skf3 = SecretKeyFactory.getInstance("DES"); PBEParameterSpec ps3 = new PBEParameterSpec (new byte[]{3,1,4,1,5,9,2,6}, 20); PBEKeySpec ks3 = new PBEKeySpec (password.toCharArray()); // esta é a chave que você quer manter secreta. // Obviamente quando você for implantar na sua empresa, use alguma outra coisa - por exemplo, // "05Bc5hswRWpwp1sew+MSoHcj28rQ0MK8". Nao use caracteres especiais (como ç) para nao dar problemas. skey = skf3.generateSecret (ks3); } catch (java.security.NoSuchAlgorithmException ex) { ex.printStackTrace(); } catch (java.security.spec.InvalidKeySpecException ex) { ex.printStackTrace(); } return skey; }
public static void main(String[] args) throws InvalidKeyException, UnsupportedEncodingException {
//texto a ser encriptado
String textoProtegido = “Secreto”;
//chave usada na encriptação
String chavePrivada = “minhachaveprivada”;//chama o metodo para iniciar criptografia.inicializa(convertPasswordToKey(chavePrivada)); String textoCriptografado = criptografia.encrypt(textoProtegido, convertPasswordToKey(chavePrivada)); System.out.println(textoCriptografado); String textoDescriptografado = criptografia.decrypt(textoCriptografado, convertPasswordToKey(chavePrivada)); System.out.println(textoDescriptografado);
}
/*
No sistema que esta rodando
Delphi = O texto Secreto com a senha minhachaveprivada gera a criptografia Yab3AnukkE8=
No metodo que criei no java gera usando metodo 1 e 2 p72Xo9XKTqs= com a mesma chave. *0e0jdTbt3srALEh
*/
}