Bagaimana perbedaan pseudorandom dan benar-benar acak dan mengapa itu penting?


664

Saya tidak pernah mengerti ini. Katakan saja Anda menulis sebuah program kecil dalam bahasa apa saja yang memutar beberapa dadu (hanya menggunakan dadu sebagai contoh). Setelah 600.000 gulungan, setiap angka akan diputar sekitar 100.000 kali, dan itulah yang saya harapkan.

Mengapa ada situs web yang didedikasikan untuk 'keacakan yang sebenarnya'? Tentunya, berdasarkan pengamatan di atas, peluang untuk mendapatkan angka hampir sama dengan 1 dari berapa banyak angka yang dapat dipilih.

Saya mencobanya dengan Python : Ini hasil 60 juta gulungan. Variasi tertinggi adalah seperti 0,15. Bukankah itu akan terjadi secara acak?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0


21
Apa yang Anda maksud dengan "melempar dadu"? Apakah ada lengan robot dan kamera terpasang?
starblue

3
sementara saya setuju dengan intisari nada Anda, bahwa kita sering terlalu khawatir tentang ini, tetapi telah dieksploitasi dalam kehidupan nyata: en.wikipedia.org/wiki/Ronald_Dale_Harris
Grady Player

3
Lihat artikel ini tentang permainan poker online yang hilang keacakan sebenarnya mengapa itu penting.
Varaquilex

1
Jika Anda hanya menyimpan penghitung 0-5 dan melempar dadu sesuai, 666 gorillion kali, Anda akan mendapatkan distribusi yang sama juga.
jcora

Jawaban:


1383

Mari kita bermain poker komputer, hanya Anda, saya dan server yang kami berdua percayai. Server menggunakan generator nomor pseudo-acak yang diinisialisasi dengan seed 32-bit tepat sebelum kita bermain. Jadi ada sekitar empat miliar kemungkinan deck.

Saya mendapatkan lima kartu di tangan saya - tampaknya kita tidak memainkan Texas Hold 'Em. Misalkan kartu dibagikan satu kepada saya, satu untuk Anda, satu untuk saya, satu untuk Anda, dan seterusnya. Jadi saya punya kartu pertama, ketiga, kelima, ketujuh dan kesembilan di geladak.

Sebelumnya saya menjalankan generator nomor pseudo-acak empat miliar kali, sekali dengan masing-masing seed, dan menuliskan kartu pertama yang dihasilkan untuk masing-masing ke dalam database. Misalkan kartu pertama saya adalah ratu sekop. Itu hanya menunjukkan satu sebagai kartu pertama dalam satu dari setiap 52 deck yang mungkin, jadi kami telah mengurangi deck yang mungkin dari empat miliar menjadi sekitar 80 juta atau lebih.

Misalkan kartu kedua saya adalah tiga hati. Sekarang saya menjalankan RNG saya 80 juta kali lebih banyak menggunakan 80 juta biji yang menghasilkan ratu sekop sebagai angka pertama. Saya perlu beberapa detik. Saya menuliskan semua deck yang menghasilkan tiga hati sebagai kartu ketiga - kartu kedua di tangan saya. Itu lagi hanya sekitar 2% dari deck, jadi sekarang kita turun ke 2 juta deck.

Misalkan kartu ketiga di tangan saya adalah 7 klub. Saya memiliki database 2 juta benih yang membagi dua kartu saya; Saya menjalankan RNG saya 2 juta kali lagi untuk menemukan 2% dari deck yang menghasilkan 7 klub sebagai kartu ketiga, dan kita hanya memiliki 40 ribu deck.

Anda lihat bagaimana ini berjalan. Saya menjalankan RNG 40000 saya lebih banyak kali untuk menemukan semua benih yang menghasilkan kartu keempat saya, dan itu membuat kita turun menjadi 800 deck, dan kemudian menjalankannya 800 kali lebih banyak untuk mendapatkan ~ 20 biji yang menghasilkan kartu kelima saya, dan sekarang saya hanya menghasilkan dua puluh tumpukan kartu dan saya tahu bahwa Anda memiliki salah satu dari dua puluh kartu yang mungkin. Selain itu, saya memiliki ide yang sangat bagus tentang apa yang akan saya gambar selanjutnya.

Sekarang apakah Anda melihat mengapa keacakan sejati itu penting? Cara Anda menggambarkannya, Anda berpikir bahwa distribusi itu penting, tetapi distribusi bukanlah yang membuat proses acak. Ketidakpastian adalah apa yang membuat proses acak.

MEMPERBARUI

Berdasarkan komentar (sekarang dihapus karena sifatnya yang tidak konstruktif), setidaknya 0,3% orang yang pernah membaca ini bingung dengan poin saya. Ketika orang-orang membantah poin saya belum dibuat, atau lebih buruk, berpendapat untuk poin yang saya tidak membuat asumsi bahwa saya tidak membuat mereka, maka saya tahu bahwa saya perlu menjelaskan lebih jelas dan hati-hati.

Tampaknya ada kebingungan khusus di sekitar distribusi kata jadi saya ingin memanggil penggunaan dengan hati-hati.

Pertanyaan yang dihadapi adalah:

  • Bagaimana perbedaan angka pseudorandom dan benar-benar acak?
  • Mengapa perbedaan itu penting?
  • Apakah perbedaannya ada kaitannya dengan distribusi output PRNG?

Mari kita mulai dengan mempertimbangkan cara sempurna untuk menghasilkan setumpuk kartu acak untuk bermain poker. Kemudian kita akan melihat bagaimana teknik lain untuk menghasilkan deck berbeda, dan jika memungkinkan untuk mengambil keuntungan dari perbedaan itu.

Mari kita mulai dengan mengandaikan bahwa kita memiliki label kotak ajaib TRNG. Sebagai inputnya kita memberikan bilangan bulat n lebih besar atau sama dengan satu, dan sebagai outputnya memberi kita angka acak antara satu dan n, inklusif. Output dari kotak sepenuhnya tidak dapat diprediksi (bila diberi nomor selain satu) dan angka apa pun antara satu dan n sama besar kemungkinannya dengan yang lain; yang mengatakan bahwa distribusi adalah seragam . (Ada pemeriksaan statistik tingkat lanjut yang lebih lanjut yang bisa kita lakukan; Saya mengabaikan hal ini karena tidak sesuai dengan argumen saya. TRNG secara statistik acak secara acak dengan asumsi.)

Kami mulai dengan setumpuk kartu yang tidak diacak. Kami meminta boks untuk nomor antara satu dan 52 - yaitu TRNG(52),. Berapapun jumlah yang diberikannya, kami menghitung banyak kartu dari dek yang kami sortir dan mengeluarkan kartu itu. Ini menjadi kartu pertama di geladak yang dikocok. Kemudian kami meminta TRNG(51)dan melakukan hal yang sama untuk memilih kartu kedua, dan seterusnya.

Cara lain untuk melihatnya adalah: ada 52! = 52 x 51 x 50 ... x 2 x 1 kemungkinan deck, yang kira-kira 2 226 . Kami telah memilih salah satu dari mereka secara acak.

Sekarang kami memberikan kartu. Ketika saya melihat kartu saya, saya tidak tahu kartu apa yang Anda miliki. (Selain dari fakta yang jelas bahwa Anda tidak memiliki kartu yang saya miliki.) Mereka dapat berupa kartu apa saja, dengan probabilitas yang sama.

Jadi izinkan saya memastikan bahwa saya menjelaskan ini dengan jelas. Kami memiliki distribusi seragam untuk setiap output individu TRNG(n); masing-masing mengambil angka antara 1 dan n dengan probabilitas 1 / n. Juga, hasil dari proses ini adalah bahwa kami telah memilih satu dari 52! mungkin deck dengan probabilitas 1/52 !, sehingga distribusi atas set mungkin deck adalah juga seragam.

Baiklah.

Sekarang anggap saja kita memiliki kotak ajaib yang lebih sedikit, berlabel PRNG. Sebelum Anda dapat menggunakannya, nomor tersebut harus diunggulkan dengan nomor 32-bit yang tidak ditandatangani.

ASIDE: Kenapa 32 ? Tidak bisakah itu diunggulkan dengan nomor 64- atau 256- atau 10000-bit? Tentu. Tetapi (1) dalam prakteknya sebagian besar PRNG yang ada di pasaran diunggulkan dengan angka 32-bit, dan (2) jika Anda memiliki 10.000 bit keacakan untuk membuat benih maka mengapa Anda menggunakan PRNG sama sekali? Anda sudah memiliki sumber 10.000 bit keacakan!

