Codebreakers y Codewriters

18

Supongamos que tiene texto y desea que se lo envíe a su amigo, pero no quiere que nadie más lo lea. Eso probablemente significa que desea cifrarlo para que solo usted y su amigo puedan leerlo. Pero hay un problema: usted y su amigo olvidaron ponerse de acuerdo sobre un método de cifrado, por lo que si les envía un mensaje, ¡no podrán descifrarlo!

Después de pensar en esto por un tiempo, decides enviarle a tu amigo el código para cifrar tu mensaje junto con el mensaje. Tu amigo es muy inteligente, por lo que probablemente puedan descubrir cómo descifrar el mensaje estudiando el método de cifrado.

Por supuesto, dado que otras personas podrían estar leyendo el mensaje, desea elegir un esquema de cifrado que haga que sea lo más difícil de descifrar (descubra el esquema de descifrado).

Tarea de policías

En este desafío, los policías desempeñarán el papel del escritor: diseñarás un esquema de cifrado que convierta cadenas en cadenas. Sin embargo, este esquema de cifrado debe ser biyectivo , lo que significa que no se deben asignar dos cadenas a otra cadena, y cada cadena se puede asignar a una entrada. Debe tomar solo una entrada: la cadena a codificar.

Luego publicará un código que realiza el cifrado y un solo mensaje cifrado con el esquema detallado por su código.

Como está pagando por byte para enviar mensajes, su puntaje será la longitud de su código más la longitud del texto cifrado . Si su respuesta está descifrada, tendrá una puntuación infinita.

Después de una semana, puede revelar el texto y marcar su respuesta como segura . Las respuestas seguras son aquellas que no se pueden descifrar.

Tarea de ladrones

Los ladrones jugarán como el amigo del escritor o el intermediario malicioso (no hay diferencia material, pero puedes jugar como si fuera más divertido hacerlo). Tomarán los esquemas de cifrado y el texto cifrado e intentarán descifrar el mensaje cifrado. Una vez que descubran el mensaje cifrado, lo publicarán en un comentario. (No habrá un hilo separado de ladrones para esta pregunta).

El ganador será el ladrón con más grietas.


Aquí hay un ejemplo de cómo se vería una solución agrietada:

Comprar más naranjas

Asistente de trigo
fuente
Si la codificación es biyectiva, ¿cuáles son el dominio y el codominio?
Leaky Nun
¿Las cuerdas con qué personajes?
Leaky Nun
1
@WheatWizard ¿Qué 256? Te refieres a 256 bytes, no a los caracteres ¿verdad?
Erik the Outgolfer
77
¿Qué puede impedir que alguien use una función criptográficamente segura?
Tutleman
2
¿Sobre quién es la carga de probar la biyectividad: el policía o los posibles ladrones? Es decir, si se desconoce si una función es biyectiva, ¿qué sucede?
Stephen

Respuestas:

5

Gelatina , 57 + 32 = 89 bytes ( agrietada )

“¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’
O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ

Mensaje cifrado:

EªæBsÊ$ʳ¢?r×­Q4e²?ò[Ý6

Como una cadena hexadecimal:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Explicación:

O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ
O                     convert each into codepoint
 ‘ḅ256                convert from bijective base 256 to integer
      b¢              convert from integer to base N
        *21           map each to its 21th power
           %¢         modulo N
             ḅ¢       convert to integer from base N
               ḃ256’  convert from integer to bijective base 256
                    Ọ convert each from codepoint

Donde Nestá codificado por la cadena “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, que es el número 105587021056759938494595233483151378724567978408381355454441180598980268016731.

Además, este es el método RSA con Nla clave pública y la anterior 21. Romper esto es equivalente a encontrar los dos factores primos de N.

Monja permeable
fuente
Bien. Puedo descifrar mi propio mensaje cifrado con la clave que he encontrado, pero parece fallar con la suya. : - / (El resultado esperado no es un mensaje de 4 caracteres que no esté en inglés, ¿verdad?)
Arnauld
3
El mensaje es _ìNbPruébelo en línea! ).
Anders Kaseorg
@AndersKaseorg Yup. Eso es lo que tenía, pero esperaba algo un poco más significativo. :-)
Arnauld
1
Para lo que vale, aquí está el código que usé de mi lado.
Arnauld
1
@AndersKaseorg Jelly intenta evaluar sus argumentos, por lo que los bytes nulos son posibles. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis
5

Gelatina , 88 + 64 = 152 bytes

Función de cifrado:

“¥@ɦ⁺€€Ṅ`yȤDƁWĊ;Y^y⁻U ⁸ßɠƁXẹṡWZc'µ÷ḷỊ0ÇtṙA×Ḃß4©qV)iḷỊDƭ Mṛ+<ṛ_idðD’
O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ

Mensaje cifrado:

AX!?ÖÍL¹    JÓ°û0àah4Û{µÌá`
^tÝrRÕù#êwðãTÓK"Íû´Ëß!øòOf«

