Criptográfia DES

11 respostas
P

Pessoal,

Preciso pegar uma palavra e criptografar ela usando DES, http://www.gta.ufrj.br/grad/99_2/marcos/des.htm , porém não sei como trabalhar esse tipo de criptografia com o java, alguém poderia me informar como posso usar esse tipo de criptografia com java?

11 Respostas

orlandocn

www.jasypt.org
http://www.bouncycastle.org/java.html

P

Então eu não estou coneguindo… veja.

Tenho um ArrayList chamado buffer, e preciso criptografar esse buffer usando DES no modo CFB… passando o IV ( vetor de inicialização), e depois retornar no Arraylist buffer, os dados criptografados…

Não sei se consegui explicar o problema, deu para entender?

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;

import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.InvalidAlgorithmParameterException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;


public void encrypt_buffer(byte[] buffer, byte[] iv)
{


try{
                    KeyGenerator keyGen = KeyGenerator.getInstance("DES");
                    keyGen.init(56);
                    SecretKey secretKey = keyGen.generateKey();

                     Cipher desCipher = Cipher.getInstance("DES/CFB/PKCS5Padding");

                     IvParameterSpec ips = new IvParameterSpec(iv);

                     buffer = desCipher.doFinal(buffer);

                }
                 catch (NoSuchAlgorithmException noSuchAlgo) {}
                 catch (NoSuchPaddingException noSuchPad) {}
                 //catch (InvalidKeyException invalidKey) {}
                 catch (BadPaddingException badPadding) {}
                 catch (IllegalBlockSizeException illegalBlockSize) {}

}

Desta forma não estou conseguindo montar o buffer com a criptografia correta…

T

Uh oh - como é que você passa a chave para esse método? Do jeito que você fez, você vai criar um buffer criptografado que ninguém vai conseguir decifrar, uma vez que a chave é criada (com SecretKey secretKey = keyGen.generateKey(); ) e depois de criptografar o dado, ela é destruída.

T

Suponha que a sua chave secreta seja, em hexadecimal:

01 23 45 67 89 AB CD EF

Para criar uma chave DES a partir desses bytes, use DESKeySpec
e passe um array de bytes contendo a chave.

P

Certo,

Após nova pesquisa estou fazendo da seguinte forma:

import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
class Teste3 {
   public static void main(String[] args) {

        try {

                String aa = "xxamoahtor";
                String bb = "aaaaaaa";
                String cc = "cc";

                byte[] senha = aa.getBytes();
                byte[] iv = bb.getBytes();
                byte[] buffer = cc.getBytes();

                KeySpec ks = new DESKeySpec(senha);
                SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
                SecretKey ky = kf.generateSecret(ks);

                Cipher cf = Cipher.getInstance("DES/CFB8/NoPadding");

                 AlgorithmParameterSpec aps = new IvParameterSpec(iv);
                 cf.init(Cipher.ENCRYPT_MODE, ky, aps);

                byte[] theCph = cf.doFinal(buffer);

               

        }
         catch (Exception e) {
                e.printStackTrace();
                return;
         }

  }
}

Acima , é como estou fazendo, porém o IV e o buffer são dois bytes, que eu não crio recebo, porém ainda não consigo retornar os valores para o buffer…

Desta forma esta correto, certo?

T

Não sei se está certo. Você consegue fazer a volta (isto é, decifrar o buffer que você cifrou?)

Além disso, a chave (de 56 bits, mas por causa dos bits de paridade tem 8 bytes = 64 bits), e vetor de inicialização (IV) têm sempre 8 bytes no caso do DES com modo CFB . Se não tiver 8 bytes está errado.

P

Agora, esta me retornado este erro:

Wrong IV length: must be 8 bytes long

T

Exatamente como eu havia dito. O vetor de inicialização (IV) tem de ter exatamente 8 bytes.

P

No caso, estas funções do Java são equivalentes a mcrypt_encrypt do C?

T

Acho que você precisa ver se alguém já criou uma função em Java que seja equivalente a essa tal função do mcrypt_encrypt em PHP.
Não sei, por exemplo, se há alguma peculiaridade.

P

No caso, o IV estva incorreto, pois devo passar sim 8 bytes.

Porém, vou explicar, esse é um cliente para um servidor, ou seja, eu me conecto ao servidor e ele me volta o timestamp dele e o IV, o IV tem um tamanho máximo de 128bits, é esse tamano que ele me volta. Assim, eu recebo isso, e por meio de um arquivo de configuração leio uma senha que é definida tanto no servidor como no cliente. Essa senha é a chave, dela eu tenho que criar uma chave onde os dados possam ser criptados por mim e decripitados pelo servidor.

No total, tenho esses dados, o IV, a senha ( chave) e o conteúdo que deve ser criptografado.

Não tenho conhecimento sobre Java, e estou tendo dificuldades com o throws, etc… hoje que comecei a entender sobre o try e catch.

Esses códigos acima são o que estou tentando fazer pela documentação que me foi passada por aqui…
Nos exemplos que tó pesquisando, não consegui vislumbrar como montar esses dados criptografados de acordo com esse necessidade… se alguém tiver mais dicas, eu agradeço…

Criado 18 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 11
Participantes 3