2015-05-27 4 views
6

मुझे सी ++ 11 में क्रिप्टोग्राफ़िक रूप से सुरक्षित यादृच्छिक डेटा जेनरेट करने की आवश्यकता है और मुझे चिंता है कि सभी डेटा के लिए random_device का उपयोग करके प्रदर्शन को गंभीर रूप से सीमित कर दिया जाएगा (स्टीफन टी। Lavavej के "rand() Considered Harmful" की स्लाइड 23 देखें, जहां वह कहता है कि जब वह इसका परीक्षण किया गया (उसकी प्रणाली पर), random_device 1.93 एमबी/एस था और mt19937 49 9 एमबी/एस था) क्योंकि यह कोड मोबाइल उपकरणों (जेएनआई और आईओएस के माध्यम से एंड्रॉइड) पर चल रहा है जो शायद ऊपर की संख्या से धीमे हैं।क्या मैं शोधन के साथ random_device और mt19937 के संयोजन से क्रिप्टोग्राफ़िक रूप से सुरक्षित यादृच्छिक डेटा उत्पन्न कर सकता हूं?

इसके अलावा मुझे पता है कि mt19937 क्रिप्टोग्राफी द्वारा सुरक्षित नहीं है हूँ, wikipedia से: "MT19937 के मामले में पुनरावृत्तियों की एक पर्याप्त संख्या (624 का अवलोकन करने के बाद से इस जहाँ से भविष्य पुनरावृत्तियों उत्पादित कर रहे हैं राज्य वेक्टर के आकार है) किसी को भविष्य के पुनरावृत्तियों की भविष्यवाणी करने की अनुमति देता है "।

उपर्युक्त सभी सूचनाओं को ध्यान में रखते हुए, क्या मैं mt19937 के प्रत्येक 624 पुनरावृत्तियों random_device से एक नया यादृच्छिक बीज उत्पन्न करके क्रिप्टोग्राफ़िक रूप से सुरक्षित यादृच्छिक डेटा उत्पन्न कर सकता हूं? या (संभवतः) बेहतर अभी तक, प्रत्येक एक्स पुनरावृत्तियों जहां एक्स एक यादृच्छिक संख्या है (random_device या mt19937 से random_device द्वारा बीजित) 1 और 624 के बीच?

+1

'random_device' को भी गैर-निर्धारक होने की आवश्यकता नहीं है, इसलिए मुझे लगता है कि यह एक बहुत अच्छा विचार नहीं है। यदि आपको वास्तव में गैर-निर्धारिती डेटा की आवश्यकता है, तो ओएस ऑफ़र जो भी क्रिप्टो एपीआई का उपयोग करना संभवतः जाने का तरीका है। – Praetorian

+0