Como una cadena hexadecimal:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Explicación:

O‘ḅ256b¢*13%¢ḅ¢ḃ256’Ọ
O                     convert each into codepoint
 ‘ḅ256                convert from bijective base 256 to integer
      b¢              convert from integer to base N
        *13           map each to its 13th power
           %¢         modulo N
             ḅ¢       convert to integer from base N
               ḃ256’  convert from integer to bijective base 256
                    Ọ convert each from codepoint

Donde Nestá codificado por la cadena:

“¥@ɦ⁺€€Ṅ`yȤDƁWĊ;Y^y⁻U ⁸ßɠƁXẹṡWZc'µ÷ḷỊ0ÇtṙA×Ḃß4©qV)iḷỊDƭ Mṛ+<ṛ_idðD’

cual es el numero

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

Además, este es el método RSA con Nla clave pública y la anterior 13. Romper esto es equivalente a encontrar los dos factores primos de N, que tiene 512 bits.

Monja permeable
fuente
2
Me encanta que su apariencia cadena cifrada como su código
Skidsdev
Usando este maravilloso programa , estoy seguro de que puedo descifrar su solución un par de milenios después de la muerte por calor del universo.
Phoenix socrático
La factorización de @SocraticPhoenix por división de prueba nunca puede acercarse al tamiz cuadrático.
Leaky Nun
@LeakyNun No entiendo tus grandes palabras de matemáticas ...
Socratic Phoenix
@SocraticPhoenix su programa prueba cada factor de 2, mientras que el tamiz cuadrático es mucho más rápido. Puede factorizar un semiprime de 256 bits en 6 minutos, mientras que su programa hubiera tardado una eternidad.
Leaky Nun
3

JavaScript (ES6), 43 + 33 = 76 bytes Agrietado por Leaky Nun

Función de cifrado, 43 bytes:

s=>[...s].sort(_=>Math.cos(i++),i=0).join``

Mensaje cifrado, 33 bytes:

NB: este método de cifrado depende del navegador.

FireFox: "ty a)s kaasoeocr!hTt; o s  -cwaoo"
Chrome : "oht aasoaoas   e)tosr;oky c!-cw T"
Edge   : "tskso ;- caroteoTha wa soo ay c!)"
Arnauld
fuente
T! a)o khas eotrto-c; o sa cwsaoy
Leaky Nun
@LeakyNun Err ... no.
Arnauld
¿Qué produce mi respuesta en su lugar?
Leaky Nun
¿Qué navegador estás usando? Estoy usando Chrome
Leaky Nun
66
That was soooo easy to crack! -;)(Usé Firefox para descifrarlo)
Leaky Nun
3

Braingolf, agrietado

(d1&,&g)&@

Pruébalo en línea!

Mensaje cifrado, 45 bytes (UTF-8)

°Áݭїϳ{ًչםק{їϳэÁק{|э³קѡ|

Códigos hexadecimales de mensajes cifrados

C2 B0 C3 81 DD AD D1 97 CF
B3 C2 90 7B D9 8B D5 B9 D7
9D D7 A7 7B D1 97 CF B3 D1
8D C3 81 D7 A7 7B 7C D1 8D
C2 B3 D7 A7 D1 A1 7C C2 85

Mensaje descifrado

C'mon, this one's *easy*!

Explicación

(d1&,&g)&@  Implicit input from commandline args
(......)    Foreach loop, foreach codepoint of input
 d          Split into digits
  1         Push 1
   &,       Reverse
     &g     Concatenate
        &@  Print

Descifrador

Se puede hacer un decodificador cambiando solo 3 caracteres. Simplemente quite el 1, e inserte $_entre &,y&g

(d&,$_&g)&@
Skidsdev
fuente
¿Puedes proporcionar un TIO?
Kritixi Lithos
1
C'mon, this one's *easy*!
KSmarts
@KSmarts ¡Correcto!
Skidsdev
ges indocumentado?
Leaky Nun
¿Es esto biyectivo?
Leaky Nun
3

JavaScript (ES6), 96 + 9 = 105 bytes

q=>Buffer(q).map((a,i,d)=>d[i-1]^Math.abs(1e16*Math.sin(d[i]+i))%255).sort((a,i)=>Math.tan(a*i))

Texto cifrado (codificado en hexadecimal): 7d111c74b99faff76a

Pruébalo en línea!

Salidas de muestra (usando el motor V8):

abc123 -> db48ea4f86b9

Hola -> 1b3420f5ab

iovoide
fuente
Envío no válido: múltiples textos simples generan el mismo texto cifrado. Por ejemplo: "C", "D". Esto solo cuenta para el primer personaje. De las 256 entradas posibles, solo 165 salidas únicas.
Mark Jeronimus
Es biyectivo para el rango previsto (ASCII A a ASCII z)
iovoide
Solo te dije que no. Simplemente intente su código con "C" y "D" respectivamente como la cadena de entrada. Misma cadena de salida 76.
Mark Jeronimus