XOR entre arrays de string

Boas
O meu problema é:
Eu tenho 2 arrays de strings e quero fazer um xor entre eles, de modo a meter os resultados num novo array.
No entanto os arrays tanto podem ter valores decimais como chars (daí estarem em formato string).

Exemplo:

int testar=3;
String[] test = { "10", "A", "4" }; //Uma das Strings
String[] e = new String[testar]; //String de dimensao 3

double K=0, N=256; //Variáveis para a chave (não liguem muito a isto)
      int A=30, B=21, X0=14; 
      
//Sequência decimal pseudo-aleatória (criação de chave pra encriptação)
    for(int i=0; i<testar; i++) { 
    K=(A*X0)+B; //Primeira parte da conta do pseudo-código
      X0=(int)(K%N); //Segunda parte da conta do pseudo-código, no qual obtemos os "restos" que vaõ ser colocado na chave "k".
      k[i]=X0; //Array de Strings com 3 valores decimais
}

//O problema vem agora
    for(int a=0; a<testar; a++) {
    e[a]=k[a]^test[a]; 
    }

//Erro: operator ^ cannot be applied to int,java.lang.String

Alguem me pode dar umas luzes de como resolver este problema?
Bgd

como vc planeja fazer xor entre strings?

qual é a tabela verdade disso? vc pensa bit-a-bit de acordo com o valor ASCII?

Para fazer exponenciação você precisa utilizar o método pow(double,double) encontrado na classe Math.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html#pow(double,%20double)

Ex.:

System.out.println(Math.pow(2.0, 0.5));

Reiver, o método padrão de gerar uma chave criptográfica a partir de uma senha (que é o que você gostaria de fazer) não é com xors e outras tranqueiras (a menos que você esteja tentando portar um algoritmo tosco de um programa que já existe). Usar só XORs é um lixo, já vou lhe dizendo. Em vez de reinventar a roda, use algo que foi criptograficamente analisado por profissionais.

O padrão é usar o PBKDF2 (Password-Based Key Derivation Function), definida na RFC 2898.

http://www.ietf.org/rfc/rfc2898.txt

Um exemplo em Javascript:

http://anandam.name/pbkdf2/

O que acontece é k o programa utiliza um codigo chamado “Sequência binaria pseudo-aleatória” que por sua vez cria uma chave de onde obtemos vários números decimais.
Imaginemos que os resultados são 10, 7, 4, 24, a chave em binário ficaria a ser 01010.00111.00100.11000
Por sua vez este programa também vai buscar um ficheiro .txt como se pode ver em baixo:

char[] buffer = new char[1024] ;
try {
FileReader r = new FileReader(“G:\input.txt”) ; //Lê o ficheiro (input)
FileWriter w = new FileWriter(“G:\output.txt”) ; //Cria uma saída (output)
while((len = r.read(buffer)) != -1) //Lê o ‘r’ 1024 espaços
w.write(buffer, 0, len) ; //Escreve o ‘r’ no ‘buffer’ desde a pusição zero até à posiçaõ onde n ha mais escrita
r.close() ; //Fecha o ‘r’
w.close() ; //Fecha o ‘w’
}
catch(IOException e) {
// Tratar a excepção.
}

Agora o que eu quero são 2 coisas:
1º Arranjar maneira de tirar o Array de strings de seu nome “buffer” de dentro deste código try, para que o possa utilizar mais à frente.
2º Comparar caracter a caracter do txt (array buffer[]), com cada um dos números obtidos na sequencia binária (array k[]) atravez dum XOR.

Possíveis Problemas:
Um está em decimal o outro está em char, no entanto, segundo sei, passando o que está em decimal para binário supostamente o java tem capacidade para comparar binário com char (código ascii, tal como o peczeny disse e mto bem). No entanto tenho problemas com o XOR quando comparo valores binários com chars…acho estranho! na consola fiz o teste e deu perfeitamente, no programa em si não dá pk?