Bagaimanapun, kembali ke cara kerja PRNG: setelah diunggulkan, Anda dapat menggunakannya dengan cara yang sama seperti yang Anda gunakan TRNG. Artinya, Anda memberikan angka, n, dan memberi Anda kembali angka antara 1 dan n, inklusif. Selain itu, distribusi output itu kurang lebih seragam . Artinya, ketika kita meminta PRNGangka antara 1 dan 6, kita mendapatkan 1, 2, 3, 4, 5 atau 6 masing-masing kira-kira seperenam dari waktu, tidak peduli apa benihnya.

Saya ingin menekankan hal ini beberapa kali karena sepertinya itu yang membingungkan komentator tertentu. Distribusi PRNG seragam dalam setidaknya dua cara. Pertama, misalkan kita memilih benih tertentu. Kami berharap bahwa urutan PRNG(6), PRNG(6), PRNG(6)...satu juta kali akan menghasilkan distribusi angka yang seragam antara 1 dan 6. Dan kedua, jika kami memilih satu juta benih yang berbeda dan memanggil PRNG(6) satu kali untuk setiap benih, sekali lagi kami akan mengharapkan distribusi angka yang seragam dari 1 hingga 6. 6. Keseragaman PRNG di kedua operasi ini tidak relevan dengan serangan yang saya gambarkan .

Proses ini dikatakan pseudo-acak karena perilaku kotak sebenarnya sepenuhnya deterministik; ia memilih dari salah satu dari 32 perilaku yang mungkin berdasarkan pada benih. Yaitu, setelah diunggulkan, PRNG(6), PRNG(6), PRNG(6), ... menghasilkan urutan angka dengan distribusi seragam, tetapi urutan itu sepenuhnya ditentukan oleh benih. Untuk urutan panggilan tertentu, katakanlah, PRNG (52), PRNG (51) ... dan seterusnya, hanya ada 2 32 kemungkinan urutan. Benih pada dasarnya memilih yang mana yang kita dapatkan.

Untuk menghasilkan sebuah dek, server sekarang menghasilkan sebuah seed. (Bagaimana? Kami akan kembali ke titik itu.) Kemudian mereka memanggil PRNG(52), PRNG(51)dan seterusnya untuk menghasilkan dek, mirip dengan sebelumnya.

Sistem ini rentan terhadap serangan yang saya jelaskan. Untuk menyerang server yang pertama, sebelumnya, perbanyak salinan kotak kami sendiri dengan 0 dan minta PRNG(52)dan tuliskan. Kemudian kita menabur ulang dengan 1, meminta PRNG(52), dan menuliskannya, hingga 2 32 -1.

Sekarang, server poker yang menggunakan PRNG untuk menghasilkan deck harus menghasilkan seed. Tidak masalah bagaimana mereka melakukannya. Mereka bisa menelepon TRNG(2^32)untuk mendapatkan benih yang benar-benar acak. Atau mereka dapat mengambil waktu saat ini sebagai benih, yang hampir tidak acak sama sekali; Saya tahu jam berapa sekarang sebanyak yang Anda lakukan. Maksud serangan saya adalah bahwa itu tidak masalah, karena saya memiliki basis data saya . Ketika saya melihat kartu pertama saya, saya bisa menghilangkan 98% dari kemungkinan benih. Ketika saya melihat kartu kedua saya, saya bisa menghilangkan 98% lebih banyak, dan seterusnya, sampai akhirnya saya bisa turun ke beberapa kemungkinan benih, dan tahu dengan kemungkinan besar apa yang ada di tangan Anda.

Sekarang, sekali lagi, saya ingin menekankan bahwa asumsi di sini adalah bahwa jika kita memanggil PRNG(6)satu juta kali kita akan mendapatkan masing-masing nomor kira-kira seperenam dari waktu . Distribusi itu (kurang lebih) seragam , dan jika keseragaman distribusi itu yang Anda pedulikan , tidak apa-apa. Inti pertanyaannya adalah adakah hal-hal lain yang menjadi PRNG(6)perhatian kita? dan jawabannya adalah ya . Kami peduli tentang ketidakpastian juga.

Cara lain untuk melihat masalahnya adalah bahwa meskipun distribusi satu juta panggilan PRNG(6)mungkin baik-baik saja, karena PRNG memilih dari hanya 2 32 perilaku yang mungkin, ia tidak dapat menghasilkan setiap dek yang mungkin. Itu hanya dapat menghasilkan 2 32 dari 2 226 deck yang mungkin; sebagian kecil. Jadi distribusi set himpunan semua sangat buruk. Tetapi sekali lagi, serangan mendasar di sini didasarkan pada kemampuan kita untuk berhasil memprediksi perilaku masa lalu dan masa depan dari PRNGsampel kecil dari hasilnya.

Izinkan saya mengatakan ini ketiga atau empat kali untuk memastikan ini masuk. Ada tiga distribusi di sini. Pertama, distribusi proses yang menghasilkan benih 32-bit acak. Itu bisa sangat acak, tidak dapat diprediksi dan seragam dan serangan akan tetap bekerja . Kedua, distribusi satu juta panggilan ke PRNG(6). Itu bisa sangat seragam dan serangannya masih akan berhasil. Ketiga, distribusi deck dipilih oleh proses pseudo-acak yang telah saya jelaskan. Distribusi itu sangat buruk; hanya sebagian kecil dari IRL deck yang mungkin dapat dipilih. Serangan tergantung pada prediktabilitas perilaku PRNG berdasarkan pengetahuan sebagian dari hasilnya .

ASIDE: Serangan ini mengharuskan penyerang tahu atau bisa menebak apa algoritma yang tepat yang digunakan oleh PRNG. Apakah itu realistis atau tidak adalah pertanyaan terbuka. Namun, ketika merancang sistem keamanan Anda harus merancang itu agar aman terhadap serangan bahkan jika penyerang tahu semua algoritma dalam program . Dengan kata lain: bagian dari sistem keamanan yang harus tetap rahasia agar sistem menjadi aman disebut "kunci". Jika sistem Anda bergantung pada keamanannya pada algoritme yang Anda gunakan sebagai rahasia, maka kunci Anda berisi algoritme tersebut . Itu adalah posisi yang sangat lemah!

Bergerak.

Sekarang anggaplah kita memiliki label kotak ajaib ketiga CPRNG. Ini adalah versi crypto-strength dari PRNG. Dibutuhkan benih 256-bit alih-alih benih 32-bit. Ini berbagi dengan PRNGproperti yang benih pilih dari salah satu dari 256 perilaku yang mungkin. Dan seperti mesin kami yang lain, ia memiliki properti yang menghasilkan sejumlah besar panggilan untuk CPRNG(n)menghasilkan distribusi hasil yang seragam antara 1 dan n: masing-masing terjadi 1 / n waktu itu. Bisakah kita menjalankan serangan kita melawannya?

Serangan awal kami mengharuskan kami menyimpan 2 32 pemetaan dari benih hingga PRNG(52). Tetapi 2 256 adalah angka yang jauh lebih besar; itu benar-benar tidak mungkin untuk menjalankan CPRNG(52)itu berkali-kali dan menyimpan hasilnya.

Tapi bagaimana kalau ada cara lain untuk mengambil nilai CPRNG(52)dan dari itu menyimpulkan fakta tentang benih? Kami sudah cukup bodoh sejauh ini, hanya dengan kasar memaksa semua kombinasi yang mungkin. Bisakah kita melihat ke dalam kotak ajaib, mencari tahu cara kerjanya, dan menyimpulkan fakta tentang benih berdasarkan output?

Tidak Rincian terlalu rumit untuk menjelaskan, tapi CPRNGs cerdik dirancang sehingga tidak layak untuk menyimpulkan setiap fakta yang berguna tentang benih dari output pertama CPRNG(52)atau dari setiap bagian dari output, tidak peduli seberapa besar .

OK, jadi sekarang misalkan server menggunakan CPRNGuntuk menghasilkan deck. Perlu benih 256-bit. Bagaimana cara memilih benih itu? Jika ia memilih nilai apa pun yang dapat diprediksi oleh penyerang maka tiba-tiba serangan itu menjadi layak lagi . Jika kita dapat menentukan bahwa dari 2 256 kemungkinan benih, hanya empat miliar di antaranya yang kemungkinan akan dipilih oleh server, maka kita kembali berbisnis . Kami dapat memasang serangan ini lagi, hanya memperhatikan sejumlah kecil benih yang mungkin dapat dihasilkan.

Karena itu server harus bekerja untuk memastikan bahwa jumlah 256-bit terdistribusi secara merata - yaitu, setiap seed yang mungkin dipilih dengan probabilitas 1/2 256 . Pada dasarnya server harus memanggil TRNG(2^256)-1untuk menghasilkan benih untuk CPRNG.

