Codebreakers e Codewriters


18

Supponiamo che tu abbia del testo e desideri che lo invii al tuo amico, ma non vuoi che nessun altro lo legga. Ciò probabilmente significa che vuoi crittografarlo in modo che solo tu e il tuo amico possano leggerlo. Ma c'è un problema: tu e il tuo amico avete dimenticato di concordare un metodo di crittografia, quindi se inviate loro un messaggio, non saranno in grado di decrittografarlo!

Dopo aver pensato a questo per un po ', decidi di inviare al tuo amico il codice per crittografare il tuo messaggio insieme al messaggio. Il tuo amico è molto intelligente, quindi probabilmente possono capire come decifrare il messaggio studiando il metodo di crittografia.

Naturalmente, poiché altre persone potrebbero leggere il messaggio, si desidera scegliere uno schema di crittografia che renda il più difficile possibile decifrare (capire lo schema di decrittazione).

Compito della polizia

In questa sfida, Cops svolgerà il ruolo dello scrittore: progetterai uno schema di crittografia che converte le stringhe in stringhe. Tuttavia, questo schema di crittografia deve essere biiettivo , nel senso che non è necessario mappare due stringhe su un'altra stringa e ogni stringa può essere mappata da un input. Deve richiedere solo un input: la stringa da codificare.

Pubblicherai quindi del codice che esegue la crittografia e un singolo messaggio crittografato con lo schema dettagliato dal tuo codice.

Dato che stai pagando per byte per inviare messaggi, il tuo punteggio sarà la lunghezza del tuo codice più la lunghezza del testo cifrato . Se la tua risposta è incrinata, avrai un punteggio di infinito.

Dopo una settimana, puoi rivelare il testo e contrassegnare la tua risposta come sicura . Le risposte sicure sono quelle che non possono essere violate.

Compito dei ladri

I ladri giocheranno come l'amico dello scrittore o il malvagio intermediario (non c'è differenza materiale, ma puoi giocare a ruolo come se fosse più divertente farlo). Prenderanno gli schemi di crittografia e il testo cifrato e cercheranno di capire il messaggio crittografato. Una volta capito il messaggio crittografato, lo pubblicheranno in un commento. (Non ci sarà un thread separato per i ladri per questa domanda.)

Il vincitore sarà il ladro con il maggior numero di crepe.


Ecco un esempio di come potrebbe apparire una soluzione incrinata:

Acquista più arance


Se la codifica è biiettiva, quali sono il dominio e il codomain?
Leaky Nun,

Le stringhe con quali personaggi?
Leaky Nun,

1
@WheatWizard Quale 256? Intendi 256 byte, non i caratteri, giusto?
Erik the Outgolfer,

7
Cosa impedisce a qualcuno di usare una funzione crittograficamente sicura?
Tutleman,

2
Su chi è l'onere di provare la biettività: lo sbirro o i potenziali rapinatori? Cioè, se non si sa se una funzione è biiettiva, cosa succede?
Stephen,

Risposte:


5

Gelatina , 57 + 32 = 89 byte ( incrinato )

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

Messaggio crittografato:

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

Come una stringa esadecimale:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Spiegazione:

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

Dove Nè codificato dalla stringa “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, che è il numero 105587021056759938494595233483151378724567978408381355454441180598980268016731.

Inoltre, questo è il metodo RSA con Ndata sopra e chiave pubblica 21. Rompere questo equivale a trovare i due fattori primi di N.


Bene. Sono in grado di decrittografare il mio messaggio crittografato con la chiave che ho trovato, ma sembra non riuscire con il tuo. : - / (Il risultato atteso non è un messaggio non inglese di 4 caratteri, vero?)
Arnauld

3
Il messaggio è _ìNb( Provalo online! ).
Anders Kaseorg,

@AndersKaseorg Yup. Questo è quello che avevo, ma mi aspettavo qualcosa di leggermente più significativo. :-)
Arnauld,

1
Per quello che vale, ecco il codice che ho usato dalla mia parte.
Arnauld,

1
@AndersKaseorg Jelly tenta di valutare i suoi argomenti, quindi i byte nulli sono davvero possibili. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis

5

Gelatina , 88 + 64 = 152 byte

Funzione di crittografia:

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

Messaggio crittografato:

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

Come una stringa esadecimale:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Spiegazione:

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

Dove Nè codificato dalla stringa:

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

qual è il numero

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

Inoltre, questo è il metodo RSA con Ndata sopra e chiave pubblica 13. Craccare questo equivale a trovare i due fattori primi di N, che ha 512 bit.


2
Adoro che la tua stringa crittografata assomigli al tuo codice
Skidsdev,

Usando questo meraviglioso programma , sono sicuro di riuscire a decifrare la tua soluzione un paio di millenni dopo la morte per calore dell'universo.
Socratic Phoenix,

La fattorizzazione di @SocraticPhoenix per divisione di prova non può mai avvicinarsi al setaccio quadratico.
Leaky Nun,

@LeakyNun Non capisco le tue grandi parole matematiche ...
Socratic Phoenix,

@SocraticPhoenix il tuo programma prova ogni fattore da 2, mentre il setaccio quadratico è molto più veloce. Può fattorizzare un semiprime a 256 bit in 6 minuti, mentre il tuo programma avrebbe richiesto un'eternità.
Leaky Nun,

3

JavaScript (ES6), 43 + 33 = 76 byte Cracked by Leaky Nun

Funzione di crittografia, 43 byte:

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

Messaggio crittografato, 33 byte:

NB: questo metodo di crittografia dipende dal browser.

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!)"

T! a)o khas eotrto-c; o sa cwsaoy
Leaky Nun,

@LeakyNun Err ... no.
Arnauld,

Cosa produce invece la mia risposta?
Leaky Nun,

Quale browser stai usando? Sto usando Chrome.
Leaky Nun,

6
That was soooo easy to crack! -;)(Ho usato Firefox per romperlo)
Leaky Nun,

3

Braingolf, incrinato

(d1&,&g)&@

Provalo online!

Messaggio crittografato, 45 byte (UTF-8)

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

Hexcodes di messaggio crittografato

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

Messaggio decifrato

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

Spiegazione

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

decoder

È possibile creare un decodificatore modificando solo 3 caratteri. Basta rimuovere 1, e inserire $_tra &,e&g

(d&,$_&g)&@

Potete fornire un TIO?
Kritixi Lithos,

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

@KSmarts Correct!
Skidsdev,

gè privo di documenti?
Leaky Nun,

Questo è biettivo?
Leaky Nun,

3

JavaScript (ES6), 96 + 9 = 105 byte

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))

Testo cifrato (codificato esadecimale): 7d111c74b99faff76a

Provalo online!

Output di esempio (utilizzando il motore V8):

abc123 -> db48ea4f86b9

Ciao -> 1b3420f5ab


Invio non valido: più testi in chiaro generano lo stesso testo cifrato. Ad esempio: "C", "D". Questo vale solo per il primo carattere. Dei 256 possibili ingressi, solo 165 uscite univoche.
Mark Jeronimus,

È biettivo per l'intervallo previsto (da ASCII A a ASCII z)
iovoide

Ti ho appena detto di no. Basta provare il codice con rispettivamente "C" e "D" come stringa di input. Stessa stringa di output 76.
Mark Jeronimus il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.