Vou dizer uma coisa: um char (16 bits) não é um byte (8 bits), e é por isso que você está se enrolando todo.

Uma forma de você fazer o que você quer é converter a string para um array de bytes, trabalhar com os bytes, e então não converter de volta para uma string, porque você vai obter dados que muitas vezes não podem ser convertidos de volta para uma string confiavelmente.
Se for voltar para uma string, codifique os bytes antes (hexadecimal ou base-64).

Vou dar um pequeno exemplo. Digamos que você tenha a seguinte string:

String s = &quot;Maria Jacinto das Dores Passos Dias Aguiar&quot;;

e queira efetuar um XOR com a sequencia repetitiva de bytes {10, 2, -34, 72};

byte[] seq = {10, 2, -34, 72};

Um programa que faria isso é o seguinte (estou ignorando o tratamento de exceções):

String s = &quot;Maria Jacinto das Dores Passos Dias Aguiar&quot;;
byte[] seq = {10, 2, -34, 72};
byte[] bytes = s.getBytes (&quot;ISO-8859-1&quot;); // converteu para um array de bytes
byte[] saida = new byte[bytes.length];
for (int i = 0; i &lt; bytes.length; ++i) {
    saida [i] = bytes [i] ^ seq [i % seq.length];
}
// Ao final do loop acima, o byte array &quot;saida&quot; conterá os bytes de s, mas com o XOR com a sequencia de bytes seq.

Obrigado thingol, vou ja testar isso, parece-me uma simples e boa solução.

No entanto tenho 2 perguntas:

O que significa isto? “ISO-8859-1”

E porque é que na operação XOR se usa ‘%’ (resto) entre o divisor ‘i’ (posição do array) e o dividendo ‘seq.length’ (tamanho da sequencia)?

[quote=Reiver]Obrigado thingol, vou ja testar isso, parece-me uma simples e boa solução.

No entanto tenho 2 perguntas:

O que significa isto? “ISO-8859-1”

E porque é que na operação XOR se usa ‘%’ (resto) entre o divisor ‘i’ (posição do array) e o dividendo ‘seq.length’ (tamanho da sequencia)?[/quote]

Não sou o thingol, mas devo me arriscar para tentar responder:

“ISO-8859-1” seria o nome do “charset”, algo que pode ser entendido como uma tabela que associa um valor numérico “primitivo” a um caractere “imprimível”, usada para converter um caractere imprimível para um valor numérico primitivo e vice-versa.

Pelo que pude entender, usa-se ‘%’ (resto) entre o divisor ‘i’ (posição do array) e o dividendo ‘seq.length’ (tamanho da sequencia) para se impedir um ArrayIndexOutOfBoundsException, que normalmente ocorre ao se tentar acessar uma posição inválida de um vetor/matriz. O resto da divisão por ‘seq.length’ será sempre um valor menor que ‘seq.length’ e maior que -1, tornando esse resto um valor seguro para se usar como posição a ser acessada num vetor/matriz.

Inté.

Ok, ja percebi!

Dessa maneira ele efectua divisões e os dividendos como sao sempre menores que o divisor o resto vai ser o proprio dividendo.
E se por acaso passa-se do limite, o resto é sempre menor que o divisor que neste caso é o tamanho do array, logo vai dando a volta e nunca vai para uma posição inválida.

Bem pensado.

Bgd KWill pela ajuda na compreensão do programa.

2 problemas:

1º - Não se pode fazer xor entre bytes e inteiros
2º - Apareceu “unreported exception java.io.UnsupportedEncodingException; must be caught or declared to be thrown” nesta zona: "byte[] bytes = s.getBytes (“ISO-8859-1”); "

a) Ok, então:

saida [i] = (byte) ((int) bytes [i] ^ (int) seq [i % seq.length]);  

b) Para o segundo problema, declare o “try/catch” correspondente. Acho que você já aprendeu a usar try/catch, não?

Ja está resolvido

Bgd thingol