Latar Belakang
Sebuah satu kali pad adalah bentuk enkripsi yang telah terbukti tidak mungkin untuk memecahkan jika digunakan dengan benar.
Enkripsi dilakukan dengan mengambil plaintext (hanya terdiri dari huruf AZ) dan menghasilkan string acak dengan panjang yang sama (juga hanya huruf). String ini bertindak sebagai kunci. Setiap karakter dalam teks plaint kemudian dipasangkan dengan karakter yang sesuai di kunci. Ciphertext dihitung sebagai berikut: Untuk setiap pasangan, kedua karakter dikonversi menjadi angka (A = 0, B = 1, ... Z = 25). Dua angka ditambahkan modulo 26. Angka ini dikonversi kembali menjadi karakter.
Dekripsi justru sebaliknya. Karakter dalam ciphertext dan kunci dipasangkan dan dikonversi menjadi angka. Kuncinya kemudian dikurangi dari modulo 26 ciphertext, dan hasilnya diubah kembali menjadi karakter AZ.
Tantangan
Tantangan Anda adalah menulis program sesingkat mungkin yang bisa mengenkripsi dan mendekripsi pad sekali pakai.
Pada baris input pertama (ke STDIN), akan ada kata "ENCRYPT" atau kata "DECRYPT".
Jika kata itu dienkripsi, maka baris berikutnya akan menjadi teks biasa. Program Anda harus menampilkan dua baris (ke STDOUT), yang pertama adalah kunci, dan yang kedua adalah ciphertext.
Jika kata tersebut didekripsi, program Anda akan mendapatkan dua baris input lagi. Baris pertama akan menjadi kunci, dan baris kedua akan menjadi ciphertext. Program Anda harus menampilkan satu baris, yang akan menjadi teks biasa yang telah didekripsi.
Plaintext, ciphertext, dan key harus selalu terdiri dari huruf besar AZ. Mereka akan selalu menjadi satu baris dan tidak mengandung spasi.
Kuncinya harus selalu acak. Tidak ada bagian besar yang harus diulang di antara run, dan seharusnya tidak ada pola yang dapat ditemukan dalam teks.
Dua contoh sederhana:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
The >
mewakili yang garis adalah output, sehingga Anda tidak harus mencetak simbol sebagai output.
/dev/random
, haveged
), mengenkripsi dengan xoring ords dengan byte dan mendekripsi dengan xoring mereka dengan kunci. gist.github.com/5078264 kunci atau keacakan dapat dibaca dari stdin, pesan atau cyphertext dapat menjadi argumen nama file.
/dev/hwrng
, alih-alih menggunakan pseudo acak (yang secara teknis membuatnya rusak.)