Saya telah merancang generator acak sederhana yang siklus dua angka dalam cara yang kacau menggunakan metode multiply dan modulus. Ini sangat bagus untuk itu.
Namun, jika saya menggunakannya sebagai generator sandi, ia akan rentan terhadap serangan plaintext yang diketahui, mengingat bahwa seorang penyerang dapat merekayasa balik benih dari serangkaian angka acak dengan cara yang efisien secara komputasi.
Untuk membuktikan cipher broken, temukan pasangan nilai seed legal yang menghasilkan 7 nol berturut-turut dalam rentang [0; 255], menggunakan daya sesedikit mungkin, waktu CPU, dll. Sebanyak mungkin.
Berikut adalah generator acak yang ditulis dalam JavaScript:
function seed(state1,state2){
//Constants
var mod1=4294967087
var mul1=65539
var mod2=4294965887
var mul2=65537
function random(limit){
//Cycle each state variable 1 step
state1=(state1*mul1)%mod1
state2=(state2*mul2)%mod2
//Return a random variable
return (state1+state2)%limit
}
//Return the random function
return random
}
//Initiate the random generator using 2 integer values,
//they must be in the ranges [1;4294967086] and [1;4294965886]
random=seed(31337,42)
//Write 7 random values in the range [0;255] to screen
for(a=0;a<7;a++){
document.write(random(256)+"<br>")
}
Saya telah membuat alat untuk menguji pasangan nomor kandidat, dapat ditemukan di sini .
Selama 3 hari berikutnya, spoiler tidak diperbolehkan , jawaban harus berisi hanya satu set angka, dan tentu saja set yang berbeda dari yang diposting oleh pemecah sebelumnya. Setelah itu Anda didorong untuk mengirim kode dan menjelaskan pendekatan Anda.
Edit, karantina selesai:
Jawaban harus berisi serangkaian angka dan penjelasan serta kode unik untuk mendokumentasikan metode penyelesaiannya.
Sebagian besar solusi elegan menang.
Sebagai catatan:
Menulis sebuah program yang dapat menemukan solusi dengan cepat itu elegan.
Membuat program yang memanfaatkan fitur-fitur GPU secara efisien untuk melakukannya lebih cepat adalah elegan.
Melakukan pekerjaan dengan sepotong "museumware" itu elegan.
Menemukan metode solusi yang layak dapat digunakan hanya dengan pena dan kertas sangat elegan.
Menjelaskan solusi Anda dengan cara yang instruktif dan mudah dimengerti adalah elegan.
Menggunakan banyak komputer atau sangat mahal tidak bagus.
sumber
Jawaban:
C ++, 44014022/164607120
Itu dalam C ++, menggunakan 1 GB memori, dan butuh sekitar 45 detik untuk menemukan pasangan pertama ini. Saya akan memperbarui waktu setelah menemukan semuanya.
Kode di bawah ini. Pertama menemukan semua pasangan yang menghasilkan 4 nol, lalu memotongnya dengan uji coba sederhana (lihat
check
metode). Ia menemukan pasangan yang menghasilkan 4 nol dengan menghasilkan dua array besar, satu yang berisi 4 byte orde rendah pertama dari generator state1, dan yang kedua yang berisi negatif dari 4 byte orde rendah pertama dari generator state2. Array ini kemudian disortir dan dicari kecocokannya, yang sesuai dengan keseluruhan generator yang menghasilkan 4 nol untuk memulai.Array terlalu besar untuk disimpan dalam memori, sehingga tidak bekerja dalam ukuran batch agar sesuai dengan memori.
Sepertinya proses lengkap akan memakan waktu ~ 12 jam.
Sunting : Memperbaiki kode sehingga hanya perlu ~ 1 jam untuk mendapatkan semua kemungkinan benih. Sekarang ini menghasilkan tabel menjadi 256 file berbeda, satu untuk setiap byte pertama dari output. Kami kemudian dapat memproses setiap file secara independen sehingga kami tidak perlu membuat ulang data.
Sunting : Ternyata Anda dapat membuat 256 subtabel secara individual alih-alih sekaligus, jadi tidak diperlukan disk. Menjalankan waktu hingga ~ 15 menit menggunakan 256MB.
sumber