Analisis frekuensi: kami menganalisis salah satu tugas favorit para peserta tahap online NeoQUEST-2020


Hari ini kami menerbitkan tugas Wright-Up NeoQUEST-2020 , yang ditulis oleh para peserta kami: "4 Task mega cool" dan "The best task of the Olympiad".
Terlepas dari kesederhanaan yang tampak, hanya 8 orang yang menyelesaikan tugas ini! Dan sekarang Anda bisa mengenalnya lebih baik, untuk ini - selamat datang di bawah kucing!


Jadi, peserta diajak mengunduh rekaman audio . Satu menit mendengarkan sudah cukup untuk memahami bahwa kode Morse bahkan tidak berbau di sini, sama seperti kata-kata yang bermakna dalam rekaman audio juga tidak diperhatikan. Karena itu, kami mengakhiri siksaan dengan mendengarkan dan mulai melihat suara dengan lebih detail. Misalnya, menggunakan Audacity yang lama (dan gratis) . Kami membuka rekaman audio dan memperhatikan strukturnya: antara penekanan tombol ada keheningan mutlak (seseorang beruntung dengan kondisi kerja, Anda tidak memiliki panggilan telepon dan kolega mengobrol selamanya!), Yang berarti bahwa tidak akan sulit untuk mengekstraksi setiap penekanan tombol dengan menyaring bagian dengan amplitudo sinyal nol.



Oke, ayo kita lakukan. Sekarang kita memiliki dua hal: "array" di mana ada 100.500 klik, dan harapan bahwa di antara suara-suara ini ada berulang-ulang - hanya kemudian akan mungkin untuk mengatakan bahwa "tombol X ditekan N kali, dan kunci Y adalah M kali." Jadi, semua data awal telah dianalisis, tetap untuk menjawab pertanyaan "apa yang akan membawa seperangkat pernyataan seperti itu kepada kita, asalkan rekaman audio berlangsung 10 menit?". Ya, itu benar, saatnya untuk mengungkap analisis frekuensi klasik . Nah, kami menguji teori kami menggunakan python, numpy dan scikits.audiolab (untuk memproses suara, Anda dapat memilih paket lain dan bahkan bahasa dengan kesuksesan yang sama).
Untuk mengatur lingkungan, Anda dapat menjalankan perintah berikut (itu pasti berfungsi di Ubuntu 19.10):

$ sudo apt-get install -y python python-dev python-pip python-setuptools libsndfile-dev python-numpy
$ pip install --upgrade pip
$ pip install scikits.audiolab


Sekarang kami menerapkan uji asumsi kami dalam beberapa baris kode yang menggunakan cara paling primitif untuk mengidentifikasi bunyi klik - dengan jumlah nilai array numpy yang sesuai:

get list of separated β€˜clicks’
data, fs, enc = scikits.audiolab.wavread(filename)
data = data.ravel()
clicks = [list(g) for k, g in groupby(data, lambda x: x != 0) if k]

# calculate number of unique β€˜clicks’ and their frequences
freqs = dict() 
cypher_test = list()
for click in clicks:
    value = np.sum(np.array(click), dtype = np.float32)
    cypher_test.append(value)
    if value not in freqs:
        freqs[value] = 1
    else:
        freqs[value] += 1


Hasil eksekusi kode, yang ditunjukkan pada diagram - seperti panas api unggun di tengah musim dingin nuklir - tidak bisa tidak menghangatkan jiwa: setidaknya 27 klik unik, dan bahkan penampilan distribusi menginspirasi keyakinan bahwa analisis frekuensi tidak akan sia-sia.



Menurut Wikipedia dan sumber lain yang lebih dapat diandalkan, 26 huruf bahasa Inggris, diurutkan dalam urutan menurun, membentuk seri etaoinshrdlcumwfgypbvkjxqz . Plus, tentu saja, celah, yang menempati posisi terdepan. Kamu tahu apa yang harus dilakukan! Sekali lagi, kami menggunakan beberapa baris kode primitif untuk membandingkan setiap suara dengan mengklik hurufnya (dalam frekuensi kemunculan) dan melakukan penggantian awal:

COMMON_FREQ_ALPHABET = { 0:' ', 1:'e', 2:'t', 3:'a', 4:'o', 5:'i', 6:'n', 7:'s', 8:'h', 9:'r', 10:'d', 11:'l', 12:'c', 13:'u', 14:'m',15:'w', 16:'f', 17:'g', 18:'y', 19:'p', 20:'b', 21:'v', 22:'k', 23:'j', 24:'x', 25:'q', 26:'z' }

# calculate key
key = dict()
index = 0
for freq in sorted(freqs.items(), key=operator.itemgetter(1),reverse=True):
    key[freq[0]] = COMMON_FREQ_ALPHABET[index]
    index +=1

# replace sounds according the key
partly_plain_text = ""
for elem in cypher_test:
	partly_plain_text += key[elem]


Setelah mengganti analisis frekuensi, kami mendapatkan teks berikut:

