preciso urgente realizar uma criptografia DES em java…achei o seguinte exemplo:
importjava.security.Security;importjava.security.spec.AlgorithmParameterSpec;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importjavax.crypto.spec.IvParameterSpec;publicclassMainClass{publicstaticvoidmain(Stringargs[])throwsException{Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());SecretKeykey=KeyGenerator.getInstance("DES").generateKey();// for CBC; must be 8 bytesbyte[]initVector=newbyte[]{0x10,0x10,0x01,0x04,0x01,0x01,0x01,0x02};AlgorithmParameterSpecalgParamSpec=newIvParameterSpec(initVector);Cipherm_encrypter=Cipher.getInstance("DES/CBC/PKCS5Padding");Cipherm_decrypter=Cipher.getInstance("DES/CBC/PKCS5Padding");m_encrypter.init(Cipher.ENCRYPT_MODE,key,algParamSpec);m_decrypter.init(Cipher.DECRYPT_MODE,key,algParamSpec);byte[]clearText="www.java2s.com".getBytes();byte[]encryptedText=m_encrypter.doFinal(clearText);byte[]decryptedText=m_decrypter.doFinal(encryptedText);System.out.println(newString(clearText));System.out.println(newString(encryptedText));System.out.println(newString(decryptedText));}}
mas o problema é q eu preciso passar uma chave privada, em hexa e aqui eu nao tenho esta opcao, e eu nao achei como passar uma chave criada por mim no lugar de KeyGenerator.getInstance(“DES”).generateKey();
SecretKey key2 = new SecretKeySpec(arrayByte, “DES”);
Até mais
T
tap_pedroso
ok, ele aceitou, mas aceita somente uma cheve de 8 digitos…achei estranho, ou devo estar informando de uma maneira errada…pq preciso informar uma chave hexa…por exemplo : 5446615264454F49.
A
andre.conde
Posta como você está fazendo agora.
A
andre.conde
new SecretKeySpec(key.getBytes(), “DES”);
Já tentou ?
T
tap_pedroso
Lá vai…se a chave for de 8 digitos funciona, mas com essa nao funciona
packagetestedes;importjava.io.UnsupportedEncodingException;importjavax.crypto.*;importjavax.crypto.spec.SecretKeySpec;publicclassCryptoEx1{Cipherecipher;Cipherdcipher;CryptoEx1(SecretKeykey){try{ecipher=Cipher.getInstance("DES");dcipher=Cipher.getInstance("DES");ecipher.init(Cipher.ENCRYPT_MODE,key);dcipher.init(Cipher.DECRYPT_MODE,key);}catch(javax.crypto.NoSuchPaddingExceptione){}catch(java.security.NoSuchAlgorithmExceptione){}catch(java.security.InvalidKeyExceptione){}}publicStringencrypt(Stringstr){try{byte[]iso=str.getBytes("ISO-8859-1");// criptografabyte[]enc=ecipher.doFinal(iso);// Retorna um string com o encode base64returnnewsun.misc.BASE64Encoder().encode(enc);}catch(javax.crypto.BadPaddingExceptione){}catch(IllegalBlockSizeExceptione){}catch(UnsupportedEncodingExceptione){}catch(java.io.IOExceptione){}returnnull;}publicStringdecrypt(Stringstr){try{// Decodifica o string em bytesbyte[]dec=newsun.misc.BASE64Decoder().decodeBuffer(str);// descriptografabyte[]iso=dcipher.doFinal(dec);// Retorna o string em utf8returnnewString(iso,"ISO-8859-1");}catch(javax.crypto.BadPaddingExceptione){}catch(IllegalBlockSizeExceptione){}catch(UnsupportedEncodingExceptione){}catch(java.io.IOExceptione){}returnnull;}publicstaticvoidmain(String[]args){try{// Gera uma chave que será utilizada para criptografar e// descriptografarStringchave="5446615264454F49";byte[]rawkey=chave.getBytes("ISO-8859-1");SecretKeykey=newSecretKeySpec(chave.getBytes(),"DES");// Cria a classe que criptografaCryptoEx1encrypter=newCryptoEx1(key);// CriptografaStringencrypted=encrypter.encrypt("Isso é um segredo.");System.out.println(encrypted);// DescriptografaStringdecrypted=encrypter.decrypt(encrypted);System.out.println(decrypted);}catch(Exceptione){}}}
obrigado.
T
thingol
Você precisa pegar sua chave, que está em uma string hexadecimal de 16 caracteres, e transformá-la em um array de bytes de 8 bytes.
Isso é só uma coisa braçal e acho que é fácil você fazer isso com substring e Integer.parseInt.
Por exemplo, você pode usar ((byte) Integer.parseInt (“4F”, 16)) para obter o byte 0x4F.
T
tap_pedroso
thingol,
tem algo errado…veja se estou correto, eu teria q converter o seu exemplo assim :
byte[] teste = (byte) Integer.parseInt (“4F”, 16);
?
A
andre.conde
Em vez de try catch, joga a excessao pra cima, com throws, para pelo menos você ver o que está acontecendo no seu código. A Excessao do seu código é esta:
Ele não está aceitando uma chave privada de 16 bytes.
T
thingol
tap_pedroso:
thingol,
tem algo errado…veja se estou correto, eu teria q converter o seu exemplo assim :
byte[] teste = (byte) Integer.parseInt (“4F”, 16);
?
Não é bem isso, a dica que lhe dei é para converter apenas um dos bytes; não todos, que acho que você consegue codificar um loop. É por isso que eu falei em “substring” e disse quantos bytes tem de ter o array de bytes.
T
tap_pedroso
sim, eu entendi o que vc quis dizer, mas antes eu tentei converter somente 1 valor hexa desta maneira que escrevi para ver o retorno e se nao acontecia nenhum erro.
T
tap_pedroso
thingol, veja se vc consegue me dar um ultimo help…tentei colocar os valores da chave hexa dentro do array de bytes, mas ele entra no array como decimal, nao estou conseguindo chegar ao valor correto…eu tenho feito em delphi uma aplicação que faz o DES e funciona legal…o valor em texto claro é 9626000715612011, a chave é 5446615264454F49, e o valor cifrado com DES é 0146423EE2145003…em java o retorno nao bate nunca…vou posta o codigo que estou passando para o array de bytes e o codigo completo…muito obrigado pela força.
Tentando passar a chave hexa para um array de byte
importjava.io.UnsupportedEncodingException;importjavax.crypto.*;importjavax.crypto.spec.SecretKeySpec;publicclassCryptoEx1{Cipherecipher;Cipherdcipher;CryptoEx1(SecretKeykey){try{ecipher=Cipher.getInstance("DES");dcipher=Cipher.getInstance("DES");ecipher.init(Cipher.ENCRYPT_MODE,key);dcipher.init(Cipher.DECRYPT_MODE,key);}catch(javax.crypto.NoSuchPaddingExceptione){}catch(java.security.NoSuchAlgorithmExceptione){}catch(java.security.InvalidKeyExceptione){}}publicStringencrypt(Stringstr){try{byte[]iso=str.getBytes("ISO-8859-1");// criptografabyte[]enc=ecipher.doFinal(iso);// Retorna um string com o encode base64returnnewsun.misc.BASE64Encoder().encode(enc);}catch(javax.crypto.BadPaddingExceptione){}catch(IllegalBlockSizeExceptione){}catch(UnsupportedEncodingExceptione){}catch(java.io.IOExceptione){}returnnull;}publicStringdecrypt(Stringstr){try{// Decodifica o string em bytesbyte[]dec=newsun.misc.BASE64Decoder().decodeBuffer(str);// descriptografabyte[]iso=dcipher.doFinal(dec);// Retorna o string em utf8returnnewString(iso,"ISO-8859-1");}catch(javax.crypto.BadPaddingExceptione){}catch(IllegalBlockSizeExceptione){}catch(UnsupportedEncodingExceptione){}catch(java.io.IOExceptione){}returnnull;}/* public static byte[] hexToBytes(char[] hex) { int length = hex.length / 2; byte[] raw = new byte[length]; for (int i = 0; i < length; i++) { int high = Character.digit(hex[i * 2], 16); int low = Character.digit(hex[i * 2 + 1], 16); int value = (high << 4) | low; if (value > 127) value -= 256; raw[i] = (byte) value; } return raw; } public static byte[] hexToBytes(String hex) { return hexToBytes(hex.toCharArray()); } */publicstaticbyte[]hexBytes(StringhexText){StringdecodedText=null;Stringchunk=null;intnumBytes=hexText.length()/2;byte[]rawToByte=newbyte[numBytes];intoffset=0;intbCounter=0;for(inti=0;i<numBytes;i++){chunk=hexText.substring(offset,offset+2);offset+=2;rawToByte[i]=(byte)(Integer.parseInt(chunk,16));}returnrawToByte;}publicstaticvoidmain(String[]args){try{// Gera uma chave que será utilizada para criptografar e// descriptografarStringchave="5446615264454F49";byte[]rawkey=hexBytes(chave);SecretKeykey=newSecretKeySpec(rawkey,"DES");// Cria a classe que criptografaCryptoEx1encrypter=newCryptoEx1(key);// CriptografaStringencrypted=encrypter.encrypt("9626000715612011");System.out.println(encrypted);// DescriptografaStringdecrypted=encrypter.decrypt(encrypted);System.out.println(decrypted);}catch(Exceptione){}}}
T
thingol
Você sabe qual é o “modo” usado no Delphi? Provavelmente é ECB, e não CBC como você está usando por default.
Você teria de especificar, em vez de simplesmente DES, “DES/ECB/NoPadding”.