Newsgroup: it.comp.java
Titolo: Problema  di conversione stringa da byte array (e ritorno)

Ciao a tutti,
ho un problema, sicuramente idiota, ma che mi ha fatto perdere 2 ore 
ieri e sono lungi dall'aver risolto.
La versione lunga (che si può saltare dal leggere) è che devo prendere 
un xml, criptarlo in chiave simmetrica e mandarlo a un altra macchina 
con altra tecnologia, riaprirlo ed usarlo.
Il problema è che una volta fatto tutto questo l'xml decriptato  ha il 
90% dei caratteri illeggibili.
Risalendo alla fonte del problema ho notato che anche dalla stessa 
servlet java se cripto e decripto il risultato è corrotto.
Il primo pensiero è stato il charset, ma premesso che all'interno della 
stessa servelet voglio presumere sia costante, ho provato a specificarlo 
in ogni mopdo con risultati peggiori del non farlo...
 
Detto tutto questo un po' di codice (quello incriminato, passkey e 
authDataHolderXMLText sono banali stringhe):
 
SecretKeySpec key = new SecretKeySpec(passkey.getBytes(), "AES");
 
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
					cipher.init(Cipher.ENCRYPT_MODE, key);
 
byte[] crittato=cipher.doFinal(authDataHolderXMLText.getBytes());
 
String crittatoString = new String(crittato);
 
byte[] crittato2=crittatoString.getBytes();
 
boolean test=Arrays.equals(crittato,crittato2);
 
 
 
 
Test da false, ma anche ispezionando le 2 variabili (crittato e 
crittato2) dal debug di eclipse sono palesemente diverse.
Se dal byte array decripto (variabile crittato), tutto torna ok, quello 
che da fastidio è il passaggio in stringa (che però mi serve dato devo 
comunicare con un sistema remoto).
Ho provato a dare utf8 al getBytes(), ho provato a creare la stringa da 
byte array con utf8 specificato, a fare le 2 cose assieme o separate... 
niente...
 
Se faccio lo sesso passaggio senza criptare (quindi da xml stringa a 
bytearray e da li a stringa) tutto ok. Quindi il problema è che l'xml 
criptato avrà caratteri evidentemente a lui sgraditi e se cerco di 
passarlo in stringa devasta il dato.
 
Sicuramente il problema è sciocco, ma sono davvero a corto di idee...
Qualcuno ha suggerimenti?
 
-- 
Z.

 comunicare con un sistema remoto).
 
Mi sembra di capire che non solo devi comunicare con un sistema remoto 
ma vuoi anche farlo in maniera testuale invece che binaria, altrimenti 
potresti inviare direttamente l'array di byte.
 
Ora se vuoi farlo in maniera testuale che io sappia devi usare 
l'encoding base64, non convertire l'array di byte in oggetto String come 
stavi facendo.
 
Lato ricevente dovrai riconvertire il Base64 in array di bytes.
 
Java non mi pare offra un API pubblica per il Base64, puoi usare per 
esempio quella fornita in Apache Commons.

 stavi facendo.
 
Spiego meglio: questo perche' l'array di byte che ti restituisce la 
Cipher.doFinal e' fatto di caratteri non stampabili e quindi non ha 
senso a convertirlo in stringa (infatti non riesci).
 
Da qui il motivo di usare Base64.
 
E' lo stesso caso di quando si invia un allegato binario di una email 
(come un'immagine) che va convertito in base64 per poter essere spedito 
in modo testuale.
 
Ciao.


sai che sono così scemo che poi la stringa cmq la encodo in base64?:P
solo che la libreria che usavo si prende stringa in ingresso e non byte 
array (it.sauronsoftware.base64). Provo a usare un base64 diverso che si 
mangi il byte array (in realtà provo sett prox, perchè fino ad allora 
sono allocato su altro).
Se mi hai risolto il prb ti ringrazierò a vita:)
 
-- 
Z.

 array (it.sauronsoftware.base64).
 
Sicuro sicuro? Perche' leggendo qui:
http://www.sauronsoftware.it/projects/javabase64/api/it/sauronsoftware/base64/Base64.html
 
paiono esserci i metodi encode e decode anche con array di byte.
Inoltre ti ritornano un array di byte ma quello dovresti poterlo 
trasformare in stringa senza problemi.
Ciao e buon divertimento.


Funziona!!!!!
dopo il base64 in bytearray lo porto in stringa x passarlo ,ma a quel 
punto non faccio + danni (come del resto già dicevi:D), dall'altra parte 
ritiro su tutto e va benone!
Millemila volte grazie :)
 
-- 
Z.