6 votos

Cómo resolver una variable en una ecuación que involucra XOR?

Recientemente se me presentó a XOR y otros operadores bit a bit, mientras que la lectura de algunos artículos en C++. El concepto parece bastante simple, pero puede ser confuso, ya que implica la visualización de los números en binario. Me encontré en una ecuación que involucra XOR en algún momento, mientras que yo estaba buscando algunos ejemplos del mundo real, la gente usa para el cifrado.

Yo estaba desconcertado en la ecuación, y quería aprender cómo resolverlo.

Aquí está la ecuación:

$y = (x * (i+A)+B) \oplus (x*i+C)$

Estoy tratando de resolver para x en la ecuación, con todas las demás variables que se conoce en el momento de resolver. Las Variables a, B y C permanecen constantes en todo momento, con y, x, y puedo cambiar. Esto puede simplificar la ecuación:

$y = (x * (i+32757935)-29408451) \oplus (x*i-5512095)$

Me gustaría aprender a resolver esta ecuación para x, y muchos otros similares en el futuro. Como tal, quiero tener algunos consejos sobre cómo resolverlo. Recuerdo la lectura hasta que la división de la ecuación en un sistema de ecuaciones lineales en el modulo 2 es el camino a seguir, pero no sé cómo hacerlo. He leído acerca de las reglas sobre XOR y tal, pero no estoy seguro de cómo debo ir sobre la creación de un sistema, y la solución.

Nota:

  • Todas las variables son sin signo de 32 bits enteros
  • $\oplus$ es el XOR operación

4voto

hargriffle Puntos 361

Por razones que @JohnWaylandBales señaló, es poco probable encontrar una forma cerrada para $x$ en términos de otras variables. La recursividad enfoque sugerido en que la respuesta es muy interesante, pero también no está claro por qué este enfoque debería funcionar (y sospecho que en muchos de los casos, no; por ejemplo, probablemente para la mayoría de los valores de $x_n$, la CARTA de no ser un número entero).

Podríamos aún la esperanza de un método simple y eficiente/algoritmo para resolver por $x$ a los valores de las otras variables. Esto es un poco confundido por el problema que puede haber varios (o incluso infinitamente muchos) los valores de $x$ que satisfacen la ecuación. Peor aún, incluso si restringimos mirando a $x$ de un cierto tamaño (por ejemplo, 32-bit $x$), todavía puede ser exponencialmente muchas posibles $x$ (un ejemplo divertido pensar en la ecuación de $x \oplus 2x = 3x$).

No sé de ningún modo demostrable método eficiente para encontrar una $x$, ni conozco ningún resultado que dice que es difícil (quizás hay alguna forma de incrustar un NP-completo problema en ecuaciones de este formulario). Dicho esto, aquí es una aproximación heurística que sin duda encontrará todas las $B$-bit soluciones de $x$ a su ecuación, y, posiblemente, pasar mucho menos tiempo que la solución de fuerza bruta.

El truco es notar que tanto los operadores de $+$ $\oplus$ satisface la siguiente propiedad para cualquier entero positivo $k$:

$$((a \bmod 2^{k}) + (b \bmod 2^{k})) \bmod 2^{k} = (a+b) \bmod 2^{k}$$

$$((a \bmod 2^{k}) \oplus (b \bmod 2^{k})) = (a\oplus b) \bmod 2^{k}$$

Esto nos permite construir una solución a la ecuación, a partir de módulo 2, a continuación, progresando modulo 4, modulo 8, hasta que finalmente tenemos soluciones modulo $2^{B}$ (que corresponden a $B$-bit soluciones). Por ejemplo, echemos un vistazo a la ecuación

$$(2x+5)\oplus(3x+4) = 56 $$

Vamos a intentar buscar todos los 6 bits de soluciones de $x$ a esta ecuación (es decir, todos los $x \in [0, 63]$ que satisfacen esta ecuación).

Empezaremos por examinar modulo 2. Modulo 2 $\oplus$ es sólo $+$, por lo que la ecuación se reduce a

$$(2x + 5) + (3x + 4) \equiv 62 \bmod 2$$

o, equivalentemente,

$$x + 1 \equiv 0 \bmod 2$$

De esto se desprende que cualquier solución de $x$ debe ser impar, es decir,$x \equiv 1 \bmod 2$. Procedimiento modulo $4$, $x$ debe satisfacer (modulo 4):

$$(2x + 1) \oplus 3x = 2$$

Sabemos $x$ es impar, por lo que hay dos valores para probar mod 4, es decir,$1$$3$. Nos encontramos con que $1$ no trabaja ($3 \oplus 3 = 0$) sino $3$ ( $7 \oplus 9 = 14 \equiv 2 \bmod 4$ ). Así que ahora sabemos que $x$ $3$ mod $4$.

Tratando de ambos $x=3$$x=7$, nos encontramos con que $x$ debe $3$ mod $8$. Continuando, nos encontramos con que $x$ debe $11$ mod $16$, $11$ mod $32$, e $11$ mod $64$; por lo que la única posible $x$ en nuestra gama que puede funcionar es $x=11$, y podemos comprobar que realmente funciona.

Este procedimiento parece funcionar bastante bien en la mayoría de los casos; en cada paso que normalmente sólo tiene que comprobar $2$ valores posibles modulo $2^k$. Por supuesto, hay casos en que ambas soluciones de mod $2^{k}$ va a trabajar, y esto puede conducir a la exponencial de ramificación. Por ejemplo, $x \oplus x = 0$ conduce inevitablemente a la exponencial de ramificación, ya que cada $x$ es una solución. Más sutilmente, cosas como $(64x + 1) \oplus (192x + 2) = 3$ también conducir a una gran cantidad de ramificación pese a que la única solución es $x=0$, debido a que esta ecuación se reduce a $1 \oplus 2 = 3$ modulo $2^k$$k$$6$. Yo creo que puede ser posible probar algunos generales de caracterización de cuando se hace el trabajo, en términos de potencias de $2$ división $i$, $A$, y $i+A$, pero no he sido capaz de resolverlo todavía.

Espero que esto ayude!

2voto

Sabemos que

  1. $A\oplus B=B\oplus A$
  2. $A\oplus(B\oplus C)=(A\oplus B)\oplus C$
  3. $A\oplus A=0$
  4. $A\oplus 0=A$

Sin embargo, lo que falta son reglas para tratar con

  1. $A\oplus(B+C)$
  2. $A\oplus(B*C)$

Podemos manipular la ecuación de la siguiente manera:

\begin{eqnarray} y &=& (x * (i+A)+B) \oplus (x*i+C)\\ y\oplus (x*i+C) &=& x * (i+A)+B\\ y\oplus (x*i+C)-B &=& x * (i+A)\\ x&=&\frac{y\oplus (x*i+C)-B}{i+A} \end{eqnarray}

Esto abre la posibilidad de utilizar una recursividad que esperemos que converge a una solución para $x$:

\begin{equation} x_{n+1}=\frac{y\oplus (x_n*i+C)-B}{i+A} \end{equation}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X