Bagaimana jika saya bisa meretas server dan mengintip ke dalamnya untuk melihat seed apa yang dipilih? Dalam hal ini, penyerang mengetahui masa lalu dan masa depan CPRNG yang lengkap . Penulis server harus berjaga-jaga terhadap serangan ini! (Tentu saja jika saya dapat berhasil me-mount serangan ini maka saya mungkin bisa juga hanya mentransfer uang ke rekening bank saya secara langsung, jadi mungkin itu tidak menarik. Intinya adalah: benih harus menjadi rahasia yang sulit ditebak, dan angka 256-bit yang benar-benar acak sangat sulit ditebak.)

Kembali ke poin saya sebelumnya tentang pertahanan-dalam: benih 256-bit adalah kunci untuk sistem keamanan ini. Gagasan CPRNG adalah bahwa sistem aman selama kuncinya aman ; bahkan jika setiap fakta lain tentang algoritma diketahui, selama Anda dapat menyimpan kunci rahasia, kartu lawan tidak dapat diprediksi.

OK, jadi benih harus rahasia dan didistribusikan secara seragam karena jika tidak, kita dapat melakukan serangan. Kami memiliki asumsi bahwa distribusi output CPRNG(n)seragam. Bagaimana dengan distribusi set semua deck yang mungkin?

Anda mungkin mengatakan: ada 2 256 kemungkinan urutan keluaran oleh CPRNG, tetapi hanya ada 2 226 deck yang mungkin. Oleh karena itu ada lebih banyak urutan yang mungkin daripada deck, jadi kami baik-baik saja; setiap kemungkinan-IRL deck sekarang (dengan probabilitas tinggi) mungkin dalam sistem ini. Dan itu argumen yang bagus kecuali ...

2 226 hanya merupakan perkiraan 52 !. Bagilah. 2 256/52 ! tidak mungkin menjadi bilangan bulat karena untuk satu hal, 52! habis dibagi 3 tetapi tidak ada kekuatan dua! Karena ini bukan bilangan bulat sekarang kita memiliki situasi di mana semua deck dimungkinkan , tetapi beberapa deck lebih mungkin daripada yang lain .

Jika itu tidak jelas, pertimbangkan situasi dengan jumlah yang lebih kecil. Misalkan kita memiliki tiga kartu, A, B dan C. Misalkan kita menggunakan PRNG dengan seed 8-bit, jadi ada 256 kemungkinan seed. Ada 256 kemungkinan hasil PRNG(3)tergantung pada benih; tidak ada cara untuk memiliki sepertiga dari mereka menjadi A, sepertiga dari mereka menjadi B dan sepertiga dari mereka menjadi C karena 256 tidak dapat habis dibagi oleh 3. Harus ada bias kecil terhadap salah satu dari mereka.

Demikian pula, 52 tidak dibagi secara merata menjadi 2 256 , jadi harus ada beberapa bias terhadap beberapa kartu sebagai kartu pertama yang dipilih dan bias dari yang lain.

Dalam sistem asli kami dengan benih 32-bit ada bias besar dan sebagian besar kemungkinan deck tidak pernah diproduksi. Dalam sistem ini semua geladak dapat diproduksi, tetapi distribusi geladak masih cacat . Beberapa deck sangat sedikit lebih mungkin daripada yang lain.

Sekarang pertanyaannya adalah: apakah kita memiliki serangan berdasarkan kelemahan ini? dan jawabannya ada dalam praktik, mungkin tidak . CPRNG dirancang sedemikian rupa sehingga jika benih benar-benar acak maka secara komputasi tidak layak untuk membedakan antara CPRNGdan TRNG.

OK, jadi mari kita simpulkan.

Bagaimana perbedaan angka pseudorandom dan benar-benar acak?

Mereka berbeda dalam tingkat prediktabilitas yang mereka tunjukkan.

  • Angka yang benar-benar acak tidak dapat diprediksi.
  • Semua angka pseudo-acak dapat diprediksi jika benih dapat ditentukan atau ditebak.

Mengapa perbedaan itu penting?

Karena ada aplikasi di mana keamanan sistem bergantung pada ketidakpastian .

  • Jika TRNG digunakan untuk memilih masing-masing kartu maka sistem tidak tersedia.
  • Jika CPRNG digunakan untuk memilih masing-masing kartu maka sistem aman jika benih keduanya tidak dapat diprediksi dan tidak diketahui.
  • Jika PRNG biasa dengan ruang benih kecil digunakan maka sistem tidak aman terlepas dari apakah benih tidak dapat diprediksi atau tidak diketahui; ruang biji yang cukup kecil rentan terhadap serangan brute-force seperti yang saya jelaskan.

Apakah perbedaannya ada kaitannya dengan distribusi output PRNG?

Keseragaman distribusi atau ketiadaan untuk panggilan individu untuk RNG(n)tidak relevan dengan serangan yang telah saya jelaskan.

Seperti yang telah kita lihat, baik PRNGdan CPRNGmenghasilkan distribusi yang buruk dari kemungkinan memilih setiap dek dari semua deck yang mungkin. Ini PRNGjauh lebih buruk, tetapi keduanya memiliki masalah.

Satu pertanyaan lagi:

Jika TRNG jauh lebih baik daripada CPRNG, yang pada gilirannya jauh lebih baik daripada PRNG, mengapa ada yang menggunakan CPRNG atau PRNG?

Dua alasan.

Pertama: biaya. TRNG mahal . Menghasilkan angka acak benar-benar sulit. CPRNG memberikan hasil yang baik untuk banyak panggilan secara sewenang-wenang dengan hanya satu panggilan ke TRNG untuk seed. Sisi negatifnya tentu saja Anda harus merahasiakan benih itu .

Kedua: kadang-kadang kita menginginkan prediktabilitas dan yang kita pedulikan adalah distribusi yang baik. Jika Anda menghasilkan data "acak" sebagai input program untuk test suite, dan itu menunjukkan bug, maka alangkah baiknya menjalankan test suite lagi menghasilkan bug lagi!

Saya harap itu sekarang jauh lebih jelas.

Akhirnya, jika Anda menikmati ini maka Anda mungkin menikmati beberapa bacaan lebih lanjut tentang subjek keacakan dan permutasi:


20
Ok, cowok dan cewek. Sudah cukup berkomentar untuk saat ini. Jika Anda ingin membahas ini lebih jauh, silakan ambil sendiri ruang obrolan, kthnxbye!
Ivo Flipse

1
@ Eric Tapi seed tidak diset ulang sebelum setiap draw deck baru, bukan? Jadi, meskipun Anda benar bahwa hanya ada sedikit lintasan yang kami sampel, Anda tidak tahu persis di mana lintasan Anda saat ini dan lintasan berpotongan.
AS


Perlakuan yang baik (tetapi padat) untuk masalah-masalah terkait ada di TAOCP vol 2 Knuth, bagian 3.5 “Apa itu Urutan Acak?” (Hal. 149), dimulai dengan definisi definisi sekuens yang terdistribusi, terdistribusi, dan terdistribusi.. Urutan pseudorandom dibahas dalam 3.5.F (hlm. 170). Lihat juga kriteria pseudorandomness dari teori kompleksitas dan BSI Jerman .
ShreevatsaR

160

Seperti yang dikatakan Eric Lippert, itu bukan hanya distribusi. Ada cara lain untuk mengukur keacakan.

Salah satu generator nomor acak awal memiliki urutan dalam bit paling tidak signifikan - berganti-ganti 0 dan 1. Oleh karena itu LSB 100% dapat diprediksi. Tetapi Anda perlu khawatir lebih dari itu. Setiap bit harus tidak dapat diprediksi.

Berikut ini cara yang baik untuk memikirkan masalahnya. Katakanlah Anda menghasilkan 64 bit keacakan. Untuk setiap hasil, ambil 32 bit pertama (A), dan 32 bit terakhir (B), dan buat indeks ke dalam array x [A, B]. Sekarang lakukan pengujian jutaan kali, dan untuk setiap hasil, tambahkan array pada angka itu, yaitu X [A, B] ++;

Sekarang gambar diagram 2D, di mana semakin besar angkanya, semakin terang piksel di lokasi itu.

Jika benar-benar acak, warnanya harus abu-abu seragam. Tetapi Anda mungkin mendapatkan pola. Ambil contoh diagram "acak" ini dalam nomor urut TCP sistem Windows NT:

Windows NT

atau bahkan yang ini dari Windows 98:

Windows 98

Dan di sini adalah keacakan implementasi Cisco router (IOS). Cisco ISO

