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
Jawaban:
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:
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 memintaTRNG(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 memintaPRNG
angka 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 memanggilPRNG(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, memintaPRNG(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 menjadiPRNG(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 dariPRNG
sampel 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 dariPRNG
. Dibutuhkan benih 256-bit alih-alih benih 32-bit. Ini berbagi denganPRNG
properti 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 untukCPRNG(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 menjalankanCPRNG(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
CPRNG
untuk 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)-1
untuk menghasilkan benih untukCPRNG
.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
CPRNG
danTRNG
.OK, jadi mari kita simpulkan.
Mereka berbeda dalam tingkat prediktabilitas yang mereka tunjukkan.
Karena ada aplikasi di mana keamanan sistem bergantung pada ketidakpastian .
Keseragaman distribusi atau ketiadaan untuk panggilan individu untuk
RNG(n)
tidak relevan dengan serangan yang telah saya jelaskan.Seperti yang telah kita lihat, baik
PRNG
danCPRNG
menghasilkan distribusi yang buruk dari kemungkinan memilih setiap dek dari semua deck yang mungkin. IniPRNG
jauh lebih buruk, tetapi keduanya memiliki masalah.Satu pertanyaan lagi:
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:
RNG(n)
?sumber
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:
atau bahkan yang ini dari Windows 98:
Dan di sini adalah keacakan implementasi Cisco router (IOS).
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.
sumber
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 .
sumber
A
keB
diprogram tetapi keadaan awalA
(seharusnya) tidak dapat dilewati. Linux/dev/random
akan menyimpan perkiraan tentang seberapa banyak entropi tersedia dan berhenti memberikan angka jika jatuh terlalu rendah.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):
Menggunakan rumus itu, standar deviasi untuk:
Jika kami melihat hasil Anda:
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:
sumber
Saya baru saja menulis generator angka acak ini untuk menghasilkan gulungan dadu
Anda menggunakannya seperti ini
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.
sumber
get_generator = lambda: itertools.cycle(range(1,7))
,generator = get_generator()
,next(generator) # and so on
terlalu elegan belum lagi :)nonlocal next
:-).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 .
sumber
https://
...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
glibc
tidak 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.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.
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.
sumber
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
sumber
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.
sumber
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.
sumber
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
sumber
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.
sumber
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.
sumber
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.
sumber
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 ...
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.
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.
sumber
Pada dasarnya ada dua alasan utama mengapa keacakan sejati diperlukan:
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.
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.
sumber
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) ....
sumber
Cerita pendek:
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.
sumber