Codebreaker dan Codewriters


18

Katakanlah Anda memiliki beberapa teks, dan Anda ingin mengirimkannya ke teman Anda, tetapi Anda tidak ingin orang lain membacanya. Itu mungkin berarti Anda ingin mengenkripsi itu sehingga hanya Anda dan teman Anda yang dapat membacanya. Tetapi, ada masalah: Anda dan teman Anda lupa untuk menyetujui metode enkripsi, jadi jika Anda mengirimi mereka pesan, mereka tidak akan dapat mendekripsi!

Setelah memikirkan hal ini sebentar, Anda memutuskan untuk hanya mengirim kode kepada teman Anda untuk mengenkripsi pesan Anda bersama dengan pesan tersebut. Teman Anda sangat cerdas, sehingga mereka mungkin bisa mengetahui cara mendekripsi pesan dengan mempelajari metode enkripsi.

Tentu saja, karena orang lain mungkin membaca pesan, Anda ingin memilih skema enkripsi yang membuatnya sesulit mungkin untuk memecahkan (cari tahu skema dekripsi).

Tugas Polisi

Dalam tantangan ini, Polisi akan memainkan peran sebagai penulis: Anda akan merancang skema enkripsi yang mengubah string menjadi string. Namun, skema enkripsi ini harus bijective , artinya tidak ada dua string yang harus dipetakan ke string lain, dan setiap string dapat dipetakan oleh input. Itu harus mengambil hanya satu input - string yang akan dikodekan.

Anda kemudian akan memposting beberapa kode yang melakukan enkripsi, dan satu pesan terenkripsi dengan skema yang dirinci oleh kode Anda.

Karena Anda membayar berdasarkan byte untuk mengirim pesan, skor Anda akan menjadi panjang kode Anda ditambah panjang ciphertext . Jika jawaban Anda retak, Anda akan memiliki skor tak terbatas.

Setelah satu minggu, Anda dapat mengungkapkan teks dan menandai jawaban Anda sebagai Aman . Jawaban aman adalah jawaban yang tidak dapat dipecahkan.

Tugas Perampok

Perampok akan bermain sebagai teman penulis atau perantara yang jahat (tidak ada perbedaan materi, tetapi Anda dapat bermain peran jika itu membuatnya lebih menyenangkan untuk melakukannya). Mereka akan mengambil skema enkripsi dan ciphertext dan berusaha mencari tahu pesan terenkripsi. Begitu mereka mengetahui pesan terenkripsi, mereka akan mempostingnya dalam komentar. (Tidak akan ada utas perampok yang terpisah untuk pertanyaan ini.)

Pemenang akan menjadi perampok dengan retakan terbanyak.


Berikut adalah contoh dari apa yang tampak seperti solusi retak:

Beli Lebih Banyak Jeruk


Jika enkode bersifat bijektif, apa domain dan kodomainnya?
Leaky Nun

String dengan karakter yang mana?
Leaky Nun

1
@WheatWizard Yang 256? Maksudmu 256 byte bukan karakter, kan?
Erik the Outgolfer

7
Apa yang menghentikan seseorang dari menggunakan fungsi yang aman secara kriptografis?
Tutleman

2
Pada siapa beban membuktikan bijektivitas: polisi atau perampok potensial? Yaitu, jika tidak diketahui apakah suatu fungsi bersifat kata sifat, apa yang terjadi?
Stephen

Jawaban:


5

Jelly , 57 + 32 = 89 byte ( retak )

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

Pesan terenkripsi:

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

Sebagai hex-string:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Penjelasan:

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

Di mana Ndikodekan oleh string “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, yang merupakan angka 105587021056759938494595233483151378724567978408381355454441180598980268016731.

Juga, ini adalah metode RSA dengan Ndiberikan di atas dan kunci publik 21. Retak ini setara dengan menemukan dua faktor utama N.