Diagram ini adalah milik makalah Michał Zalewski . Dalam kasus khusus ini, jika seseorang dapat memprediksi berapa nomor urutan TCP dari suatu sistem, seseorang dapat berkedok sebagai sistem ketika membuat koneksi ke sistem lain - yang akan memungkinkan pembajakan koneksi, intersepsi komunikasi, dll. Dan bahkan jika kita tidak dapat memprediksi angka berikutnya 100% dari waktu, jika kita dapat menyebabkan koneksi baru dibuat di bawah kendali kita, kita dapat meningkatkan peluang keberhasilan. Dan ketika komputer dapat menghasilkan 100.000 koneksi dalam beberapa detik, peluang serangan yang berhasil berubah dari astronomi menjadi mungkin atau bahkan mungkin.


30
Ini sangat cemerlang sehingga membuat saya menangis. Seharusnya ada aplikasi yang membuat ini untuk setiap OS (mobile / desktop / server) dan platform (JVM / Javascript / dll).
HDave

5
Fungsi Windows rand () cukup bagus! Ini menghasilkan awan yang tidak memiliki pola yang jelas. Lihat implementasi saya untuk mencobanya (dan algoritma lainnya): github.com/Zalastax/visualize_random
Zalastax

93

Sementara angka pseudorandom yang dihasilkan oleh komputer dapat diterima untuk sebagian besar kasus penggunaan yang dihadapi oleh pengguna komputer, ada skenario yang membutuhkan angka acak yang sama sekali tidak dapat diprediksi.

Dalam aplikasi yang sensitif terhadap keamanan seperti enkripsi, generator nomor pseudorandom (PRNG) dapat menghasilkan nilai-nilai yang, meskipun secara acak berpenampilan, sebenarnya dapat diprediksi oleh penyerang. Seseorang yang mencoba memecahkan sistem enkripsi mungkin dapat menebak kunci enkripsi jika PRNG digunakan dan penyerang memiliki informasi tentang keadaan PRNG. Oleh karena itu, untuk aplikasi seperti itu, generator bilangan acak yang menghasilkan nilai-nilai yang benar-benar tidak dapat diterimanya diperlukan. Perhatikan bahwa beberapa PRNG dirancang untuk aman secara kriptografis dan dapat digunakan untuk aplikasi yang sensitif terhadap keamanan tersebut.

Informasi lebih lanjut tentang serangan RNG dapat ditemukan di artikel Wikipedia ini .


9
PRNG kriptografi ada, dan digunakan secara luas. Mereka dapat dari biji berukuran sedang menghasilkan aliran angka acak praktis tak terbatas. Secara komputasi tidak mungkin untuk membedakan aliran seperti itu dari bilangan acak yang sebenarnya, sehingga tidak ada informasi tambahan yang dapat diperoleh dari bagian mana pun dari aliran tersebut, dan untuk tujuan praktis jumlahnya sama baiknya dengan bilangan acak benar.
aaaaaaaaaaaa

Saya pikir cara termudah untuk menjelaskan ini adalah bahwa algoritma penghasil angka secara acak harus diprogram. Itu berarti ada serangkaian instruksi yang sedang diikuti. Jika ada satu set instruksi, itu tidak bisa acak.
Keltari

6
@Keltari Anda kehilangan elemen entropi ... Sebagian besar RNG (setidaknya yang kriptografi) mengumpulkan input dari sumber luar (mis. Gerakan mouse) dan menggunakannya sebagai bagian dari kondisi awal - dengan demikian, transformasi dari Ake Bdiprogram tetapi keadaan awal A(seharusnya) tidak dapat dilewati. Linux /dev/randomakan menyimpan perkiraan tentang seberapa banyak entropi tersedia dan berhenti memberikan angka jika jatuh terlalu rendah.
Dasar

Karena penasaran - mengapa lampu lava dianggap "benar-benar acak"? Saya memahaminya memperlihatkan perilaku yang agak tidak terduga, tetapi seseorang dengan pemahaman yang cukup kuat tentang dinamika fluida dan bagaimana cairan-cairan itu berinteraksi dalam lingkungan gravitasi bumi pasti dapat menghasilkan hasil yang "dapat diprediksi", bukan? Tentu, lampu lava tidak dapat diprediksi, tetapi bagi saya, mereka tidak acak sama sekali, tetapi sangat dapat diprediksi.
theGreenCabbage

1
@ theGreenCabbage: Saya curiga lampu lava kacau. Mengingat model komputer yang cukup baik, dan angka akurasi yang cukup, Anda (pada prinsipnya) dapat memprediksi perilaku untuk sementara waktu. Tapi, karena sistemnya kacau, dua lampu lava dengan perubahan terkecil dalam kondisi awal akan dengan cepat menyimpang dalam perilaku. (Dan komentar ini mengabaikan para penarik yang kacau.)
dmm

76

Saya mencobanya dengan Python: Ini hasil 60 juta gulungan. Variasi tertinggi adalah seperti 0,15. Bukankah itu akan terjadi secara acak?

Sebenarnya, ini sangat "baik", itu buruk ... Semua jawaban yang ada fokus pada prediktabilitas yang diberikan urutan kecil dari nilai awal. Saya ingin mengangkat masalah lain:

    distribusi Anda memiliki standar deviasi yang jauh lebih kecil daripada seharusnya gulungan acak

Benar keacakan hanya tidak datang cukup yang dekat dengan rata-rata "hampir persis 1 lebih bagaimana pernah nomor banyak dapat memilih dari" bahwa Anda menggunakan sebagai indikasi kualitas.

Jika Anda melihat pertanyaan tentang Stack Exchange ini tentang distribusi probabilitas untuk beberapa gulungan dadu , Anda akan melihat formula untuk standar deviasi gulungan dadu N (dengan asumsi hasil yang benar-benar acak):

 sqrt(N * 35.0 / 12.0).

Menggunakan rumus itu, standar deviasi untuk:

  • 1 juta gulungan adalah 1708
  • 60 juta gulungan adalah 13229

Jika kami melihat hasil Anda:

  • 1 juta gulungan: stddev (1000066, 999666, 1001523, 999452, 999294, 999999) adalah 804
  • 60 juta gulungan: stddev (9997653, 9997789, 9996853, 10006533, 10002774, 9998398) adalah 3827

Anda tidak dapat mengharapkan deviasi standar dari sampel hingga persis sama dengan formula, tetapi harus mendekati cukup. Namun, pada 1 juta gulungan, Anda memiliki kurang dari setengah stddev yang tepat, dan 60 juta Anda di bawah sepertiga - semakin buruk, dan itu bukan kebetulan ....

Pseudo-RNGs cenderung bergerak melalui urutan angka yang berbeda, dimulai dengan seed dan tidak mengunjungi kembali nomor asli untuk periode tertentu. Sebagai contoh, implementasi dari fungsi C library lama rand()umumnya memiliki periode 2 ^ 32, dan mereka akan mengunjungi setiap angka antara 0 dan 2 ^ 32-1 tepat sekali sebelum mengulangi seed. Jadi, jika Anda mensimulasikan 2 ^ 32 dadu menggulung pra-modulus (%) hasil akan mencakup setiap angka dari 0 hingga 2 ^ 32, jumlah untuk setiap hasil 1-6 adalah 715827883 atau 715827882 (2 ^ 32 bukan kelipatan 6), dan oleh karena itu standar deviasi hanya sepele di atas 0. Menggunakan rumus di atas, standar deviasi yang benar untuk 2 ^ 32 gulungan adalah 111924. Lagi pula, karena jumlah Anda gulungan pseudo-acak meningkatkan Anda berkumpul menuju 0 standar deviasi. Masalah ini dapat diharapkan menjadi signifikan ketika jumlah gulungan adalah fraksi yang signifikan dari periode tersebut, tetapi beberapa pseudo-RNGs dapat menunjukkan masalah yang lebih buruk - atau masalah bahkan dengan sampel yang lebih sedikit - daripada yang lain.

Jadi, bahkan jika Anda tidak peduli dengan kerentanan kriptografi, dalam beberapa aplikasi Anda mungkin ingin memiliki distribusi yang tidak memiliki hasil yang terlalu banyak, bahkan buatan. Beberapa jenis simulasi secara khusus mencoba mencari tahu konsekuensi dari hasil yang tidak merata yang secara alami terjadi dengan sampel besar dari hasil acak secara individu, tetapi mereka kurang terwakili dalam beberapa hasil pRNG. Jika Anda mencoba mensimulasikan bagaimana populasi besar bereaksi terhadap suatu peristiwa, masalah ini secara radikal dapat mengubah hasil Anda yang mengarah pada kesimpulan yang sangat tidak akurat.


