AVR रैंडम नंबर जेनरेटर


12

मैंने TI ( slaa338 ) से एक अप्पनोट पढ़ा है जो "वास्तविक के लिए" ("छद्म" के विपरीत) यादृच्छिक संख्याओं के निर्माण के लिए एक तकनीक का वर्णन करता है। यह इस लक्ष्य को प्राप्त करने के लिए MSP430 के कुछ विदेशी घड़ी सबसिस्टम का फायदा उठाता है। क्या कोई ऐसी तकनीक के बारे में जानता है जिसे एक AVR पर लागू किया जा सकता है (मैं विशेष रूप से "यादृच्छिक संख्याओं के लिए" उत्पन्न करने के लिए एक्समेगा में विशेष रूप से दिलचस्पी रखता हूं)?


1
पासा के खेल के लिए रैंडम काम करता है। मुझे लगता है कि वह क्रिप्टोग्राफिक रूप से सुरक्षित चाहते हैं।
कोर्तुक

2
क्या आप आवेदन और / या यादृच्छिकता की डिग्री के लिए एक संकेत दे सकते हैं जिसकी आपको आवश्यकता है? यदि यह क्रिप्टोग्राफी के लिए है, तो बीज की गुणवत्ता के अलावा अतिरिक्त विचार भी हैं। पहले से किए गए सुझावों में से कुछ - जैसे आपकी आवश्यकताओं के आधार पर विभिन्न प्रकार के पर्यावरण इनपुटों का नमूना लेना या उपयुक्त नहीं हो सकता है।
विंडेल ऑस्के ज़ूल

जवाबों:


6

एक्समेगा का उपयोग करने के लिए आप कितने बुरे हैं? यदि क्रिप्टो और रैंडम नंबर जेनरेशन आपके प्रोजेक्ट का एक बड़ा हिस्सा है, तो Atmel के SecureAVR सीरीज़ में एक हार्डवेयर रैंडम नंबर बनाया गया है, और इसे क्रिप्टोग्राफ़िक एप्लिकेशन के लिए डिज़ाइन किया गया है।

बावजूद, मुझे संदेह है कि आपको एक यादृच्छिक बीज स्रोत मिलेगा जो एक अच्छा वितरण है। आप इसे कुछ समय बाद एक छद्म यादृच्छिक संख्या जनरेटर के माध्यम से चलाना चाहेंगे। जब तक आप हर बार एक अलग बीज के साथ शुरू करते हैं, यह आपको यादृच्छिक संख्याओं का एक अच्छा सेट देगा। LGC एक त्वरित और आसान छद्म यादृच्छिक जनरेटर है:

static unsigned long Seed; 

/* Call before first use of NextVal */
unsigned long InitSeed()
{
   //Your code for random seed here

   // Correct distribution errors in seed
   NextVal();
   NextVal();
   NextVal();
   return NextVal();
}

 /* Linear Congruential Generator 
  * Constants from  
  * "Numerical Recipes in C" 
  * by way of 
   * <http://en.wikipedia.org/wiki/Linear_congruential_generator#LCGs_in_common_use>
   * Note: Secure implementations may want to get uncommon/new LCG values
  */
unsigned long NextVal()
{
  Seed=Seed*1664525L+1013904223L;
  return Seed;
} 

1
थिस भयानक, मुझे पता नहीं था कि SecureAVR लाइन मौजूद थी, सूचक के लिए धन्यवाद!
विक्टास्कू

BTW: यदि आप वास्तव में सुरक्षा की जरूरत है, सरल, प्रभावी, और तेजी से LCG विधि मैंने प्रस्तुत किया है कि आप क्या चाहते हैं: कई LCG को तोड़ा जा सकता है; बस एक पंक्ति में 2-3 मान प्राप्त करें, और उन्हें एलसीजी जनरेटर में ज्ञात स्थिरांक के एक सेट के साथ प्लग करें - इसमें विकिपीडिया पृष्ठ पर सब कुछ शामिल होगा। एक मिलान पैटर्न हमलावर को यह अनुमान लगाने देगा कि अगला नंबर क्या होगा। यह संभव है (लेकिन कठिन) यह पता लगाने के लिए कि क्या स्थिरांक कुछ भी नहीं हैं, साथ ही साथ।
केविन वर्मर

1
@reemrevnivek FYI करें, Atmel अपनी SecureAVR लाइन को बेच रहा है ... वे अपने ARM-आधारित 32-बिट प्रोसेसर की सलाह देते हैं यदि आप क्रिप्टोग्राफिक सामान चाहते हैं जो AVR से विकास के माहौल के मामले में एक पूरी तरह से अलग बॉलगेम है। उनके पास ट्रू आरएनजी के साथ एक जोड़ी है, हालांकि, शायद मैं किसी दिन उनके साथ खेलूंगा।
vicatcu 21

7

