Problema protocollo di sicurezza con alcuni pacchetti!

Salve a tutti, ho il seguente problema che non riesco a spiegarmi: ho creato un protocollo di sicurezza per far comunicare arduino e una mia applicazione scritta in java. Quando voglio effettuare il login, viene inviato un pacchetto come il seguente:

hdk%G.EwPVes.9qt=!uH%8Bv>vrN(L

dove il testo tra i due % rappreneta la parola chiave per il login. Il tutto viene criptato eseguendo lo XOR di ogni byte del messaggio con il rispettivo byte della chiave di sicurezza (ovviamente sia l'app java che arduino ne hanno una copia).
Stampando il pacchetto criptato sia all'uscita dall'app java che all'ingresso nell'arduino sembra risultare uguale (dico sembra perchè non tutti i caratteri sono visualizzabili).
Qui sorge il problema: per alcuni pacchetti (1 su 10), dopo la decriptazione (eseguendo sempre lo XOR di ogni byte del messaggio con il rispettivo byte della chiave) invece di ritornare un messaggio uguale a quello inviato, ottengo:

hdk%GXseCMiiTwQ88hNcRcutEaY58c

In questo caso solo i primi 5 byte sono giusti (la lunghezza dei byte giusti è variabile).
Qualcuno sa quale potrebbe essere il problema?

Lo xor dovrebbe essere identico sia eseguito con java che con arduino, ma qui sembra di no..
Riporto qui sotto il codice per la criptazione lato java:

for (int i=0;i<secretChar.length;i++)  //secretChar è il messaggio da criptare
            secretChar[i] = (char)(secretChar[i] ^ keyChar[i]);
        return String.valueOf(secretChar);

e per la decriptazione lato arduino:

void Security::enDecrypt (char *mess, char *key, int dim){  
  for(int i=0;i<dim;i++){    
      mess[i] = mess[i] ^ key[i];
  }
}

il controllo dati del TCP non è corretto al 100%, anzi.. però è una cosa molto rara.