Untuk memberikan contoh konkret: Katakanlah seorang ahli matematika memberi tahu programmer mesin poker bahwa setelah 60 juta gulungan simulasi - digunakan untuk mengedipkan ratusan "lampu" kecil di sekitar layar, jika ada 10.013.229 atau lebih berenam, yang diharapkan oleh ahli matematika itu. 1 stddev jauh dari rata-rata, harus ada pembayaran kecil. Per 68-95-99,7 aturan (Wikipedia) ini harus terjadi sekitar 16% dari waktu (~ 68% jatuh dalam standar deviasi / hanya setengah di luar di atas). Dengan generator angka acak Anda, ini berasal dari sekitar 3,5 standar deviasi di atas rata-rata: Di bawah peluang 0,025% - hampir tidak ada pelanggan yang mendapatkan manfaat ini. Lihat tabel Penyimpangan Tinggi pada halaman yang baru saja disebutkan, khususnya:

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

Anda membandingkan apel dan jeruk di sini. Dua standar deviasi sama sekali tidak ada hubungannya dengan satu sama lain.
Jbeuh

50

Saya baru saja menulis generator angka acak ini untuk menghasilkan gulungan dadu

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

Anda menggunakannya seperti ini

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

dll. Apakah Anda senang menggunakan generator ini untuk program yang menjalankan permainan dadu? Ingat, distribusinya persis seperti yang Anda harapkan dari generator "benar-benar acak"!

Generator angka pseudo-acak pada dasarnya melakukan hal yang sama - mereka menghasilkan angka yang dapat diprediksi dengan distribusi yang benar. Mereka buruk karena alasan yang sama bahwa generator angka acak sederhana di atas buruk - mereka tidak cocok untuk situasi di mana Anda memerlukan ketidakpastian asli, bukan hanya distribusi yang benar.


2
"Generator angka pseudo-acak ... menghasilkan angka yang dapat diprediksi dengan distribusi yang benar" - Hanya karena itu PRNG tidak menjamin bahwa ia memiliki distribusi sempurna (pada kenyataannya, yang komersial pada umumnya tidak, untuk persis alasan yang diuraikan dalam jawaban ini). Walaupun mereka dapat diprediksi dengan informasi yang cukup (algo yang digunakan, benih awal, nilai output, w / e), mereka masih memiliki varian.
Brian S

3
Selain titik, aku tahu, tapi get_generator = lambda: itertools.cycle(range(1,7)), generator = get_generator(), next(generator) # and so onterlalu elegan belum lagi :)
Janus Troelsen

2
@BrianS Sebenarnya, PRNG yang gagal tes distribusi dari waktu ke waktu dapat diprediksi oleh definisi. Jadi, lebih dari beberapa N besar, jika Anda mendapatkan sedikit jalan dari N / 2 kepala dalam membalik koin N, Anda dapat mulai bertaruh secara langsung, dan Anda bisa menang lebih dari yang Anda kalahkan. Demikian juga, jika Anda mendapatkan distribusi yang sempurna dari kepala vs ekor, tetapi kepala selalu datang berpasangan, maka Anda akan lagi memiliki resep untuk menang. Tes distribusi adalah cara Anda mengetahui PRNG ada gunanya.
Jon Kiparsky

1
Anda lupa nonlocal next:-).
Kos

5
Contoh yang lebih baik: Pi diyakini normal , artinya setiap urutan digit dengan panjang tertentu pada basis apa pun muncul tidak lebih sering daripada urutan lainnya dari panjang itu di dasar itu. Algoritma yang, ketika diminta untuk n bit acak, mengambil n bit pi berikutnya dan mengembalikannya ("seed" adalah bit yang Anda mulai), dalam jangka panjang akan menghasilkan distribusi yang merata. Tetapi Anda tetap tidak menginginkannya untuk generator Anda - seseorang yang mengetahui banyak bit terakhir yang Anda hasilkan dapat menemukan pertama kali urutan itu terjadi, anggap benih Anda ada di sana, dan kemungkinan benar.
cpast

26

Pembuatan angka acak yang dapat dilakukan komputer Anda cocok untuk sebagian besar kebutuhan, dan Anda tidak mungkin menemukan waktu di mana Anda membutuhkan angka acak.

Pembuatan bilangan acak benar memiliki tujuan. Dalam keamanan komputer, perjudian, sampling statistik besar, dll.

Jika Anda tertarik pada aplikasi angka acak, periksa artikel Wikipedia .


12
Masalah besarnya adalah ketika Anda membutuhkan angka acak yang tidak dapat diprediksi oleh penyerang karena alasan keamanan.
David Schwartz

16
Anda pasti akan menemukan waktu di mana Anda membutuhkan angka yang benar-benar acak. Cukup membuka halaman web yang dimulai dengan https://...
Jan Hudec

3
@JanHudec: Ya, dalam penggunaan sehari-hari, Anda akan memerlukan nomor acak yang aman saat Anda membuka program apa pun, jauh sebelum Anda mengetik di bilah alamat: lihat pengacakan tata letak ruang alamat . Itu sebabnya hal seperti ini terjadi.
Reid

5
@ JanHudec Saya secara khusus berbicara dalam arti bahwa Anda perlu menggunakan generator nomor acak online. Angka acak yang sebenarnya sering digunakan, tetapi sangat sedikit orang yang benar-benar perlu membuatnya sendiri.
Alex McKenzie

2
Mesin slot juga menggunakan PRNG, bukan TRNG. Generator bekerja sepanjang waktu dan sebuah nomor dipetik pada waktu yang tepat ketika tombol putar ditekan. Jumlah PRNG dan waktu tekan tombol yang benar-benar acak sama dengan TRNG.
Roger Dahl

26

Angka acak yang dihasilkan oleh fungsi-fungsi khas di sebagian besar bahasa pemrograman bukan angka acak. Mereka adalah angka acak semu. Karena mereka bukan bilangan acak, mereka dapat ditebak dengan informasi yang cukup tentang bilangan yang dihasilkan sebelumnya. Jadi ini akan menjadi bencana bagi keamanan dalam kriptografi .

Sebagai contoh, fungsi generator angka acak berikut yang digunakan dalam glibctidak menghasilkan angka acak murni. Angka acak semu yang dihasilkan oleh ini dapat ditebak. Ini merupakan kesalahan besar untuk masalah keamanan. Ada sejarah yang menjadi bencana. Ini tidak boleh digunakan dalam kriptografi.

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

Jenis generator angka acak semu ini seharusnya tidak pernah digunakan di tempat-tempat sensitif keamanan meskipun secara statistik jauh signifikan.

Salah satu serangan terkenal pada kunci acak pseudo adalah serangan pada 802.11b WEP . WEP memiliki kunci jangka panjang 104-bit, digabungkan dengan 24-bit IV (penghitung) untuk membuat kunci 128 bit, yang pada gilirannya diterapkan pada algoritma RC4 untuk menghasilkan kunci acak semu.

( RC4( IV + Key ) ) XOR (message)

Kunci-kunci itu terkait erat satu sama lain. Di sini, hanya IV yang bertambah 1 di setiap langkah dan semua yang lain tetap sama. Karena ini bukan murni acak, itu adalah bencana dan mudah dipecah. Kuncinya dapat dipulihkan dengan menganalisis sekitar 40000 frame, yang merupakan hitungan menit. Jika WEP menggunakan 24-bit IV murni acak, maka itu bisa aman sampai sekitar 2 ^ 24 (hampir 16,8 juta) frame.

Jadi seseorang harus pergi dengan generator nomor acak murni dalam masalah sensitif keamanan bila memungkinkan.


3
Saya akan menyalahkan hal-hal WEP pada protokol yang dirancang buruk menggunakan cipher yang lemah. Dengan stream cipher modern, Anda dapat menggunakan penghitung sebagai IV.
CodesInChaos

2
Masalah utama dengan WEP adalah mengulangi kunci dalam 2 ^ 24 (hampir 16 juta) frame. Itu bahkan lebih buruk dengan kunci terkait yang memungkinkan untuk memecahkan kode di sekitar 40000 frame. Poin utama di sini adalah bahwa kuncinya tidak acak. Ini terkait erat, sehingga mudah retak.
Prabhu

1
Keacakan acak adalah buruk dalam kriptografi hanya ketika menghasilkan kunci kriptografi . Tidak apa-apa selain itu. Memang, RC4 sedikit lebih dari generator nomor pseudo-acak diunggulkan dengan ekspansi 128-bit kunci XORed ke plaintext pesan.
Matt

12

Perbedaannya adalah bahwa angka pseudorandom yang dihasilkan dapat diprediksi (berulang) setelah beberapa waktu di mana angka acak yang sebenarnya tidak. Panjang yang diperlukan untuk mengulang tergantung pada panjang benih yang digunakan untuk generasinya.

Berikut adalah video yang cukup bagus tentang topik itu: http://www.youtube.com/watch?v=itaMNuWLzJo


