Duplicar a Oracle DES criptografar em Java
-
02-07-2019 - |
Pergunta
Eu recentemente fez uma pergunta sobre a Oracle Encryption. Ao longo do caminho para encontrar uma solução para mim eu decidi mudar a criptografia (bem, ofuscação) para o lado da aplicação para determinadas tarefas.
Meu problema é que o banco de dados já está criptografando os dados de uma determinada maneira e eu preciso de código Java para duplicar essa funcionalidade, para que o texto criptografado por um sistema pode ser decifrada pelo outro e vice-versa.
Eu quero a criptografia para ser compatível com o que a DB já estava fazendo, mas não conseguiu encontrar a documentação que descreve exatamente o que a Oracle está fazendo. Como faço para replicar isso em Java?
dbms_obfuscation_toolkit.DESEncrypt(
input_string => v_string,
key_string => key_string,
encrypted_string => encrypted_string );
RETURN UTL_RAW.CAST_TO_RAW(encrypted_string);
Não importa o que eu tente, parece como se a criptografia Java DES é diferente da Oracle.
Solução
Eu achei isso funciona:
KeySpec ks = new DESKeySpec(new byte[] {'s','e','c','r','e','t','!','!'});
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(ks);
Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
IvParameterSpec ips = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0});
c.init(Cipher.ENCRYPT, sk, ips);
// or
c.init(Cipher.DECRYPT, sk, ips);
A peça que faltava era o vetor de inicialização (IPS), que deve ser de 8 zeros. Quando você usa nulo em Java você tem algo diferente.
Outras dicas
Usando Java no banco de dados teria sido outra abordagem que (deve!) Têm guarenteed que o código (e, portanto, resultados) seriam idênticos.