¿Puedes resolver este rompecabezas de la NSA? cómo ?

La primera imagen es el texto cifrado. Y la segunda imagen es la clave para el descifrado.

La idea es así:

  1. Iterar a través de los dígitos del texto cifrado.
    1. Si el dígito en la i ^ ésima posición del texto cifrado <Si el dígito en la i ^ ésima posición de la clave, agregue 10.
    2. Reste el dígito en la posición i ^ th de la clave del dígito en la posición i ^ th del texto cifrado
  2. Divide el resultado en fragmentos de dos dígitos.
  3. Convierta cada fragmento de dos dígitos al alfabeto en esa posición. 1 = A, 2 = B .. 26 = Z, 27 = A …

Ahí tienes ..

El resultado es,

postularse hoy mismo en mi júnior x personas extraordinarias haciendo trabajo extraordinario

El JavaScript para el mismo fue publicado en, Resolviendo el pequeño rompecabezas de la NSA

Ejecute este javascript en la consola de su navegador para obtener la salida.

// Solución JavasScript para el rompecabezas OTP de la NSA
//https://www.facebook.com/NSACareers/photos/a.10150165394744358.374663.38534064357/10155202632259358/?type=3&theater
var cipherText = “6097703920902805098792458100127006308920278750110017283152904512008635073921961285410397244195102032905201942802717080593227”;
var key = “6981642705701301086201207791115091207421138236919216132358913111926129022415841781360483274671901231854407951401635567442416”;
var mensaje = “”;
// compensa esto para que letters.charAt (1) devuelva A y letters.charAt (26) devuelva Z
letras var = “abcdefghijklmnopqrstuvwxyz”;
// Haciendo el segundo paso aquí: https://en.wikipedia.org/wiki/One-time_pad#Example
// Recorriendo el texto cifrado y la clave un carácter a la vez
// Si el carácter de texto cifrado (c) es menor que el carácter clave (k), agregue 10
for (var i = 0; i <cipherText.length; i ++) {
var c = Número (cipherText.charAt (i));
var k = Número (key.charAt (i));
si (c <k) {
c + = 10;
}
var p = c – k;
mensaje + = p.toString ();
}
// mensaje ahora contiene una cadena de números. Para convertirlos a letras, primero divídalos en
// fragmentos de dos dígitos.
var plainTextArray = message.match (/. {1,2} / g);
var respuesta = “”;
// Ahora recorra cada fragmento, conviértalo en un número y luego agregue el valor de la letra correspondiente
// a la respuesta
plainTextArray.forEach (function (elemento, índice, matriz) {
// Cada número de dos dígitos es una letra. Entonces “01” es a, “26” es z. Para valores> 26
// ir al comienzo del alfabeto
var letterIndex = Number (elemento)% 26;
respuesta + = letras [letterIndex];
})
// muestra la respuesta
console.log (respuesta);

La NSA (Agencia de Seguridad Nacional) hace una pregunta para que podamos asumir que se necesita un poco de esfuerzo para resolver este problema. Primero debe saber qué es la criptografía: léala aquí.

Nos dan dos bloques de números aleatorios en la imagen compartida por la NSA a través de Twitter. Por lo tanto, podemos suponer que primero es CipherText y segundo que es la clave simétrica.

Ahora, si está familiarizado con el funcionamiento de One-time pad, no es posible descifrar el primer bloque de números sin usar el segundo bloque.

Es similar al par de claves SSH donde se genera una clave en su disco local para obtener acceso a su cuenta sin usar su contraseña. Puedes leer más sobre esto aquí – SSH / OpenSSH / Keys – Wiki de ayuda comunitaria

No puedo hacerlo manualmente, así que necesito escribir un código. Usaré python para hacerlo, ya que me siento cómodo con él. Puedes usar cualquier idioma que prefieras.

Puede encontrar el código en mi cuenta de github: A-Genva / NSA_Puzzle

Para aquellos que no quieren ejecutar el código:

Imprime la salida para ser –

“Postularse hoy mismo en mi júniorx personas extraordinarias que hacen un trabajo extraordinario”

Y al agregar espacios en los lugares adecuados obtenemos:

“Solicite hoy mi nsa para unirse a personas extraordinarias que realizan un trabajo extraordinario”

Probablemente haya un error por parte de la NSA. En lugar de “mi” debería ser “at”