Prediktabilitas! = Berulang. Mersenne Twister adalah contoh yang bagus untuk itu. Pada sebagian besar implementasi setelah 624 Int32 Anda dapat memprediksi semua nomor berikutnya, tetapi urutan Mersenne Twister jauh lebih lama dari itu (2 ^ 19937 - 1).
HoLyVieR

Saya tidak mengerti mengapa jawaban ini tidak didorong ke atas tumpukan, karena menurut saya ini adalah jawaban yang akurat dan ringkas untuk pertanyaan, setidaknya sebagian. Bilangan acak semu dapat dengan mudah diprediksi setelah beberapa pengundian, jumlah pengundian bervariasi dengan algoritma "kualitas" pseudo acak. Memilih algoritme "baik" memperhatikan aspek-aspek: 1. setiap nilai diambil dalam frekuensi yang sama (distribusi), 2. dibutuhkan "waktu yang lama" untuk memulai kembali urutan di awal dan mulai menggambar lagi angka yang sama di pesanan yang sama.
menit

"angka acak sejati tidak [dapat diprediksi]". Untuk hari ini, ini benar. Sekarang jika kita percaya pada teori Dentuman Besar, dan kita memiliki banyak kekuatan untuk menghitung keadaan Semesta setiap saat setelah BB, berdasarkan pada fisika maka ... kita dapat memprediksi masa depan, termasuk fakta bahwa Saya menulis komentar yang sangat tepat ini. Baik?
menit

Namun, itu benar secara hipotetis, mengingat besarnya tingkat entropi yang terlibat dalam aksi nyata dari tubuh nyata, kekuatan komputasi yang diperlukan akan sangat besar. Pikirkan benua yang tercakup dalam komputer. Plus, karena ketergantungan pada keadaan sebelumnya, keadaan setiap benda di alam semesta pada setiap titik waktu perlu disimpan, yang menurut definisi akan membutuhkan lebih banyak ruang daripada yang tersedia di alam semesta, sepenuhnya diisi dengan peralatan memori
TheEnvironmentalist

@TheEnvironmentalist - Ah! "Benua tercakup dalam komputer" ... bukankah itu tentang "Panduan Hitchhiker untuk Galaksi"? ;-)
ysap

10

Asumsikan bahwa nomor acak semu dapat ditebak oleh siapa pun sebelum dihasilkan.

Untuk aplikasi sepele, keacakan pseudo baik-baik saja, seperti dengan contoh Anda, Anda akan mendapatkan kira-kira persentase yang benar (sekitar 1/6 dari total hasil set) dengan beberapa variasi kecil (Yang akan Anda lihat jika Anda melempar dadu 600 k waktu);

Namun, ketika datang ke hal-hal seperti keamanan komputer; Diperlukan keacakan yang benar.

Misalnya algoritma RSA dimulai dengan komputer memilih dua angka acak (P dan Q) dan kemudian melakukan beberapa langkah ke angka-angka itu untuk menghasilkan angka-angka khusus yang dikenal sebagai kunci publik dan pribadi Anda. (Bagian penting dari kunci privat adalah kunci privat, dan tidak ada orang lain yang tahu!)

Jika penyerang dapat mengetahui dua nomor 'acak' yang akan diambil komputer Anda, Mereka dapat melakukan langkah yang sama untuk menghitung kunci pribadi Anda (Nomor yang seharusnya tidak diketahui orang lain!)

Dengan kunci pribadi Anda, seorang penyerang dapat melakukan hal-hal seperti a) Bicaralah dengan bank Anda berpura-pura menjadi Anda, b) Dengarkan lalu lintas internet 'aman' Anda dan dapat memecahkan kode itu, c) Masquerade antara Anda dan pihak lain di internet.

Di situlah keacakan sejati (mis. Tidak bisa ditebak / dihitung) diperlukan.


10

Angka acak pertama yang pernah saya gunakan memiliki properti yang sangat baik dari dua nomor acak berturut-turut, yang kedua lebih besar dengan probabilitas 0,6. Bukan 0,5. Dan yang ketiga lebih besar dari yang kedua dengan probabilitas 0,6, dan seterusnya. Anda bisa membayangkan bagaimana hal itu memainkan malapetaka dengan simulasi.

Beberapa orang tidak akan mempercayai saya ini bahkan mungkin dengan angka acak yang terdistribusi secara merata, tetapi jelas mungkin jika Anda melihat urutannya (1, 3, 5, 2, 4, 1, 3, 5, 2, 4, ...) di mana yang kedua dari dua angka lebih besar dengan probabilitas 0,6.

Di sisi lain, untuk simulasi, penting untuk dapat mereproduksi angka acak. Katakanlah Anda melakukan simulasi lalu lintas dan ingin mengetahui bagaimana beberapa tindakan yang Anda ambil dapat meningkatkan lalu lintas. Dalam hal ini Anda ingin dapat membuat kembali data lalu lintas yang sama persis (seperti orang yang mencoba memasuki kota) dengan tindakan berbeda yang Anda coba untuk meningkatkan lalu lintas.


8

Jawaban singkatnya adalah bahwa biasanya orang memerlukan "keacakan yang sebenarnya" untuk alasan yang buruk, yaitu bahwa mereka tidak memiliki pemahaman tentang kriptografi.

Primitif kriptografi seperti stream cipher dan CSPRNG digunakan untuk menghasilkan aliran besar bit yang tidak dapat diprediksi begitu mereka telah diberi beberapa bit yang tidak dapat diprediksi.

Pembaca yang cermat sekarang akan menyadari ada masalah bootstrap di sini: kita harus mengumpulkan beberapa bit entropi untuk memulai semuanya. Kemudian dapat memberi mereka makan ke CSPRNG yang pada gilirannya akan dengan senang hati memberikan semua bit yang tidak terduga yang kita butuhkan. Oleh karena itu, RNG perangkat keras diperlukan untuk melakukan seed CS CSN . Ini adalah satu-satunya kasus di mana entropi diperlukan dalam kebenaran.

(Saya pikir ini seharusnya sudah diposting di Keamanan atau Kriptografi.)

Sunting: Pada akhirnya, seseorang harus memilih generator angka acak yang cukup baik untuk tugas yang dibayangkan dan sejauh menyangkut nomor acak, perangkat keras tidak selalu sama dengan baik. Sama seperti PRNG yang buruk, sumber acak perangkat keras biasanya memiliki bias.

Sunting: Beberapa orang di sini menganggap model ancaman di mana penyerang bisa membaca keadaan internal CSPRNG dan dari sana pergi ke kesimpulan bahwa CSPRNG bukan solusi yang aman. Ini adalah contoh dari pemodelan thread yang buruk. Jika seorang penyerang memiliki sistem Anda, gim ini selesai, sederhana dan sederhana. Tidak ada bedanya apakah Anda menggunakan TRNG atau CSPRNG pada saat ini.

Sunting: Jadi, untuk meringkas semua ini ... Entropi diperlukan untuk mengunggah CSPRNG. Setelah ini selesai, CSPRNG akan memberikan semua bit yang tidak dapat diprediksi yang kita butuhkan untuk aplikasi keamanan lebih cepat dari yang kita dapat (biasanya) kumpulkan dari entropi. Jika tidak dapat diprediksi tidak diperlukan, seperti untuk simulasi, Mersenne Twister akan memberikan angka dengan sifat statistik yang baik pada tingkat yang jauh lebih tinggi.

Sunting: Siapa pun yang mau memahami masalah pembuatan angka acak yang aman harus membaca ini: http://www.cigital.com/whitepapers/dl/The_Importance_of_R reliable_Randomness.pdf


2
Itu belum tentu merupakan pertanyaan keamanan. Saya pikir ada alasan untuk menggunakan angka acak yang tidak melibatkan keamanan. Jika saya melakukan penelitian ilmiah yang tergantung pada angka acak dan untuk alasan apa pun penting angka-angkanya acak, saya pasti akan mengambil keuntungan dari perangkat keras RNG sehingga saya dapat yakin bahwa setiap properti yang diamati bukan karena untuk kebiasaan RNG.
Kef Schecter

3
@ KefSchecter Ini adalah perangkat keras PRNG yang mereka dengar umumnya memiliki bias dan / atau output yang berhubungan. Mereka membutuhkan langkah pemrosesan pos untuk mengubahnya menjadi output independen yang seragam. Tidak ada alasan untuk percaya bahwa langkah pemrosesan pos ini lebih dapat diandalkan daripada stream cipher modern. Saya pasti akan lebih percaya pada stream cipher. Sebagai bonus tambahan itu dapat direproduksi, yang berharga dalam sains.
CodesInChaos