@Praetorian आईओएस पर, एलएलवीएम/dev/urandom का उपयोग स्रोत के रूप में करता है जो [इस] के अनुसार क्रिप्टोग्राफ़िक रूप से सुरक्षित होने की गारंटी है (https://www.apple.com/br/ipad/business/docs/iOS_Security_Oct12.pdf) (पेज 7)। एंड्रॉइड पर, जीसीसी या तो/dev/random// dev/urandom का स्रोत के रूप में उपयोग करता है, इसलिए मैं ओपनएसएसएल और अन्य द्वारा उपयोग किए जाने वाले "/ dev/random" के साथ प्रारंभ करना चुन सकता हूं और गारंटी देता हूं (एंड्रॉइड की सर्वोत्तम क्षमता के लिए) कि यह गैर-निर्धारक –

+2

है यदि आप जानते हैं कि प्राथमिकता 'random_device' के स्रोत एक सीएसपीआरएनजी के रूप में उपयोग के लिए उपयुक्त हैं, तो जाहिर है कि यह एक उपयुक्त विकल्प है। लेकिन मैं अभी भी आपके 'mt19937' विचार से सावधान रहूंगा। जब क्रिप्टोग्राफी की बात आती है तो एक साधारण नियम होना चाहिए, जब तक कि आप इस क्षेत्र में एक विशेषज्ञ न हों, हमेशा कुछ स्पष्ट रूप से चालाक करने पर मौजूदा सिद्ध समाधान पसंद करते हैं। वास्तव में उपन्यास विचार के साथ आने की तुलना में कुछ खराब करने की संभावना बहुत अधिक है। क्या आपने अपने विचार के थ्रूपुट का परीक्षण किया है? 'mt19937' में राज्य के 19937 बिट्स हैं, इसलिए अक्सर शोधन' random_device' से बेहतर प्रदर्शन नहीं कर सकता है – Praetorian

उत्तर

6

ऐसा मत करें। गंभीरता से, बस मत करो। यह सिर्फ परेशानी के लिए नहीं पूछ रहा है - यह सबसे खतरनाक शहर के सबसे अपराध-भरे हुए हिस्से में जाकर परेशानी के लिए पूछना और भीख मांगना है, जिसमें कई क़ीमती सामान हैं।

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

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

इसमें कई फायदे हैं। सबसे पहले, यह एक एल्गोरिदम का उपयोग करता है जिसका वास्तव में अध्ययन किया जाता है, और आमतौर पर काफी सुरक्षित माना जाता है। दूसरा, इसका मतलब है कि आपको केवल सिस्टम के लिए "कुंजी" के रूप में एक (काफी छोटा) यादृच्छिक संख्या वितरित करने की आवश्यकता है। तीसरा, यह शायद बेहतर थ्रूपुट देता है। Intel's और (प्रतीत होता है) independent tests थ्रूपुट की एक श्रृंखला दिखाता है जो आप कम अंत में एमटी 19937 के लिए उद्धृत कर रहे हैं और शीर्ष छोर पर लगभग 4-5 गुना तेजी से प्रतिस्पर्धा शुरू करते हैं। जिस तरीके से आप इसका उपयोग कर रहे हैं, उसे देखते हुए, मुझे उम्मीद है कि आप परिणाम दिखाने के लिए परिणाम प्राप्त करेंगे (और संभवतः से भी अधिक)।

नीचे पंक्ति: काउंटर मोड में एईएस स्पष्ट रूप से समस्या के लिए एक बेहतर समाधान है। सबसे अच्छा आप उम्मीद कर सकते हैं कि एमटी 19937 जितनी तेजी से और सुरक्षित के करीब है। हकीकत में, यह शायद उन उम्मीदों को निराश कर देगा, और धीमे और काफी कम सुरक्षित दोनों को खत्म कर देगा।


1. यह उन परिणामों कैसे पार कर जाएगा? वे निस्संदेह थोक डेटा एन्क्रिप्ट करने के आधार पर हैं - यानी, रैम से डेटा के ब्लॉक को पढ़ने, इसे एन्क्रिप्ट करने और परिणाम को रैम पर वापस लिखना। आपके मामले में, आपको राम से परिणाम पढ़ने की आवश्यकता नहीं है - आपको केवल सीपीयू में लगातार संख्याएं उत्पन्न करना है, उन्हें एन्क्रिप्ट करना है, और परिणाम लिखना है।

5

संक्षिप्त उत्तर है, नहीं, आप नहीं कर सकते हैं। क्रिप्टोग्राफिक रूप से सुरक्षित आरएनजी की आवश्यकताएं बहुत कड़े हैं, और यदि आपको यहां यह प्रश्न पूछना है, तो आप उन आवश्यकताओं के बारे में पर्याप्त रूप से अवगत नहीं हैं।जैरी कहते हैं, यदि आपको दोहराने की आवश्यकता है, तो एईएस-सीटीआर एक विकल्प है। एक अन्य विकल्प, जो दोहराने की अनुमति नहीं देता है, आपके सिस्टम के लिए यारो या Fortuna के कार्यान्वयन की तलाश करेगा। आम तौर पर लाइब्रेरी में सीएसआरएनजी को खुद को रोल करने के बजाय यह बेहतर होता है। लाइब्रेरी लेखकों एक अच्छे सीएसआरएनजी के लिए आवश्यकताओं के बारे में पर्याप्त रूप से अवगत हैं।

संबंधित मुद्दे

 संबंधित मुद्दे