¿Cómo XOR una cadena usando una matriz de bytes como clave?

String encodedString = myString XOR myKey

Esto no es correcto. Una cadena en Java puede tener cualquier codificación. La codificación de una cadena es una representación que utiliza una codificación de caracteres específica en bytes , es decir, una matriz de bytes.

Entonces harías:

byte[] encodedString = myString.getBytes(StandardCharsets.UTF_8);

para recuperar los bytes.

Luego puede iterar sobre los bytes del encodedStringuso de un índice. Obtendría el byte en la misma ubicación en la clave binaria y XOR los dos bytes juntos. El resultado se puede poner en una nueva matriz del mismo tamaño que encodedString. Tenga en cuenta que Java es un poco extraño en el sentido de que puede requerir una conversión a un valor de byte para hacerlo, es decirresult[i] = (byte) xorResult

Comúnmente, tendrá que restablecer el índice dentro de la clave a cero nuevamente si se queda sin bytes en la clave. Si eso sucede, su esquema de encriptación se volverá vulnerable a los ataques, ya que un pad único (OTP) es seguro, pero el cifrado XOR ciertamente no lo es.

Después del descifrado, que es la misma operación que el cifrado, puede recuperar su cadena usando:

String myString = new String(encodedString, StandardCharsets.UTF_8);

Obviamente, tendría que hacer lo mismo para la clave si se trata de una cadena. Sin embargo, tenga en cuenta que, incluso si la clave está bien distribuida sobre los caracteres imprimibles , los valores de bits probablemente no estén bien distribuidos. En otras palabras, una cadena como clave XOR te deja vulnerable al análisis criptográfico, el análisis de frecuencia en los bits y bytes en particular.


El XOR dará como resultado bytes aleatorios, por lo que puede que necesite codificar en base 64 (después del cifrado) / decodificar (antes del descifrado) para obtener una cadena de texto cifrado en lugar de una matriz de bytes.


He omitido deliberadamente el código para hacer esto, ya que esta es una tarea práctica, ¡diviértete implementándola!

Respuesta 1

He escrito este código para la importación de servlets java.io. *; import javax.servlet. *; import javax.servlet.http. *; public class Httpservlet1 extiende HttpServlet {public void doGet (...

Este es mi intento de hacer un mapa de cubos. glDisable (GL_TEXTURE_2D); glEnable (GL_TEXTURE_CUBE_MAP); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); ...

Tengo un proyecto Java con algunas pruebas de Cucumber y algunas pruebas regulares de JUnit, administradas por Maven. Quiero ejecutar las pruebas en Jenkins, usando Docker, así que escribí este Jenkinsfile: pipeline {agent {...

He estado escribiendo un videojuego basado en texto en Java (soy nuevo en Java, por cierto), y no tiene el rendimiento que esperaba, específicamente el habla. Quiero que el texto aparezca como si la persona ...