OK cukup adil. Tetapi bukankah hal yang sama berlaku untuk aplikasi kriptografi? Bahkan jawabannya di sini mengatakan Anda membutuhkan perangkat keras RNG untuk menambalkan CSPRNG.
Kef Schecter

2
@KefSchecter Ya, aplikasi crypto membutuhkan nomor acak yang benar untuk mengunggah CSPRNG. Tapi untuk semua yang lain kita bisa menggunakan CSPRNG itu.
CodesInChaos

@KefSchecter: Aplikasi kriptografi mengharuskan aliran tidak dapat direproduksi oleh dunia pada umumnya. Sebaliknya, dalam aplikasi ilmiah, dapat menunjukkan bahwa angka "acak" yang digunakan seseorang tidak hanya dipilih untuk menunjukkan analisis seseorang dalam cahaya yang baik sangat membantu. Sebagai contoh, jika seseorang mengumumkan setelah mengumumkan metode seseorang bahwa seseorang akan menghasilkan data dengan cara tertentu menggunakan nomor lotre negara hari berikutnya, pembaca dapat agak yakin bahwa seseorang tidak memalsukan hasil seseorang bahkan jika gambar hari kerja hanya memiliki beberapa lusin sedikit entropi.
supercat

7

Tidak semua PRNG cocok untuk semua penggunaan. Sebagai contoh, Java.util.SecureRandom menggunakan hash SHA1, yang memiliki ukuran output 160 bit. Itu berarti ada 2 160 kemungkinan aliran angka acak yang dapat berasal darinya. Sederhana seperti itu. Anda tidak bisa mendapatkan lebih dari 2 160 nilai kondisi internal. Dengan demikian Anda tidak bisa mendapatkan lebih dari 2 160 aliran unik angka acak dari satu biji, di mana pun benih Anda berasal. Windows CryptGenRandom diyakini menggunakan keadaan 40 byte, ia memiliki 2 320 kemungkinan aliran angka acak.

Jumlah cara untuk mengocok kartu 52 kartu standar adalah 52 !, yaitu sekitar 2 226 . Dengan demikian, terlepas dari penyemaian, Anda tidak dapat menggunakan Java.util.SecureRandom untuk mengocok setumpuk kartu. Ada sekitar 2 66 kemungkinan pengocokan yang tidak dapat diproduksi. Tentu saja, kita tidak tahu yang mana ...

Jadi, jika saya memiliki sumber, katakanlah, 256-bit keacakan yang sebenarnya (misalnya, dari kartu Quantis RNG), saya bisa menaburkan PRNG seperti CryptGenRandom () dengan benih itu dan kemudian menggunakan PRNG untuk mengocok setumpuk kartu. kartu-kartu. Jika saya kembali dengan keacakan benar setiap acak, ini akan baik-baik saja: tidak dapat diprediksi dan secara statistik acak. Jika saya melakukan hal yang sama dengan Java.util.SecureRandom, akan ada shuffle yang tidak mungkin diproduksi, karena tidak dapat diunggulkan dengan 256 bit entropi, dan keadaan internal tidak dapat mewakili semua kemungkinan pengocokan.

Perhatikan bahwa hasil java.util.SecureRandom akan menjadi tidak dapat diprediksi dan acak secara statistik. Tidak ada tes statistik yang akan mengidentifikasi masalah! Tetapi output dari RNG tidak cukup besar untuk mencakup seluruh domain dari semua output yang mungkin diperlukan untuk mensimulasikan setumpuk kartu.

Dan ingat, jika Anda menambahkan pelawak, itu 54! yang harus Anda liput, yang membutuhkan sekitar 2 238 kemungkinan.


2
Mengapa Anda peduli bahwa beberapa pengocokan tidak dapat terjadi? Pembatasan itu tidak memiliki efek yang dapat diamati.
CodesInChaos

2
Aku agak kaget dengan pertanyaan itu. Untuk perusahaan game yang sangat diatur, bias semacam itu secara matematis akan membuktikan bahwa peluang Anda untuk memenangkan permainan kartu berbeda dengan komputer dibandingkan dengan setumpuk kartu kertas. Tidak masalah apakah peluangnya lebih baik atau lebih buruk. Mereka BERBEDA. Komputer tidak secara moral setara dengan setumpuk nyata. Lagipula kita tidak bisa menandai perbedaannya. Perusahaan game yang menghadapi denda peraturan yang ketat akan sangat peduli.
Paco Hope

1
Tapi itu bisa dideteksi. Saya mendeteksinya menggunakan proses yang dikenal: review kode sumber dan pengetahuan tentang domain masalah. Itu yang luar biasa. Saya TIDAK dapat menggunakan analisis statistik otomatis. Ini terdeteksi sebagai seseorang menggunakan java.util.Random atau Mersenne Twister. Analisis statistik bukan satu-satunya mekanisme deteksi yang valid untuk RNG / problem domain mismatch. Kegagalan yang melewati detektor itu, menurut definisi, tidak berhasil.
Paco Hope

1
Saya tidak pernah tidak setuju dengan pernyataan itu. Apa yang saya katakan adalah bahwa analisis statistik bukan bukti yang sempurna bahwa RNG / PRNG benar. Ini adalah contoh negatif palsu. Itu seharusnya tidak benar, tetapi uji output statistik akan lulus itu. Jika saya menggunakan SHA1 (1), SHA1 (2), SHA1 (3) ... SHA1 (n) sebagai "RNG" saya yang juga akan lulus tes statistik. Itu juga salah. Definisi yang benar melampaui definisi "lulus uji statistik." Lulus tes statistik diperlukan, tetapi tidak cukup.
Paco Hope

4
@CodesInChaos: Argumen "kita tidak tahu tentang serangan yang dapat mengambil keuntungan dari kenyataan bahwa sebagian besar kemungkinan-IRL-shuffles tidak akan pernah diproduksi" tidak menyiratkan bahwa serangan seperti itu tidak mungkin, hanya saja kita tidak tidak tahu apa itu atau bagaimana mempertahankannya. Sikap yang benar dalam hal ini adalah untuk menghilangkan kemungkinan serangan dengan menghilangkan kondisi: membuat RNG dengan kualitas yang cukup sehingga benar-benar dapat menghasilkan setiap dek yang mungkin.
Eric Lippert

6

Bilangan pseudorandom dihasilkan menggunakan fungsi matematika dan nilai awal (disebut seed ), sedangkan bilangan acak tidak. Predikabilitasnya membuat mereka sangat berguna untuk replay game, karena Anda hanya perlu menyimpan seed dan input pemain - AI akan merespons dengan cara "acak" yang persis sama setiap waktu.


6

Perbedaan antara nomor acak "benar" acak dan "semu" adalah prediktabilitasnya. Jawaban ini sudah disediakan.

Namun, prediktabilitas tidak selalu merupakan hal buruk seperti yang ditunjukkan oleh sebagian besar contoh. Berikut adalah contoh praktis dari salah satu kasus langka di mana prediktabilitasnya baik: Sistem Penentuan Posisi Global.

Setiap satelit menggunakan kode PRN yang berbeda (kode Emas ) yang cocok untuk korelasi otomatis atau korelasi silang yang diperlukan untuk pengukuran waktu propagasi sinyal. Untuk kode-kode Emas ini, korelasi antara satu sama lain sangat lemah, memungkinkan identifikasi yang tegas dari satelit, tetapi memungkinkan perhitungan jarak dengan korelasi antara urutan yang dipancarkan dan penerima.


2

Untuk memeriksa keacakan dengan cepat, Anda mengambil titik dengan koordinat acak dalam [0; 1) lalu meletakkannya dalam kubus k-dimensi. Kemudian Anda melakukan prosedur untuk mengiris kubus ini menjadi sub-sub - setiap volume sub-sub (atau sub-sub) harus diukur dengan benar oleh prosedur ini dengan fluktuasi sesuai dengan teorema terkenal.

Kualitas keacakan penting di mana Anda bertemu ...

  1. tujuan keamanan. Ketika Anda menghasilkan angka untuk digunakan sebagai parameter untuk pembuatan kunci Anda, dan itu dapat diprediksi dengan baik - musuh akan mengetahuinya dengan probabilitas 100% dan membuat bidang untuk pencarian jauh lebih kecil.

  2. tujuan ilmiah. Dalam sains Anda tidak hanya harus memiliki rata-rata rata-rata dalam kondisi baik, tetapi juga korelasi antara berbagai bilangan acak harus dihilangkan. Jadi jika Anda mengambil (a_i - a) (a_ {i + 1} -a) dan menemukan distribusinya, ia harus sesuai dengan statistik.

Korelasi pasangan disebut "keacakan lemah". Jika Anda ingin keacakan nyata, Anda harus memiliki korelasi orde tinggi dengan lebih dari 2 varian.