एडीसी को एक हार्डवेयर शोर स्रोत से कनेक्ट करें और यदि आवश्यक हो तो यादृच्छिक संख्याओं को "सफेद" करने के लिए सॉफ़्टवेयर का उपयोग करें।

यहां एवीआर-आधारित परियोजना है जो ऐसा करती है: लियोन मिनी पोर्टेबल रैंडम नंबर जेनरेटर (mPRNG)

क्रिप्टोग्राफिक रूप से सुरक्षित होने की आवश्यकता के आधार पर, आप बाहरी हार्डवेयर के बजाय अपने यादृच्छिकता बीज के रूप में एक ग्राउंड एनालॉग इनपुट या " आंतरिक तापमान सेंसर " के शोर का उपयोग कर सकते हैं ।

अद्यतन : मैंने बाद में Arduino के लिए एक कार्यक्रम लिखा था जो चिप के टाइमर को एक एंट्रोपी स्रोत के रूप में उपयोग करता है (ADC बेकार हो गया क्योंकि शोर बिट्स को काट दिया जाता है), और इसने एंट्रोप लाइब्रेरी के निर्माण को प्रेरित किया ।

दोनों ही मामलों में, यादृच्छिकता से नहीं है, उदाहरण के लिए, तापमान का मूल्य ही है, जो केवल धीरे-धीरे बदलता है, लेकिन कम से कम महत्वपूर्ण बिट्स से , जो यादृच्छिक रूप से एक रीड से अगले तक भिन्न होता है। मैंने पिछले रीड के साथ आउटपुट, बिटशिफ्टिंग और XORing के प्रत्येक बिट के लिए एक बार मूल्य को कई बार पढ़ा। एक असम्बद्ध बिट के साथ वास्तव में यादृच्छिक बिट्स को इकट्ठा करना यादृच्छिकता को बनाए रखता है , इसलिए यादृच्छिकता सभी बिट्स के चारों ओर फैल जाती है और यह सही सफेद शोर बन जाता है। आपकी बिट दर बहुत अधिक नहीं होगी, हालांकि, चूंकि आपको प्रति अधिग्रहण समय या टाइमर चक्र में केवल एक बिट आउटपुट मिलता है। टाइमर विधि के साथ, मुझे लगभग 64 बिट / एस मिल रहा था।


5
(अधिक या कम सच) RNG का नामकरण, "-PRNG" दुर्भाग्यपूर्ण है।
निक टी

ADC के लिए +1, मुझे लगता है कि आप शायद एक ऐसी चीज की तलाश कर रहे हैं जो तापमान संवेदक की तुलना में उच्च आवृत्ति पर बदलती है।
ऑक्टोपस

1
@ ऑक्टोपस वैसे तो आप तापमान को एन्ट्रापी स्रोत के रूप में उपयोग नहीं कर रहे हैं, आप शोरगुल कम से कम महत्वपूर्ण बिट्स का उपयोग कर रहे हैं, जो हर बार जब आप एडीसी पढ़ते हैं तो भी तापमान में परिवर्तन होने पर भी बेतरतीब ढंग से बदल जाएगा। जब मैंने Arduino पर परीक्षण किया, हालांकि, ये बिट्स हमेशा 0 थे, इसलिए यह संभव नहीं था और मुझे इसके बजाय टाइमर भिन्नता का उपयोग करना पड़ा। एक अन्य MCU पर मैंने उस पद्धति का उपयोग किया, ADC के LSBs शोर और प्रयोग करने योग्य थे।
एंडोलिथ

3

एक यादृच्छिक बीज उत्पन्न करने के लिए एक और चाल, एक बाहरी घटना तक घड़ी चक्र की संख्या की गणना करना है। उदाहरण के लिए यदि यह किसी व्यक्ति द्वारा उपयोग किया जाने वाला उपकरण है, तो घड़ी के चक्र की संख्या को तब तक गिनें जब तक कि वह 'गो' बटन को दबा न दे, और यादृच्छिक बीज के रूप में उपयोग करें।


4
यह साइड चैनल हमलों के खिलाफ बहुत सुरक्षित नहीं हो सकता है क्योंकि वे एक डिवाइस के नियंत्रण को सुरक्षित करके तोड़ सकते हैं, लेकिन सभी क्रिप्टोग्राफी के साथ, आवेदन व्यवहार्यता निर्धारित करता है।
कोर्तुक

3

उसी अनुक्रम के साथ पुनः आरंभ नहीं करना सुनिश्चित करने के लिए, मैं इप्रोम में सोमे बाइट का उपयोग करता हूं:

#include <avr/eeprom.h>
#include <stdlib.h> // rand

u16  EEMEM randinit; 

int main(void) {
        srand(eeprom_read_word(&randinit));
        eeprom_write_word(&randinit,rand());
        [...]
 }

यह काफी अच्छा यादृच्छिक देता है, और कार्यक्रम / मेमोरी में ज्यादा खर्च नहीं होता है।