“Solicite hoy en nsa para unirse a personas extraordinarias que realizan un trabajo extraordinario”

Salud !!

Parecía una cosa intrigante para jugar, y mucha gente ofreció algunas sugerencias interesantes para probar. Terminé siguiendo la ruta de convertir los números a binario y luego ver si podían convertirse a caracteres ASCII, pero eso fue infructuoso. También probé cosas como los cifrados homofónicos, pero nada pareció funcionar, y la razón por la cual fue el caso se reveló con la segunda imagen, que se publicó con el mensaje “¿Has oído hablar de una OTP?”:

Una OTP es una plataforma de un solo uso, que es teóricamente segura de información. Es decir, cuando se usa correctamente, un adversario no tiene suficiente información para romper el cifrado. Cuando se rompen es por la reutilización de la misma OTP, que puede permitir un ataque de análisis de frecuencia.

Entonces, eso nos lleva a resolver el pequeño rompecabezas de la NSA. Con el texto cifrado y la clave disponibles (tomados de las imágenes a través de OCR), esto se logra utilizando el siguiente código Javascript:

// Solución JavasScript para el rompecabezas OTP de la NSA
// https://www.facebook.com/NSACareers/photos/a.10150165394744358.374663.38534064357/10155202632259358/?type=3&theater
var cipherText = “6097703920902805098792458100127006308920278750110017283152904512008635073921961285410397244195102032905201942802717080593227”;
var key = “6981642705701301086201207791115091207421138236919216132358913111926129022415841781360483274671901231854407951401635567442416”;
var mensaje = “”;
// compensa esto para que letters.charAt (1) devuelva A y letters.charAt (26) devuelva Z
letras var = “abcdefghijklmnopqrstuvwxyz”;
// Haciendo el segundo paso aquí: https://en.wikipedia.org/wiki/One-time_pad#Example
// Recorriendo el texto cifrado y la clave un carácter a la vez
// Si el carácter de texto cifrado (c) es menor que el carácter clave (k), agregue 10
for (var i = 0; i var c = Número (cipherText.charAt (i));
var k = Número (key.charAt (i));
si (c c + = 10;
}
var p = c – k;
mensaje + = p.toString ();
}
// mensaje ahora contiene una cadena de números. Para convertirlos a letras, primero divídalos en
// fragmentos de dos dígitos.
var plainTextArray = message.match (/. {1,2} / g);
var respuesta = “”;
// Ahora recorra cada fragmento, conviértalo en un número y luego agregue el valor de la letra correspondiente
// a la respuesta
plainTextArray.forEach (función (elemento, índice, matriz) {
// Cada número de dos dígitos es una letra. Entonces “01” es a, “26” es z. Para valores> 26
// ir al comienzo del alfabeto
var letterIndex = Number (elemento)% 26;
respuesta + = letras [letterIndex];
})
// muestra la respuesta
console.log (respuesta);

Puede copiar y pegar eso en las herramientas de desarrollo de su navegador para verlo funcionar, pero para aquellos que no están interesados ​​en hacerlo, esto es lo que obtiene:

postularse hoy en día mi janata x personas extraordinarias haciendo trabajo extraordinario

Agregar algunos espacios y mayúsculas para hacerlo más legible:

Solicite hoy mi NSA para unirse a personas extraordinarias que realizan un trabajo extraordinario

El “mi” parece extraño, y la mayoría de la gente terminó asumiendo que era el resultado de un error por parte de la NSA. Lo siguiente parece un poco mejor:

Solicite hoy en NSA para unirse a personas extraordinarias que realizan un trabajo extraordinario

Respuestas de Eric Brandel

Haga clic aquí para ver la solución: Resolver el pequeño rompecabezas de la NSA

No resolví esto. Todo el crédito va para Eric Brandel, quien descifró el mensaje encriptado con una libreta de un solo uso.

En realidad si sabes binario y eres un lector de datos como yo. puedes resolver una solicitud de trabajo tan fácil, básicamente. Usted sabe el verdadero binario de memoria y puede resolver eso, entonces quieren que trabaje con ellos. Pero de todos modos, en realidad no es lo que significa, solo separe los otros números que no son 0,1, use la secuencia numérica que obtiene después de cada conjunto de binarios, aplíquelo a la secuencia numérica y luego continúe y luego http: // on. demasiado