Codebreakers i Codewriters


18

Powiedzmy, że masz jakiś tekst i chcesz, aby wysłał go znajomemu, ale nie chcesz, aby ktokolwiek go przeczytał. To prawdopodobnie oznacza, że ​​chcesz go zaszyfrować, aby tylko Ty i Twój przyjaciel mogli go przeczytać. Ale jest problem: ty i twój przyjaciel zapomnieliście uzgodnić metodę szyfrowania, więc jeśli wyślesz im wiadomość, nie będzie w stanie jej odszyfrować!

Po zastanowieniu się przez chwilę postanawiasz po prostu wysłać znajomemu kod, aby zaszyfrować wiadomość wraz z wiadomością. Twój przyjaciel jest bardzo inteligentny, więc prawdopodobnie może dowiedzieć się, jak odszyfrować wiadomość, studiując metodę szyfrowania.

Oczywiście, ponieważ inne osoby mogą czytać wiadomość, należy wybrać schemat szyfrowania, który sprawia, że ​​złamanie go jest jak najtrudniejsze (wymyśl schemat szyfrowania).

Zadanie gliniarzy

W tym wyzwaniu Cops zagra rolę pisarza: zaprojektujesz schemat szyfrowania, który konwertuje ciągi na ciągi. Jednak ten schemat szyfrowania musi być bijectywny , co oznacza, że ​​żadne dwa ciągi nie muszą być odwzorowane na inny ciąg, a każdy ciąg może być odwzorowany na wejściu. Musi mieć tylko jedno wejście - ciąg znaków do zakodowania.

Następnie opublikujesz kod, który wykonuje szyfrowanie, oraz pojedynczą wiadomość zaszyfrowaną zgodnie ze schematem opisanym przez Twój kod.

Ponieważ płacisz bajtem za wysyłanie wiadomości, twój wynik będzie równy długości twojego kodu plus długości tekstu zaszyfrowanego . Jeśli twoja odpowiedź jest załamana, będziesz miał nieskończoność.

Po tygodniu możesz ujawnić tekst i oznaczyć odpowiedź jako Bezpieczną . Bezpieczne odpowiedzi to te, których nie można złamać.

Zadanie rabusiów

Rabusie grają albo jako przyjaciel pisarza, albo złośliwy środkowy człowiek (nie ma istotnej różnicy, ale możesz grać role, jeśli to sprawia, że ​​jest to przyjemniejsze). Wezmą schematy szyfrowania i tekst zaszyfrowany i spróbują znaleźć zaszyfrowaną wiadomość. Gdy odkryją zaszyfrowaną wiadomość, opublikują ją w komentarzu. (Nie będzie osobnego wątku złodziei dla tego pytania).

Zwycięzcą zostanie rabuś z największą liczbą pęknięć.


Oto przykład, jak mogłoby wyglądać pęknięte rozwiązanie:

Kup więcej pomarańczy


Jeśli kodowanie jest bijectywne, jaka jest domena i domena kodowa?
Leaky Nun

Ciągi, za pomocą których znaków?
Leaky Nun

1
@WheatWizard Które 256? Masz na myśli 256 bajtów, a nie znaków, prawda?
Erik the Outgolfer,

7
Co powstrzyma kogoś przed użyciem funkcji kryptograficznie bezpiecznej?
Tutleman

2
Na kim spoczywa ciężar udowodnienia bolesności: policjant lub potencjalni rabusie? To znaczy, jeśli nie wiadomo, czy funkcja jest bijectywna, co się stanie?
Stephen

Odpowiedzi:


5

Galaretka , 57 + 32 = 89 bajtów ( popękana )

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

Zaszyfrowana wiadomość:

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

Jako ciąg szesnastkowy:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Wyjaśnienie:

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

Gdzie Njest zakodowany przez ciąg “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, który jest liczbą 105587021056759938494595233483151378724567978408381355454441180598980268016731.

Jest to również metoda RSA z Npodanym powyżej i kluczem publicznym 21. Złamanie tego jest równoznaczne ze znalezieniem dwóch głównych czynników N.


Dobrze. Jestem w stanie odszyfrować własną zaszyfrowaną wiadomość za pomocą klucza, który znalazłem, ale wydaje się, że nie działa z twoim. : - / (Oczekiwany wynik to nie 4-znakowa wiadomość w języku innym niż angielski, prawda?)
Arnauld

