XOR entre enteros llega al mismo resultado que entre bytes? (Solucionado)

Iniciado por AlbertoBSD, 5 Enero 2020, 05:26 AM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

He estado algo estancado con la siguiente duda.

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

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


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 (php) [Seleccionar]
while($i < 32) {
$ckey[$i] = $ckey[$i] ^ $csig[$i];
$i++;
}


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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

@XSStringManolo

#1
Cita de: 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 (javascript) [Seleccionar]
for (var i = 0; i < ckey.sigBytes/4; i += 1) {
ckey.words[i] = ckey.words[i] ^ csig.words[i]
}


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 (php) [Seleccionar]
while($i < 32) {
$ckey[$i] = $ckey[$i] ^ $csig[$i];
$i++;
}


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.

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. Es lo mismo hacer:


11111111
^
00000000


Que:


1  1  1  1  1  1  1  1
^  ^  ^  ^  ^  ^  ^  ^
0  0  0  0  0  0  0  0


o



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


o



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.

AlbertoBSD

Cita de: @?0!,5^34 en  5 Enero 2020, 07:47 AM
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

Cita de: 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.

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

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


Cito:

CitarThe 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

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 (javascript) [Seleccionar]
psd = base64encode(SHA256(name + base64encode(SHA256($('#password').val())) + g_requestVerificationToken[0]));

Código (javascript) [Seleccionar]
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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Serapis

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.