onlineayvinf saty stw vltn selg kird moaher csctl ncmertl we tnswer utn metscre gtll saory retl enocfh worb ltrfe tvvetr tftin vltue scn satra zero gtua t gew rotd sveuitl vroklem etsa ketcay idet who lef ipere saone retuh vrodcua uca fipe reuord scre aoob jcesaion oca dcrinf vtss dry ahen show low lisa kltub okxeuas low lifha old frow wtauh aowtrd suhool my frow well heta norah mile mcsa resa tdd tmonf yocnf kesa kird beev kird gooa smtll wts bnow oca utme uca vltna some when bnow awo how dripe tftin vca while oaher some ocr letrn satr mincae digger men scrgtues infor retd hetrd lisa rtin utll vora yes whta idet ftme bind new him old deev eta keftn keftn or socah ahe some mtv tkle sonf i metn saory yetr fold mile dtrb eqtmvle world gish tfe geel ahocstnd one mile his ky ahe tkope ahose uhildren rtin gcll gtll tnimtl ury vocnd vltue ahose shora jciub where ahocfh saood fopern sorry i gorfoa i vromised ao lend yoc my uode fea ia grom my fiahck neoscveruoder htnd ahese binf wind utrb new vossikle tdd grom saood lifha down lipe mincae rotd foa satra gire ahocfh ahose some scn aia iaeai aet iaeai aia iaeai aet iaeai aia iaeai aet iaeai aia iaeai aet iaeai aia iaeai aet iaeai aia iaeai aet iaeai ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa ucn shoa shtbe wtpe ltke nibe shtbe wtpe ltke nibe shtbe wtpe ltke nibe shtbe wtpe ltke nibe shtbe wtpe ltke nibe shtbe wtpe htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn mtd dou htn dou gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe yet gipe

Ini terlihat sedikit seperti sesuatu yang bermakna, tetapi kata-kata individual pasti dapat ditebak. Secara berurutan mencari kata-kata yang jelas penggantian mana yang harus dilakukan:
  1. moaher -> ibu dan tnswer -> jawab, mis. a dan t harus dipertukarkan;
  2. larfe β†’ besar dan selg β†’ sendiri, mis. f dan g harus dipertukarkan;
  3. kird β†’ bird, mis. k digantikan oleh b dan onlinetyving β†’ onlinetyping, mis. v ganti dengan p;
  4. meascre β†’ ukur dan enocgh β†’ cukup, mis. u dan c harus dipertukarkan.

Sebagai hasil dari manipulasi ini, teks diubah secara dramatis, dan kata pertamanya menjelaskan kurangnya konektivitas: rekaman audio direkam saat berlatih tipografi pada simulator keyboard. Oh, pemilik kuncinya jelas tidak siap menghadapi kiamat! .. Kita bisa bahagia untuknya, mungkin sekarang dia meraba sangat cepat, menyapu salju yang telah menghalangi jalan keluar dari perlindungannya. Tapi apa ini untuk kita? Kami akan melihat teks, mungkin masih ada sesuatu yang berguna.

onlinetyping stay saw plan self bird mother usual numeral we answer can measure fall story real enough worb large appear again place sun start zero fact a few road special problem east beauty idea who leg ipere stone reach product cut gipe record sure toob juestion out during pass dry then show low list blacb obxects low light old grow watch toward school my grow well heat north mile must rest add among young best bird beep bird foot small was bnow out came cut plant some when bnow two how dripe again put while other some our learn star minute differ men surfaces ingor read heard list rain call port yes what idea game bind new him old deep eat began began or south the some map able song i mean story year gold mile darb eqample world fish age feel thousand one mile his by the abope those children rain full fall animal cry pound place those short juicb where though stood gopern sorry i forgot i promised to lend you my code get it from my github neosupercoder hand these bing wind carb new possible add from stood light down lipe minute road got start fire though those some sun tit iteti tea iteti tit iteti tea iteti tit iteti tea iteti tit iteti tea iteti tit iteti tea iteti tit iteti tea iteti cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot cun shot shabe wape labe nibe shabe wape labe nibe shabe wape labe nibe shabe wape labe nibe shabe wape labe nibe shabe wape han mad doc han mad doc han mad doc han mad doc han mad doc han mad doc han mad doc han mad doc han mad doc han doc fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe yea fipe

Tampaknya kami beruntung: selama pelatihan, seseorang terganggu dan menulis pesan penyelamatan kepada temannya, mungkin di beberapa messenger: maaf saya lupa saya berjanji untuk meminjamkan kode saya mendapatkannya dari neosupercoder github saya. Membaca korespondensi orang lain, tentu saja, tidak baik, tetapi di sini ada seratus persen pengecualian, kami membayar lebih dari cukup untuk informasi ini. Kami pergi ke github dan mencari repositori dengan nama pengguna:



Sukses! Tetap hanya membaca satu-satunya file dari repositori "neo-medicine":



Hore! Sekarang kita adalah pemilik kunci yang bahagia!
Di depan - analisis tugas-tugas lain NeoQUEST-2020 - kami tidak akan membiarkan pembaca kami bosan dengan isolasi diri!

All Articles