Foro de elhacker.net

Foros Generales => Dudas Generales => Mensaje iniciado por: AlbertoBSD en 5 Enero 2020, 05:26 am



Título: XOR entre enteros llega al mismo resultado que entre bytes? (Solucionado)
Publicado por: AlbertoBSD en 5 Enero 2020, 05:26 am
He estado algo estancado con la siguiente duda.

El operador ^ es un XOR, un código de javascript lo aplica asi.

Código
  1. for (var i = 0; i < ckey.sigBytes/4; i += 1) {
  2. ckey.words[i] = ckey.words[i] ^ csig.words[i]
  3. }

Donde words son números enteros signed de 32 bits, sigBytes son vale 32,  La api de javascript lo maneja de esa forma, en PHP yo tengo el binstring de 32 bytes (raw de un hash sha256) ¿si yo realizo el XOR a los bytes individuales uno a uno llego al mismo resultado?

Ejemplo.
Código
  1. while($i < 32) {
  2. $ckey[$i] = $ckey[$i] ^ $csig[$i];
  3. $i++;
  4. }

Creo que la pregunta es algo boba, pero a esta altura del dia ya no tengo cabeza para  responderme yo mismo.

Saludos!


Solucionado

Si es lo mismo, todo depende que las variables evaluadas sean del mismo tamaño. Como comenta MinusFour.

Saludos!


Título: Re: XOR entre enteros llega al mismo resultado que entre bytes?
Publicado por: @XSStringManolo en 5 Enero 2020, 07:47 am
He estado algo estancado con la siguiente duda.

El operador ^ es un XOR, un código de javascript lo aplica asi.

Código
  1. for (var i = 0; i < ckey.sigBytes/4; i += 1) {
  2. ckey.words[i] = ckey.words[i] ^ csig.words[i]
  3. }

Donde words son números enteros signed de 32 bits, sigBytes son vale 32,  La api de javascript lo maneja de esa forma, en PHP yo tengo el binstring de 32 bytes (raw de un hash sha256) ¿si yo realizo el XOR a los bytes individuales uno a uno llego al mismo resultado?

Ejemplo.
Código
  1. while($i < 32) {
  2. $ckey[$i] = $ckey[$i] ^ $csig[$i];
  3. $i++;
  4. }

Creo que la pregunta es algo boba, pero a esta altura del dia ya no tengo cabeza para  responderme yo mismo.

Saludos!
Es lo mismo creo yo. Solo que en js son 32 bits y en php 32 bytes.
En js divide entre 4 y obtiene 8 bits(1byte) y entonces le aplica xor. En PHP tu ya tienes el byte y le aplicas xor. Creo que es lo mismo porque en ambos bucles se aplica internamente el Xor bit a bit y ambas aplican xor de un byte con el siguiente.

Por cierto, releyendo el título de tu pregunta, en JS no hay enteros. Son todo floats https://en.m.wikipedia.org/wiki/IEEE_754

Si por enteros te refieres a decimales, es lo mismo.


Título: Re: XOR entre enteros llega al mismo resultado que entre bytes?
Publicado por: MinusFour en 5 Enero 2020, 15:55 pm
Siempre y cuando las dos fuentes y los operadores sean del mismo tamaño y no excedan el tamaño máximo del operador deberían ser lo mismo.

El operador xor no necesita información de otros bits alrededor. Es lo mismo hacer:

Código:
11111111
^
00000000

Que:

Código:
1  1  1  1  1  1  1  1
^  ^  ^  ^  ^  ^  ^  ^
0  0  0  0  0  0  0  0

o

Código:

11  11  11  11
^   ^   ^   ^
00  00  00  00

o

Código:

1111  1111
^     ^
0000  0000

Etc, etc...

Lo único que debe preocuparte es la conversión que pudiera hacer los operadores y que termine truncando o modificando alguno de los operadores.


Título: Re: XOR entre enteros llega al mismo resultado que entre bytes?
Publicado por: AlbertoBSD en 5 Enero 2020, 19:19 pm
Es lo mismo creo yo. Solo que en js son 32 bits y en php 32 bytes.
En js divide entre 4 y obtiene 8 bits(1byte) y entonces le aplica xor. En PHP tu ya tienes el byte y le aplicas xor. Creo que es lo mismo porque en ambos bucles se aplica internamente el Xor bit a bit y ambas aplican xor de un byte con el siguiente.

Si ya despues de dormir algo, estoy seguro que si siempre y cuando se cumpla lo que dince MinusFour

Siempre y cuando las dos fuentes y los operadores sean del mismo tamaño y no excedan el tamaño máximo del operador deberían ser lo mismo.

El operador xor no necesita información de otros bits alrededor.

Un poco de contexto, las variables del javascript que se están evaluando se supone que es el resultado de un hash sha256 de la librería CryptoJS

Pero esta libreria tiene una forma algo rara o simple de manjar los datos. Segun lei devuelve un objeto con un array de words y la variable sigBytes

Código:
CryptoJS.SHA256(str),It return this
{ words:
[ 1165750581,
1028330380,
-459297786,
-947376156,
-1078028390,
-767246913,
1573962699,
-482922654 ],
sigBytes: 32 }

Cito:

Citar
The hash you get back isn't a string yet. It's a WordArray object. When you use a WordArray object in a string context, it's automatically converted to a hex string.
var hash = CryptoJS.SHA256("Message");

https://cryptojs.gitbook.io/docs/#the-hashing-output

Código:
var hash = CryptoJS.SHA256("Message");

typeof hash
> "object";

hash
> "2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91";

Voy a depurar un poco ya que estoy reverseando el login de un Modem 4G y utiliza mucha "Seguridad a través de la oscuridad" cosas asi feas como:

Código
  1. psd = base64encode(SHA256(name + base64encode(SHA256($('#password').val())) + g_requestVerificationToken[0]));

Código
  1. var authMsg = firstNonce + "," + finalNonce + "," + finalNonce;

Voy a depurar por que en alguno de los pasos intermedios no me esta dando el mismo resultado y no llego al mismo token producido por el javascript.

Muchas gracias por sus respuesta.

Saludos!


Título: Re: XOR entre enteros llega al mismo resultado que entre bytes? (Solucionado)
Publicado por: Serapis en 5 Enero 2020, 19:24 pm
Las operaciones buleanas son 'atómicas'. Se aplican bit a bit, así que no importa la cantidad de bits de los operandos.

Las operaciones aritméticas en cambio, producen acarreos y desbordamientos, es decir una operación aplicada a un bit, puede implicar (un cambio) al bit anterior o posterior. Nunca es el caso de las operaciones buleanas.