3
Wiadomość brzmi _ìNb( Wypróbuj online! ).
Anders Kaseorg,

@AndersKaseorg Yup. Tak właśnie miałem, ale spodziewałem się czegoś bardziej znaczącego. :-)
Arnauld

1
Oto , co warto, oto kod, którego użyłem po mojej stronie.
Arnauld

1
@AndersKaseorg Jelly próbuje sprawdzić swoje argumenty, więc bajty zerowe są rzeczywiście możliwe. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis

5

Galaretka , 88 + 64 = 152 bajty

Funkcja szyfrowania:

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

Zaszyfrowana wiadomość:

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

Jako ciąg szesnastkowy:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Wyjaśnienie:

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

Gdzie Njest zakodowany przez ciąg:

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

która jest liczbą

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

Jest to również metoda RSA z Npodanym powyżej i kluczem publicznym 13. Złamanie tego jest równoznaczne ze znalezieniem dwóch głównych czynników N, które ma 512 bitów.


2
Uwielbiam to, że Twój zaszyfrowany ciąg wygląda jak kod
Skidsdev

Korzystając z tego wspaniałego programu , jestem pewien, że mogę złamać twoje rozwiązanie kilka tysięcy lat po śmierci wszechświata z powodu upałów.
Socratic Phoenix,

Faktoryzacja @SocraticPhoenix przez podział próbny nigdy nie może zbliżyć się do kwadratowego sita.
Leaky Nun

@LeakyNun Nie rozumiem twoich wielkich matematycznych słów ...
Socratic Phoenix

@SocraticPhoenix twój program wypróbowuje każdy czynnik z 2, podczas gdy sito kwadratowe jest znacznie szybsze. Może rozłożyć na czynniki pierwsze 256-bitowy semiprime w 6 minut, podczas gdy twój program zajmie wieczność.
Leaky Nun

3

JavaScript (ES6), 43 + 33 = 76 bajtów Cracked by Leaky Nun

Funkcja szyfrowania, 43 bajty:

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

Zaszyfrowana wiadomość, 33 bajty:

Uwaga: ta metoda szyfrowania zależy od przeglądarki.

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 ... nie.
Arnauld,

Co zamiast tego daje moja odpowiedź?
Leaky Nun

Z jakiej przeglądarki korzystasz? Używam Chrome.
Leaky Nun

6
That was soooo easy to crack! -;)(Użyłem firefoxa, aby go złamać)
Leaky Nun

3

Braingolf, Cracked

(d1&,&g)&@

Wypróbuj online!

Zaszyfrowana wiadomość, 45 bajtów (UTF-8)

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

Hekskody zaszyfrowanej wiadomości

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

Odszyfrowana wiadomość

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

Wyjaśnienie

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

Dekoder

Dekoder można wykonać, zmieniając tylko 3 znaki. Wystarczy usunąć 1i wstawić $_pomiędzy &,i&g

(d&,$_&g)&@

Czy możesz podać TIO?
Kritixi Lithos

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

@KSmarts Correct!
Skidsdev

gjest nieudokumentowane?
Leaky Nun

Czy to bijective?
Leaky Nun

3

JavaScript (ES6), 96 + 9 = 105 bajtów

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

Tekst zaszyfrowany (kodowany heksadecymalnie): 7d111c74b99faff76a

Wypróbuj online!

Przykładowe dane wyjściowe (przy użyciu silnika V8):

abc123 -> db48ea4f86b9

Cześć -> 1b3420f5ab


Nieprawidłowe przesłanie: wiele tekstów jawnych generuje ten sam tekst zaszyfrowany. Na przykład: „C”, „D”. To liczy się tylko dla pierwszego znaku. Z 256 możliwych wejść tylko 165 unikalnych wyjść.
Mark Jeronimus

Jest dwuskładnikowy dla zamierzonego zakresu (ASCII A do ASCII z)
iovoid

Właśnie ci powiedziałem, że nie. Po prostu wypróbuj swój kod z odpowiednio „C” i „D” jako ciągiem wejściowym. Ten sam ciąg wyjściowy 76.
Mark Jeronimus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.