Saat ini hanya generator mekanika kuantum yang memberikan keacakan yang sebenarnya.


1

Mengapa keacakan yang benar itu penting?

Pada dasarnya ada dua alasan utama mengapa keacakan sejati diperlukan:

  1. Jika Anda menggunakan RNG untuk kriptografi (termasuk hal-hal seperti perjudian uang nyata dan menjalankan lotere), maka PRNG akan membuat Anda lebih lemah dibandingkan analisis matematis (yang mengasumsikan TRNG). PRNG sebenarnya tidak akan acak, tetapi memiliki pola - musuh dapat mengeksploitasi pola tersebut untuk memecahkan sandi yang seharusnya tidak dapat dipecahkan.
  2. Jika Anda menggunakan RNG untuk mensimulasikan input "acak", misalnya untuk pengujian atau simulasi bug, maka PRNG membuat pendekatan Anda lemah. Ketika Anda tidak menemukan bug, akan selalu ada keraguan yang mengganggu: Apakah ada bug yang tidak terlihat dengan pola PRNG saya, tetapi akan muncul jika saya hanya menggunakan TRNG? Apakah temuan simulasi saya secara akurat menggambarkan kenyataan, atau apakah fenomena yang saya temukan hanyalah sebuah artefak dari pola PRNG?

Di luar area ini, tidak masalah. Peringatan: Jika PRNG Anda sangat, sangat buruk, itu mungkin masih tidak cocok - Anda tidak ingin membuat permainan Craps di mana dadu selalu muncul bahkan, pemain Anda tidak akan menyukainya.

Bagaimana PRNG Python tidak cukup baik?

Sangat tidak mungkin bahwa Anda akan dapat mendeteksi perangkap PRNG nyata dengan menggunakan metodologi sederhana seperti itu. Analisis statistik RNG adalah bidang sains dalam dirinya sendiri, dan beberapa tes yang sangat canggih tersedia untuk membandingkan "keacakan" suatu algoritma. Ini jauh lebih maju daripada upaya sederhana Anda.

Setiap pengembang perangkat lunak yang membuat perpustakaan dunia nyata, seperti pengembang Python, menggunakan tes statistik ini sebagai tolok ukur untuk melihat apakah implementasi PRNG mereka cukup baik. Jadi, kecuali untuk contoh pengawasan pengembang yang sebenarnya, sangat tidak mungkin bahwa Anda akan dapat dengan mudah mendeteksi pola di PRNG dunia nyata. Itu tidak berarti tidak ada pola - PRNG memiliki pola menurut definisi.


0

Pada dasarnya, Anda tidak dapat membuktikan bahwa suatu sumber adalah acak dengan analisis matematika terhadap keluarannya, Anda perlu, misalnya, suatu model fisik yang mengatakan bahwa sumber itu acak (seperti dalam peluruhan radioaktif).

Anda bisa menjalankan tes batch untuk menemukan korelasi statistik dalam data output, dalam hal ini data terbukti non random (tetapi juga sumber acak dapat memiliki output non acak, atau tidak akan benar-benar acak jika tidak dapat memberikan spesifik keluaran). Kalau tidak, jika tes dilewati, Anda dapat mengatakan bahwa data tersebut pseudo acak.

Melewati beberapa tes keacakan hanya berarti Anda memiliki PRNG (pseudo random number generator) yang baik, yang dapat berguna untuk aplikasi di mana keamanan tidak terlibat.

Jika keamanan terlibat (yaitu enkripsi, menghasilkan garam utama, pembuatan angka acak untuk perjudian ...) itu tidak cukup untuk memiliki PRNG yang baik itu perlu memiliki kualitas tambahan, seperti fungsi output tidak mudah ditebak dari output sebelumnya, fungsi perlu memiliki biaya komputasi yang diinginkan (cukup terbatas untuk dapat digunakan, tetapi cukup tinggi untuk mengalahkan upaya paksa), perangkat keras yang menjalankan fungsi - atau perangkat, dalam kasus aneh saat ini adalah perangkat analog - tidak boleh mudah dirusak, dll.

Memiliki PRNG yang baik dapat berguna dalam game untuk membuat pola baru dan tak terduga, dan dalam enkripsi - terlalu rumit untuk dijelaskan dalam satu posting, anggap saja sebagai peran praktis apa yang keluar dari prosedur enkripsi harus pseudo-acak, tidak menunjukkan pola yang dapat menghubungkan data terenkripsi sebelumnya dengan data terenkripsi berikut, atau menghubungkan data teks biasa ke data terenkripsi, atau menghubungkan dua cipherteks yang berbeda satu sama lain (sehingga tebakan dapat dilakukan pada teks biasa) ....


-5

Cerita pendek:

Menghasilkan benih acak dengan menggunakan mikrodetik saat ini dari sistem.

Trik ini cukup lama dan masih berfungsi.

Tidak termasuk faktor kekuatan kasar, di mana saya dapat menentukan setiap kombinasi dengan "bertaruh" di semua angka yang mungkin dan itu bukan poin dari pertanyaan ini, khususnya ketika sebagian besar angka acak dibulatkan sebelum penggunaannya.

Katakanlah sebuah contoh, saya dapat menentukan seed yang digunakan hanya dengan 10 nilai. Jadi, mengetahui benihnya, saya bisa menebak nilai selanjutnya.

Jika saya akan menggunakan seed = 1 maka saya bisa mendapatkan urutan berikutnya:

1, 2, 3, 4, 5, 6, 7, 8, 9 ... (dan saya menyimpulkan bahwa seed menggunakan id 1 dan nilai selanjutnya 10)

Tapi, apa yang akan terjadi jika jika mengubah kirim setiap "n" nilai ?. Mengubah benih dengan mikrodetik saat ini adalah trik yang murah (artinya, tidak memerlukan banyak siklus CPU).

Jadi urutannya sekarang adalah: (seed = 1) 1, 2, 3, 4, 5, (seed = 2), 7, 9, 11, 13 ... (15?)

Pada kasus ini:

a) Saya tidak bisa memotong benih mana yang digunakan.

b) Ergo, saya tidak bisa menebak nilai selanjutnya.

c) Satu-satunya tebakan yang bisa saya lakukan adalah mengurangi bahwa benih berikutnya bisa menjadi nomor utama.

Bagaimanapun, sebagian besar algoritma generator acak modern sudah menggunakan trik ini di bawah tenda.

Fakta sebenarnya adalah bahwa, kita tidak perlu komputer kuantum untuk membuat angka acak "benar", ketidaktepatan kristal kuarsa komputer kita bertindak sebagai generator acak, juga efisiensi acak CPU kita juga variabel tanpa mempertimbangkan bahwa CPU biasanya melakukan beberapa tugas sekaligus.


2
Ini adalah ide yang agak buruk dan merupakan sumber kerentanan untuk hal yang membutuhkan urutan yang benar-benar tidak dapat diprediksi. Jika Anda mengambil mikrodetik, Anda hanya memiliki 10 ^ 6 kemungkinan benih yang agak rendah.
HoLyVieR

@HoLyVieR: itu tentu saja ide yang buruk jika Anda peduli dengan keamanan, tetapi tidak seburuk yang Anda tahu: Anda biasanya akan menggunakan mikrodetik sejak sistem mulai (atau unix zaman ....) yang secara signifikan meningkatkan kisaran nilai yang mungkin.
mikera

1
@mikera Tidak lebih baik, waktu di mana permintaan diproses dapat diprediksi. Ini adalah vektor kerentanan untuk sejumlah besar fungsi reset kata sandi. Skrip-skrip tersebut menghasilkan token "acak" dengan teknik Anda dan penyerang dapat menemukan token yang dihasilkan sejak menemukan waktu eksekusi itu agak sepele ... itu saat yang sama ketika permintaan untuk mengatur ulang kata sandi dikirim + - 150ms.
HoLyVieR

Tentu, situasi itu sangat buruk. Tetapi situasi di mana negara diunggulkan di startup sistem, dan penyerang tidak memiliki cara yang baik untuk menebak waktu startup tidak begitu buruk. Anda mungkin dengan mudah memiliki 10 ^ 12 mikrodetik untuk dipilih, yang dapat membuat beberapa jenis serangan menjadi tidak mungkin. Untuk menjadi jelas: semua solusi ini cukup buruk dari sudut pandang kripto, tetapi konstanta penting .
mikera

Untuk server online, informasi waktu aktif sistem kadang-kadang ditawarkan untuk umum. Atau Anda bisa mendapatkannya dari halaman status "Insiden. Server lagi.". Atau Anda bisa ping, tunggu downtime besar, dan perhatikan itu bisa jadi mesin reboot (yang akan memberi waktu ratusan juta waktu untuk memeriksa, yang agak rendah).
Dereckson
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.