Menerapkan program enkripsi CipherSaber , seperti yang dijelaskan di bawah ini. Pedoman:
- Entri terkecil, dalam byte, menang.
- Entri biasanya berupa program yang mengambil plaintext dari input standar, dan menulis ciphertext ke output standar, dengan kunci yang ditentukan (oleh pengguna) dengan cara yang Anda inginkan.
- Namun, jika Anda ingin menerapkan ini sebagai prosedur, itu juga baik-baik saja.
- IV harus berasal dari generator nomor pseudorandom yang aman secara kriptografis. Jika bahasa Anda tidak mendukung itu, pilih yang lain. ;-)
- Tolong jangan gunakan perpustakaan khusus crypto, panggilan sistem, atau instruksi (selain dari PRNG, sebagaimana ditentukan di atas). Tentu saja, operasi bitwise tingkat rendah umum tidak apa-apa.
CipherSaber adalah varian dari RC4 / Arcfour, jadi saya akan mulai dengan menjelaskan yang terakhir, lalu perubahan yang dilakukan oleh CipherSaber.
0. RC4 / Arcfour
Arcfour sepenuhnya ditentukan di tempat lain , tetapi untuk kelengkapan, saya akan menjelaskannya di sini. (Dalam hal terjadi perbedaan antara konsep Internet dan deskripsi ini, yang pertama adalah normatif.)
Pengaturan kunci
Siapkan dua array, S
dan S2
, keduanya dengan panjang 256, di mana k_1
byte pertama dari kunci, dan k_n
yang terakhir.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
diisi dengan byte kunci, lagi dan lagi, sampai semua 256 byte diisi.)
Kemudian, inisialisasi j
ke 0, dan kocok 256 kali:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Ini menyelesaikan pengaturan kunci. The S2
array tidak lagi digunakan di sini, dan dapat digosok.
Pembuatan stream cipher
Inisialisasi i
dan j
ke 0, lalu buat stream kunci sebagai berikut:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Mengenkripsi / mendekripsi data
- Untuk mengenkripsi, XOR output keystream dengan plaintext
- Untuk mendekripsi, XOR output keystream dengan ciphertext
1. CipherSaber
CipherSaber (yang kami implementasikan dalam pertanyaan ini) adalah variasi RC4 / Arcfour dalam dua cara:
10 byte IV / nonce
Saat mengenkripsi pesan, 10 byte acak harus diperoleh, seperti via /dev/urandom
, dan dituliskan ke dalam 10 byte pertama dari output terenkripsi. Saat mendekripsi pesan, 10 byte pertama dari input adalah IV yang digunakan untuk mengenkripsi pesan.
Tahap pengaturan kunci RC4 / Arcfour dijalankan dengan passphrase || IV
sebagai kunci, di mana passphrase
frasa sandi yang ditentukan pengguna, IV
seperti yang dijelaskan di atas, dan ||
digabungkan. Jadi, frasa sandi dari "Halo, dunia!" dan infus "supercalif" (namun tidak mungkin yaitu :-P) akan menghasilkan kunci "Halo, dunia! supercalif".
Beberapa iterasi pengaturan tombol
Untuk membantu mencegah kerentanan yang membuat enkripsi WEP benar-benar rusak, loop pengocokan pada tahap pengaturan kunci RC4 dijalankan beberapa kali sesuai yang ditentukan pengguna. Nilai j
harus dipertahankan antara iterasi.
2. Tes vektor
Berikut adalah beberapa vektor uji yang dapat Anda gunakan untuk menguji program Anda. Selain itu, osif squeamish menciptakan alat enkripsi & dekripsi CipherSaber yang dapat Anda gunakan untuk memvalidasi hasil Anda.
Anda hanya perlu mengimplementasikan program enkripsi. Anda tidak perlu menyediakan program dekripsi, tetapi output program enkripsi Anda harus melakukan bolak-balik dengan benar ke input asli ketika diproses dengan program dekripsi yang diimplementasikan dengan benar menggunakan kunci yang benar.
sumber
urandom
(yang bisa menjadi entri terpisah jika Anda mau) jika Anda peduli tentang "menang". :-)Python 2 -
373350326317 bytePyth mungkin akan datang nanti. Menentukan satu fungsi,
c(p,d,r,m)
yang mengambil daftar byte untuk frasa sandi dan data, dan int untuk pengulangan dan mode yang mengenkripsi ketika 1 dan mendekripsi ketika 0. Ini karena satu-satunya perbedaan di dalamnya adalah berurusan dengan IV. Mengembalikan daftar byte.Berikut ini beberapa kode uji / fungsi Pembantu:
sumber
else:v,d=d[:10],d[10:]
bagian itu.Ruby - 263 karakter
Ini adalah jawaban Ruby saya untuk pertanyaan asli tentang stackoverflow pada tahun 2010! Ini adalah encoder dan decoder semua dalam satu program
Parameternya adalah:
e atau d (untuk enkode atau decode) beberapa kali
kunci
sumber
C, 312 byte
Menerima kunci dan kunci pencampuran dihitung pada baris perintah, kemudian mengenkripsi semuanya di stdin ke stdout. Ini menggunakan fungsi perpustakaan BSD / Darwin
arc4random()
, yang merupakan PRNG berdasarkan RC4. Secara otomatis benih itu sendiri, sehingga hasilnya akan berbeda setiap saat.Versi lebih rapi:
Contoh:
sumber
Python - 266 karakter
Ini adalah jawaban Python saya untuk pertanyaan asli tentang stackoverflow pada tahun 2010! Ini adalah encoder dan decoder semua dalam satu program
Parameternya adalah:
e atau d (untuk enkode atau decode) beberapa kali
kunci
Versi ini mencoba untuk menggabungkan 2 loop dari rc4 menjadi satu (menyimpan sejauh 11 byte ...)
sumber