2
यह हर बार बाइट 0 पढ़ता है। आपके पास क्या सबूत है कि यह बाइट यादृच्छिक है? यदि यह है, तो यह एक महान तकनीक है!
केविन वर्मर

यह शब्द (बाइट 0 और 1 वास्तव में) यादृच्छिक होगा, क्योंकि प्रत्येक स्टार्टअप पर मैं सामग्री के साथ यादृच्छिक जनरेटर को इनिशियलाइज़ करता हूँ। जब मैं इसे एक नई रैंड () के साथ अपलोड करता हूं। तो अगला init चालू एक से यादृच्छिक दिखाई देगा ... और इसी तरह ... लेकिन अगर मैं रैंडिनिट को ffff (या 0000?) पर रीसेट करता हूं, तो मेरे पास समान रैंडिनिट अनुक्रम होगा! इसलिए यह सही नहीं है। मैं फ़्यूज़ के बारे में एक चेतावनी भूल गया, जो *
.hex

3

मैंने एक पुस्तकालय बनाया है, जबकि अरुडिनो के लिए डिज़ाइन किया गया मूल एवर पर जी ++ का उपयोग करके सी ++ कार्यान्वयन में एक वर्ग के रूप में अच्छी तरह से काम करता है, वास्तव में इसे हाल ही में एआरएम वास्तुकला में भी चित्रित किया गया है।

यह वॉचडॉग टाइमर और सिस्टम क्लॉक के बीच घबराना का उपयोग करता है और इसे कई अलग-अलग चिप्स (विकी पेज पर प्रलेखित) पर परीक्षण किया गया है

http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy


2

क्या आपने randomSeed () जैसी किसी चीज़ का उपयोग करके देखा है ? - Arduino IDE में उपयोग किया जाता है

आप इस फ़ंक्शन का उपयोग atmel AVR पर एक फ्लोटिंग (फ्री) एनालॉग पिन का नमूना करने के लिए कर सकते हैं, यह तब छद्म यादृच्छिक संख्या फ़ंक्शन के लिए एक मनमाना शुरुआती बिंदु बनाने के लिए मूल्य का उपयोग करता है - यादृच्छिक ()।

रैंडम () द्वारा निर्मित मान एक छद्म यादृच्छिक संख्या हो सकती है - लेकिन रैंडमसाइड () द्वारा बनाई गई मनमाना शुरुआती बिंदु वास्तविक रूप से एक यादृच्छिक संख्या / मान होना चाहिए जितना आप प्राप्त कर सकते हैं।


2
सैंपल पिंस जैसी सैंपलिंग चीजें रैंडम के करीब हैं, लेकिन इनका वितरण भी नहीं होगा। बीज को यादृच्छिक रूप से एक दो बार चलाएं, हालांकि, और यह होगा।
केविन वर्मर

.... एक छद्म यादृच्छिक संख्या जनरेटर के माध्यम से एक युगल ... <- यह कैसे गायब हो गया? एनटीएस: पहले मस्तिष्क को उलझाएं, फिर उंगलियों को।
केविन वर्मर

सटीक रूप से - यह एन्क्रिप्शन / सुरक्षा आदि के लिए उपयोग करने पर भी सबसे सुरक्षित नहीं है, लेकिन यह आपको जेनेरिक संगीत या पासा गेम जैसी किसी चीज़ के लिए एक अच्छा यादृच्छिक नंबर देगा। यह अच्छा है और इसे लागू करना भी आसान है :)
जिम

1

एवीआर हार्डवेयर के साथ इसे कैसे प्राप्त किया जाए, इस पर एक पेपर है । इसमें घड़ी के घबराने पर भरोसा करना शामिल है। असल में, आप एक अलग घड़ी के निचले बिट्स को अलग करने के लिए एक घड़ी स्रोत के आधार पर एक टाइमर अवरोध का उपयोग करते हैं जो एक अलग घड़ी स्रोत से बंद है। दो घड़ियों में उनके साथ कुछ यादृच्छिक घबराहट होगी और नमूना पूरी तरह से आवधिक नहीं होगा।

मैंने STM32 माइक्रोकंट्रोलर पर इस अवधारणा का एक छोटा सा प्रमाण दिया, कोड यहाँ जीथब पर है । यादृच्छिककरण परीक्षण सूट के एक सेट के आधार पर इसे कुछ अच्छे परिणाम मिले।

मेरी राय में, मुझे लगता है कि यह एक एडीसी के साथ फ्लोटिंग पिन का नमूना लेने से बेहतर है जो हमला करने के लिए बेहद आसान है (पिन को जमीन पर बांधें और अब आपका नंबर इतना यादृच्छिक नहीं है!)। मुझे यकीन है कि एक घड़ी घबराना आधारित RNG पर हेरफेर करने का एक तरीका है, लेकिन यह मुझे थोड़ा बेहतर महसूस करता है कि मैं इस शुद्ध रूप से चिप-ऑन आंतरिक घड़ी स्रोतों पर आधारित कर सकता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.