Baik. Saya dapat mendekripsi pesan terenkripsi saya sendiri dengan kunci yang saya temukan, tetapi tampaknya gagal dengan Anda. : - / (Hasil yang diharapkan bukan pesan 4-karakter non-Inggris, kan?)
Arnauld

3
Pesannya adalah _ìNb( Coba online! ).
Anders Kaseorg

@AndersKaseorg Yup. Itulah yang saya miliki, tetapi saya mengharapkan sesuatu yang sedikit lebih bermakna. :-)
Arnauld

1
Untuk apa nilainya, inilah kode yang saya gunakan di pihak saya.
Arnauld

1
@AndersKaseorg Jelly mencoba untuk mengevalusi argumennya, jadi null byte memang mungkin. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis

5

Jelly , 88 + 64 = 152 byte

Fungsi enkripsi:

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

Pesan terenkripsi:

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

Sebagai hex-string:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Penjelasan:

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

Di mana Ndisandikan oleh string:

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

yang mana jumlahnya

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

Juga, ini adalah metode RSA dengan Ndiberikan di atas dan kunci publik 13. Retak ini setara dengan menemukan dua faktor utama N, yang memiliki 512 bit.


2
Saya suka bahwa string terenkripsi Anda terlihat seperti kode Anda
Skidsdev

Dengan menggunakan program yang luar biasa ini , saya yakin saya dapat memecahkan solusi Anda beberapa milenium setelah kematian panas alam semesta.
Socratic Phoenix

Faktorisasi @ SocratesPhoenix oleh divisi percobaan tidak pernah bisa mendekati saringan kuadratik.
Leaky Nun

@ LeakyNun Saya tidak mengerti kata-kata matematika besar Anda ...
Socratic Phoenix

@ SocratesPhoenix program Anda mencoba setiap faktor dari 2, sedangkan ayakan kuadrat jauh lebih cepat. Ini dapat memfaktorkan semiprime 256-bit dalam 6 menit, sedangkan program Anda akan membutuhkan selamanya.
Leaky Nun

3

JavaScript (ES6), 43 + 33 = 76 byte Retak oleh Leaky Nun

Fungsi enkripsi, 43 byte:

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

Pesan terenkripsi, 33 byte:

NB: Metode enkripsi ini tergantung pada 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 ... tidak.
Arnauld

Apa yang dihasilkan oleh jawaban saya?
Leaky Nun

browser mana yang kamu gunakan? Saya menggunakan Chrome.
Leaky Nun

6
That was soooo easy to crack! -;)(Saya menggunakan firefox untuk memecahkannya)
Leaky Nun

3

Braingolf, Retak

(d1&,&g)&@

Cobalah online!

Pesan terenkripsi, 45 byte (UTF-8)

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

Hexcode dari pesan terenkripsi

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

Pesan yang didekripsi

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

Penjelasan

(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 dapat dibuat dengan mengubah hanya 3 karakter. Cukup hapus 1, dan masukkan $_inbetween &,dan&g

(d&,$_&g)&@

Bisakah Anda memberikan TIO?
Kritixi Lithos

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

@KSmarts Benar!
Skidsdev

gitu tidak berdokumen?
Leaky Nun

Apakah ini kata sifat?
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))

Ciphertext (hex-encoded): 7d111c74b99faff76a

Cobalah online!

Output sampel (menggunakan mesin V8):

abc123 -> db48ea4f86b9

Halo -> 1b3420f5ab


Pengiriman yang tidak valid: multiple plaintext menghasilkan ciphertext yang sama. Misalnya: "C", "D". Ini hanya diperhitungkan untuk karakter pertama. Dari 256 input yang mungkin, hanya 165 output unik.
Mark Jeronimus

Ini adalah kata sifat untuk rentang yang dimaksudkan (ASCII A hingga ASCII z)
iovoid

Aku baru saja bilang padamu tidak. Coba saja kode Anda dengan masing-masing "C" dan "D" sebagai string input. String output yang sama 76.
Mark Jeronimus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.