Pessoal, estou usando a criptografia DES.
No cliente eu passo a Chave e o texto para a funcao que vai criptografar e me retorna em byte o resultado, assim transmito para o servidor.
Já no servidor recebe o texto criptografado, e para descriptografar é necessário passar em byte. Mas o texto transmitido é em formato de string, e se uso a funcao:
Ao converter bytes para uma string, alguns dos bytes são perdidos (a conversão é irreversível).
Portanto, é necessário codificar os bytes (usando hexadecimal, base-64 ou base-85) antes de convertê-los para uma string.
Vou dar um exemplo:
classStringNaoEhArrayDeBytes{publicstaticvoidmain(String[]args)throwsException{byte[]bytes=newbyte[256];// Primeiramente estamos preenchendo o array "bytes" com // os valores de 0 até 255for(inti=0;i<bytes.length;++i){bytes[i]=(byte)i;}// Agora vamos converter ingenuamente esse array de bytes para uma string. // Vamos usar o "encoding" Windows-1252 porque é o que dá menos problemasStrings=newString(bytes,"Windows-1252");// Vamos desconverter a string para um array de bytes.byte[]bytes2=s.getBytes("Windows-1252");// Agora vamos conferir para ver quais dos bytes foram convertidos erroneamente.for(inti=0;i<bytes.length;i++){byteb=(byte)i;if(bytes2[i]!=b){System.out.printf("O byte 0x%02X foi perdido e transformado em 0x%02X (%c) %n",(byte)i,bytes2[i],(char)bytes2[i]);}}}}
Não adianta mudar o encoding (que nesse caso é Windows-1252). Vai dar problema com algum byte. (Teste, por exemplo, com "ASCII" e "UTF-8"). No caso "ISO-8859-1" parece que funciona, mas veja se isso também vale para outras versões do Java.
B
bobmoe
thingol,
acho que esse problema ele vai ter mais pra frente. para mim o problema agora é outro (linha 9 do cliente):
byte[] valor = null;
(...)
txt = valor.toString();
(...)
OS.write(txt.getBytes());
Ou seja, quando ele faz um toString de um array, o retorno não vai ser os bytes trasformados num objeto String e sim algo como B@1a2b3c4d5e6f.
A
alerocha19
obrigado thingol,
Chego a conclusão que usar a criptografia simetrica DES de cliente para servidor numa aplicação J2me parece ser impossível.
A criptografia peguei do org.bouncycastle e me parece que funciona só para uma aplicação e nao para cliente servidor.
T
thingol
alerocha19:
obrigado thingol,
Chego a conclusão que usar a criptografia simetrica RSA de cliente para servidor numa aplicação J2me parece ser impossível.
A criptografia peguei do org.bouncycastle e me parece que funciona só para uma aplicação e nao para cliente servidor.
Aham - RSA não é simétrica e deve ser usada com cuidados.
Um dos principais cuidados é que ela é bem lenta em ambiente Mobile devido à grande capacidade de processamento que ela exige; mas acho que esse é o único problema.
Outra coisa é que RSA só é útil para criptografar chaves, não os dados em si.
A terceira coisa é que ela trabalha com BigIntegers, não com arrays de bytes, então você precisa especificar um “padding” adequado se for usá-la para criptografar uma chave.
Mas ela poderia ser usada em ambiente Mobile; acho só que você está se confundindo todo com RSA, que não é para amadores.
T
thingol
bobmoe:
thingol,
acho que esse problema ele vai ter mais pra frente. para mim o problema agora é outro (linha 9 do cliente):
byte[] valor = null;
(...)
txt = valor.toString();
(...)
OS.write(txt.getBytes());
Ou seja, quando ele faz um toString de um array, o retorno não vai ser os bytes trasformados num objeto String e sim algo como B@1a2b3c4d5e6f.
Para converter um array de bytes em uma string, NÃO USE toString e sim new String (byte[], String) onde o primeiro parâmetro é o array a ser convertido e o segundo é o encoding adequado. (Não sei se isso existe em JavaME).
B
bobmoe
thingol:
bobmoe:
thingol,
acho que esse problema ele vai ter mais pra frente. para mim o problema agora é outro (linha 9 do cliente):
byte[] valor = null;
(...)
txt = valor.toString();
(...)
OS.write(txt.getBytes());
Ou seja, quando ele faz um toString de um array, o retorno não vai ser os bytes trasformados num objeto String e sim algo como B@1a2b3c4d5e6f.
Para converter um array de bytes em uma string, NÃO USE toString e sim new String (byte[], String) onde o primeiro parâmetro é o array a ser convertido e o segundo é o encoding adequado. (Não sei se isso existe em JavaME).
eu não disse para ele fazer isso, mas sim apontei o erro.
T
thingol
OK.
A
alerocha19
Pessoal,
Então se eu tenho uma variável String que o conteúdo dela é bytes, assim por exemplo:
Variável texto com conteúdo: [B@f828ed68
Não tem como passar esse conteúdo: [B@f828ed68 para um array de bytes ??
Já que quando uso o comando:
byte[] val = (new String(texto.toString())).getBytes();
Esse comando joga para val outros bytes e nao o [B@f828ed68
E
enantiomero
“[B@f828ed68” quer dizer: “O array de bytes (”[B") que tem o default hash code 0xf828ed68". Isso não serve para absolutamente nada, exceto para você perceber que não é para usar “toString” para um array de bytes.
O que você deve fazer para converter um array de bytes para uma string (e aceitando que pode haver perdas) é
Strings=newString(texto);// onde texto é um array de bytes, não criptografados
ou se isto estiver disponível,
Strings=newString(texto,"ISO-8859-1");// onde texto é um array de bytes.
A
alerocha19
valeu enantiomero, vou vê o que dá para fazer.
A
alerocha19
Pessoal finalmente consegui fazer funcionar cliente/servidor para J2me com a criptografia simetrica do Bouncy Castle.
Onde eu passo o texto que quero criptografar para o método que me retorna um array de bytes e para descriptografar passo o array de bytes que me devolve o texto em string. Obrigado pela atenção de todos. Qualquer dúvida meu email é [email removido]
Para quem um dia alguém precisar me comunique.
A
alerocha19
O algoritmo DES que usei é:
importorg.bouncycastle.crypto.*;importorg.bouncycastle.crypto.engines.*;importorg.bouncycastle.crypto.modes.*;importorg.bouncycastle.crypto.params.*;// A simple example that uses the Bouncy Castle// lightweight cryptography API to perform DES// encryption of arbitrary data.publicclassEncryptor{privateBufferedBlockCiphercipher;privateKeyParameterkey;// Initialize the cryptographic engine.// The key array should be at least 8 bytes long.publicEncryptor(byte[]key){/* cipher = new PaddedBlockCipher( new CBCBlockCipher( new DESEngine() ) ); */cipher=newPaddedBlockCipher(newCBCBlockCipher(newBlowfishEngine()));this.key=newKeyParameter(key);}// Initialize the cryptographic engine.// The string should be at least 8 chars long.publicEncryptor(Stringkey){this(key.getBytes());}// Private routine that does the gritty work.privatebyte[]callCipher(byte[]data)throwsCryptoException{intsize=cipher.getOutputSize(data.length);byte[]result=newbyte[size];intolen=cipher.processBytes(data,0,data.length,result,0);olen+=cipher.doFinal(result,olen);if(olen<size){byte[]tmp=newbyte[olen];System.arraycopy(result,0,tmp,0,olen);result=tmp;}returnresult;}// Encrypt arbitrary byte array, returning the// encrypted data in a different byte array.publicsynchronizedbyte[]encrypt(byte[]data)throwsCryptoException{if(data==null||data.length==0){returnnewbyte[0];}cipher.init(true,key);returncallCipher(data);}// Encrypts a string.publicbyte[]encryptString(Stringdata)throwsCryptoException{if(data==null||data.length()==0){returnnewbyte[0];}returnencrypt(data.getBytes());}// Decrypts arbitrary data.publicsynchronizedbyte[]decrypt(byte[]data)throwsCryptoException{if(data==null||data.length==0){returnnewbyte[0];}cipher.init(false,key);returncallCipher(data);}// Decrypts a string that was previously encoded// using encryptString.publicStringdecryptString(byte[]data)throwsCryptoException{if(data==null||data.length==0){return"";}returnnewString(decrypt(data));}}
Para rodar e executar crie um arquivo midlet:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.Reader;importjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;importorg.bouncycastle.crypto.CryptoException;/** * @author usuario */publicclassMidletextendsMIDlet{publicvoidstartApp(){Stringkey="asdf";Encryptorobj=newEncryptor(key);Stringtxt="cuiabá";byte[]res=null;try{res=obj.encryptString(txt);}catch(CryptoExceptionex){ex.printStackTrace();}System.out.println("Crip: "+res);Stringstr=null;try{str=obj.decryptString(res);}catch(CryptoExceptionex){ex.printStackTrace();}System.out.println("Descrip: "+str);}publicvoidpauseApp(){}publicvoiddestroyApp(booleanunconditional){}}
Einsteinmt
Sabe me dizer se é possivel usar o bouncycastle com Jsp ? Preciso na verdade criptografar um arquivo de texto e depois ler pela minha Midlet
bestlinux
Cara, eu sei que existe uma biblioteca especifica para trabalhar com Criptografia no JSP, da uma olhada neste link: