/ Dev / random लिखने से समानांतर पढ़ने से / dev / यादृच्छिक तेजी से क्यों नहीं बनता है?


22

आमतौर पर /dev/random100-500 बाइट्स और ब्लॉक्स से रीडिंग , एक एन्ट्रापी के एकत्र होने की प्रतीक्षा में होती है।

/dev/randomअन्य प्रक्रियाओं द्वारा सूचना लिखने को पढ़ने की गति क्यों नहीं होती है? यह आवश्यक एन्ट्रापी प्रदान नहीं करना चाहिए?

gpgगैर-सुपर-टॉप-सीक्रेट कीज आदि को जेनरेट करने के लिए इसे रिस्टार्ट किए बिना या रि-एंट्री करने और हर चीज को री-एंटर करने के लिए यह उपयोगी हो सकता है ।


3
/dev/urandomइसके बजाय बस से पढ़ें । क्रिप्टोग्राफिक उपयोग के लिए के /dev/urandomरूप में सुरक्षित है/dev/random , के व्यवहार /dev/randomबुरा डिजाइन है।
गिल्स एसओ- बुराई को रोकना '

1
कैसे स्विच करने के लिए gpg --gen-keyसे /dev/randomकरने के लिए /dev/urandomपुन: प्रारंभ करने के बिना?
वि।

IIRC gpgमें /dev/randomहार्ड-कोडित है। आप अन्य संभावनाओं के बीच, /dev/randomउसी डिवाइस को बनाने के लिए अपना udv कॉन्फ़िगरेशन बदल सकते हैं /dev/urandom
गाइल्स का SO- बुराई पर रोक '

@ गिल्स, इसके लिए अभी भी रीस्टार्टिंग की आवश्यकता होती है gpg --gen-key, इसलिए इसे री-एंडरिंग डेटा इसे इंटरएक्टिवली पूछते हैं (या अधिक कमांड लाइन मापदंडों को निर्दिष्ट करने की तरह अधिक चतुर तरीकों का उपयोग करके)। इसके अलावा सीपीयू समय उत्पन्न करने वाला प्राइम व्होल खो जाता है (जीपीएस एक मिनट काम कर सकता है, कुछ +एसई प्रिंट कर सकता है और फिर अतिरिक्त यादृच्छिक डेटा का अनुरोध कर सकता है)। और यह देता है "चलो वापस जाओ और अन्य मार्ग" महसूस करने के बजाय "चलो एक हथौड़ा लें और इसे आगे मजबूर करें" ...
Vi।

जवाबों:


19

आप लिख सकते हैं /dev/random क्योंकि यह अतिरिक्त रैंडम बाइट्स प्रदान करने के तरीके का हिस्सा है /dev/random, लेकिन यह पर्याप्त नहीं है, आपको सिस्टम को यह भी सूचित करना होगा कि ioctl()कॉल के माध्यम से अतिरिक्त एंट्रॉपी है ।

मुझे अपने स्मार्टकार्ड सेटअप प्रोग्राम के परीक्षण के लिए समान कार्यक्षमता की आवश्यकता थी , क्योंकि मैं अपने माउस / कीबोर्ड के लिए प्रतीक्षा नहीं करना चाहता था gpgताकि प्रत्येक परीक्षण रन के लिए कई कॉल पर्याप्त हो सकें । मैंने जो किया वह पायथन कार्यक्रम को चलाने के लिए है, जो मेरे परीक्षणों के समानांतर है। यह निश्चित रूप से वास्तविक कुंजी पीढ़ी के लिए उपयोग नहीं किया जाना चाहिए gpg, क्योंकि यादृच्छिक स्ट्रिंग बिल्कुल यादृच्छिक नहीं है (सिस्टम से उत्पन्न यादृच्छिक जानकारी अभी भी interleaved होगी)। यदि आपके पास स्ट्रिंग सेट करने के लिए एक बाहरी स्रोत हैrandom , तो आपको उच्च एन्ट्रापी करने में सक्षम होना चाहिए। आप के साथ एन्ट्रापी की जाँच कर सकते हैं:

cat /proc/sys/kernel/random/entropy_avail

कार्यक्रम:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(आपके किए जाने के बाद कार्यक्रम को मारना मत भूलना।)


1
बहुत सरल समाधान का उपयोग करना होगा rngd। यह अधिकांश (सभी?) डिस्ट्रो में एक पैकेज के रूप में उपलब्ध है।
पैट्रिक

4
random = "3420348024823049823-984230942049832423l4j2l42j"देख xkcd.com/221
user253751

@ पैट्रिक मैंने यादृच्छिकता को जोड़ने के लिए कम से कम 3 संभावित समाधानों की कोशिश की, IIRC rngd उनमें से एक था। लेकिन वे बॉक्स से बाहर काम नहीं करेंगे (यह उस समय उबंटू 12.04 सेटअप हो सकता है), और मेरे लिए यह समाधान, कोड की 10 पंक्तियों के साथ, सरल था।
एंथन जूल

@Anthon: एक सनडॉट के रूप में, मुझे xs4all.nl नहीं लगता है क्योंकि मिटनिक ने दशकों पहले कुछ चीजों को स्टोर करने के लिए इसका इस्तेमाल किया था ... :)
woliveirajr

@woliveirajr, मेरा खाता hacktic.nl से 1992 में कहीं और स्थानांतरित हो गया था, मुझे वहाँ रहते हुए कुछ समय हुआ है हालाँकि मैं नीदरलैंड में 20 वर्षों से अधिक समय से नहीं रहा हूँ।
एंथन

14

आमतौर पर, यह कर्नेल डेवलपर्स द्वारा डिज़ाइन किया गया है और इसमें प्रलेखित है man 4 random:

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

1

एंथनी ने पहले ही समझाया कि /dev/randomएन्ट्रापी गिनती को बढ़ाने के लिए लिखने से पता नहीं चलता है कि कैसे RNDADDENTROPY iol (देखें) यादृच्छिक (4) ) को एन्ट्रापी का श्रेय दिया जा सकता है। यह स्पष्ट रूप से सुरक्षित नहीं है, इसलिए यहां एक विकल्प है जब एक हार्डवेयर यादृच्छिक संख्या जनरेटर उपलब्ध है।

निम्नलिखित कार्यान्वयन यादृच्छिकता से 512 बाइट्स (4096 बिट्स) लेते हैं /dev/hwrngऔर इसे एंट्रॉपी पूल में भेजते हैं (बाइट में प्रति एंट्रोपी के 4 बिट्स का श्रेय, यह मेरी तरफ से एक मनमाना विकल्प है)। उसके बाद यह चयन (2) syscall को ब्लॉक करेगा जब एंट्रॉपी पूल भरा हुआ है (दस्तावेज में है यादृच्छिक (4) मैनपेज )।

पायथन संस्करण:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

चूंकि आर्क लिनक्स आइसो में पायथन स्थापित नहीं था, इसलिए यहां एक पर्ल संस्करण भी है:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

यह शायद वही है जो rngd प्रोग्राम ( rng-tools का हिस्सा ) करता है (असत्यापित), सिवाय इसके कि यह उन उपकरणों (Python या Perl) का उपयोग करता है जो पहले से ही उपलब्ध हैं।


यदि आपके पास कोई हार्डवेयर रैंडम नंबर जनरेटर नहीं है, तो आप /dev/urandomइसके बजाय उपयोग कर सकते हैं /dev/hwrngयदि आप पूरी तरह से असुरक्षित यादृच्छिक मूल्यों की परवाह नहीं करते हैं
लेकेनस्टेयिन

हम्म, मुझे पता चला है कि hwrng डिवाइस जरूरत पड़ने पर स्वचालित रूप से एन्ट्रापी उत्पन्न करते हैं, कोई अतिरिक्त आरएनजी या स्क्रिप्ट की आवश्यकता नहीं होती है। हालांकि एक बग है, जब getrandom()4.8-rc1 से अधिक पुराने kernels पर hwrng के साथ syscall का उपयोग किया जाता है जिससे अवरुद्ध व्यवहार होता है। एक वर्कअराउंड read()दो बार करने के लिए है /dev/random, देखें github.com/Lekensteyn/archdir/commit/…
Lekensteyn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.