2012-06-10 19 views
7

में सार्वजनिक/निजी कुंजी का आदान-प्रदान करें मेरे पास केवल आरएसए के बारे में कुछ प्राथमिक सैद्धांतिक ज्ञान है।पीकेसीएस # 1 ओएईपी एन्क्रिप्शन/डिक्रिप्शन

अभ्यास में इसका उपयोग करने के तरीके के बारे में विभिन्न स्रोतों को पढ़ने के दौरान, ऐसा लगता है कि पीकेसीएस # 1 ओएईपी एक अच्छी बात होगी।

एक परीक्षण कार्यान्वयन के लिए, मैं PyCrypto के साथ पायथन का उपयोग करता हूं। जैसे this पीकेसीएस # 1 ओएईपी का उपयोग कर एक उदाहरण है।

सार्वजनिक कुंजी का उपयोग करके एन्क्रिप्ट करना और फिर निजी कुंजी का उपयोग करके डिक्रिप्ट करना ठीक काम करता है। जैसे जनता व्यक्तिगत कुंजी के साथ व्यक्ति एक्स को कुछ डेटा भेज सकती है।

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

जब मैं सार्वजनिक कुंजी का उपयोग करके डिक्रिप्ट करने का प्रयास करता हूं तो PyCrypto शिकायत करता है।

PyCrypto स्रोत कोड को पढ़ने, _RSAKey._decrypt समारोह (here) में से ऐसा प्रतीत होता कुंजी वस्तु ही जानता है कि अगर यह निजी या सार्वजनिक कुंजी है और (मेरे आश्चर्य, फिर से मेरी बहुत ही बुनियादी आधार पर करने के लिए उन दोनों के बीच अलग है आरएसए समझ)।

वहां से, ऐसा लगता है कि मैं डिक्रिप्ट फ़ंक्शन को हैक कर सकता हूं ताकि यह सार्वजनिक कुंजी का उपयोग कर सके। या कुछ हद तक अलग: मैं मुख्य वस्तुओं में सार्वजनिक एक्सपोनेंट e और निजी एक्सपोनेंट d का आदान-प्रदान कर सकता हूं।

लेकिन ऐसा लगता है कि इसका उपयोग इस तरह से किया/हैक करने का इरादा नहीं है। तो मैं यहां अपनी गलतफहमी के बारे में पूछना चाहता था।

इसके अलावा, बस जिज्ञासा से बाहर, मैं कुछ कुंजियों (RSA.generate(2048)) उत्पन्न और n, e और d को देखा। सभी मामलों में, n और d बहुत विशाल था जबकि e सभी मामलों में निरंतर (65537) (मुझे उम्मीद नहीं थी)।

मुझे लगता है कि मुझे वास्तव में e और d का आदान-प्रदान नहीं करना चाहिए।

तो मुझे लगता है कि मुझे PKCS1_PSS जैसे हस्ताक्षर के लिए किसी अन्य विधि का उपयोग करना चाहिए।


एनक्रिप्टिंग/decrypting के लिए कुछ कोड, अगर कोई रुचि रखता है: (। binstruct एक छोटे से मॉड्यूल जो सांकेतिक शब्दों में बदलना कर सकते हैं/डिकोड पेड़ डेटा संरचना है - JSON/BSON के समान)

def randomString(l): 
    import random 
    return ''.join(chr(random.randint(0, 0xFF)) for i in range(l)) 

def genkeypair(): 
    from Crypto.PublicKey import RSA 
    key = RSA.generate(2048) 
    pubkey = key.publickey().exportKey("DER") 
    privkey = key.exportKey("DER") 
    return (pubkey,privkey) 

def encrypt(v, rsapubkey): 
    from Crypto.PublicKey import RSA 
    rsakey = RSA.importKey(rsapubkey) 
    from Crypto.Cipher import PKCS1_OAEP 
    rsa = PKCS1_OAEP.new(rsakey) 
    import binstruct 
    from array import array 
    aeskey = randomString(32) 
    iv = randomString(16) 
    from Crypto.Cipher import AES 
    aes = AES.new(aeskey, AES.MODE_CBC, iv) 
    data = binstruct.varEncode(v) 
    data += array("B", (0,) * (-len(data) % 16)) 
    out = binstruct.strEncode(rsa.encrypt(aeskey + iv)) 
    out += array("B", aes.encrypt(data)) 
    return out 

def decrypt(stream, rsaprivkey): 
    from array import array 
    from StringIO import StringIO 
    if isinstance(stream, array): stream = stream.tostring() 
    if isinstance(stream, str): stream = StringIO(stream) 
    from Crypto.PublicKey import RSA 
    rsakey = RSA.importKey(rsaprivkey) 
    from Crypto.Cipher import PKCS1_OAEP 
    rsa = PKCS1_OAEP.new(rsakey) 
    import binstruct 
    aesdata = binstruct.strDecode(stream) 
    aesdata = rsa.decrypt(aesdata) 
    aeskey = aesdata[0:32] 
    iv = aesdata[32:] 
    from Crypto.Cipher import AES 
    aes = AES.new(aeskey, AES.MODE_CBC, iv) 
    class Stream: 
     buffer = [] 
     def read1(self): 
      if len(self.buffer) == 0: 
       nextIn = stream.read(16) 
       self.buffer += list(aes.decrypt(nextIn)) 
      return self.buffer.pop(0) 
     def read(self, n): 
      return "".join([self.read1() for i in range(n)]) 
    v = binstruct.varDecode(Stream()) 
    return v 

यही वह जगह है जहां मैंने सोचा था कि मैं निजी कुंजी के साथ encrypt और सार्वजनिक कुंजी के साथ decrypt का भी उपयोग कर सकता हूं।


(उम्मीद है कि) सही पर हस्ताक्षर/प्रमाणीकरण के साथ अंतिम कार्यान्वयन here in binstruct पाया जा सकता है।

+0

"जब मैं सार्वजनिक कुंजी का उपयोग करके डिक्रिप्ट करने का प्रयास करता हूं तो पीईक्रिप्टो शिकायत करता है"। कृपया अधिक विशिष्ट हो, और कृपया अपना कोड दिखाएं। –

+0

@ ग्रेग्स: यह '_RSAKey._decrypt' में' TypeError ("कोई निजी कुंजी") उठाता है। जैसा कि आप लिंक किए गए कोड से देख सकते हैं। वही तो मैंने कहा। ऐसा लगता है कि इसे डिक्रिप्टिंग में निजी कुंजी की आवश्यकता है। – Albert

+0

यदि आपके पास केवल क्रिप्टोग्राफी का प्राथमिक ज्ञान है, तो यह एपीआई का उपयोग उन तरीकों से करने के लिए नहीं करता है, जिनका उपयोग नहीं किया जाना चाहिए। मुझे 10 साल का अनुभव मिला है और यहां तक ​​कि मैं बहुत सावधान हूं जब मैं क्रिप्टोग्राफिक पुस्तकालयों का उपयोग उन तरीकों से कर रहा हूं जिनके बारे में मुझे नहीं माना जाता है - और मैं ऐसा करने के लिए इतना संभव प्रयास करने से बचने की कोशिश करता हूं। –

उत्तर

15

सार्वजनिक और निजी कुंजी की भूमिकाओं को बदलने के बारे में आपकी सामान्य समझ सही है। अंत में, आरएसए तथ्य पर आधारित है कि

m^(ed) congruent m (mod n) 

आम तौर पर किस RSA एन्क्रिप्शन शीर्षक है आम तौर पर आपरेशन

m^e mod n, 

ई-वें शक्ति जहां ई सार्वजनिक कुंजी है करने के लिए संदेश ला रहा है ।

डिक्रिप्शन तो

(m^e)^d mod n, 

घ निजी कुंजी होने के साथ डी-वें सत्ता में एन्क्रिप्टेड संदेश को ऊपर उठाने के लिए है। अब क्योंकि घातांक और तथ्य यह है कि गुणा विनिमेय है के नियमों के (ये अभी भी मॉड्यूलर अंकगणितीय में पकड़) हम चाहते हैं कि

m congruent (m^e)^d congruent m^(ed) congruent m^(de) congruent (m^d)^e, 

है और इसलिए आप एक ही परिणाम प्राप्त अगर तुम उलटे क्रम में संचालन लागू होते हैं।

आप यह मानने में सही थे कि उलटा डिजिटल हस्ताक्षर की ओर जाता है, क्योंकि सभी लोग सार्वजनिक कुंजी ई के साथ हस्ताक्षर ("डिक्रिप्ट") सत्यापित कर सकते हैं, इसलिए संदेश केवल प्रामाणिक था अगर यह "एन्क्रिप्टेड" (हस्ताक्षरित) था संबंधित निजी कुंजी डी।

यह पता चला है के रूप में, PyCrypto केवल यहाँ एक के लिए दूसरे भूल से रोकने के लिए कोशिश कर रहा है जो OpenSSL या रूबी OpenSSL आप for example दोनों ऐसा करने की अनुमति: public_encrypt/public_decrypt और private_encrypt/private_decrypt।

सिद्धांत के लिए बहुत कुछ, अब क्यों एक अच्छा कारण है कि आप उन्हें एक दूसरे के लिए उपयोग न करने दें। जो मैंने अभी वर्णित किया है उसे अक्सर "पाठ्यपुस्तक आरएसए" के रूप में जाना जाता है और यह अभी भी सुरक्षित होने से बहुत दूर है। अभ्यास में उपयोग करने योग्य परिणाम बनाने के लिए अतिरिक्त चीजों की देखभाल की जानी चाहिए। और यही कारण है कि PyCrypto में एक समर्पित signature package है - यह आपके द्वारा वर्णित प्रभावी ढंग से करता है, लेकिन साथ ही मैंने जो चीजों का उल्लेख किया है उसका भी ख्याल रखता है। हालांकि यह समझने के लिए अच्छा है कि ये चीजें कैसे काम करती हैं, हमें हमेशा इस तरह के पैकेजों का अभ्यास करना चाहिए क्योंकि वे पहले से ही गलतियों को बनाते हैं और तय करते हैं जो हम शायद खुद को घुमाने पर पेश करेंगे।

ई क्यों हमेशा 65537 है। यह वास्तव में एक निश्चित मूल्य नहीं होना चाहिए, लेकिन इसे सामान्य रूप से संभवतः अपने बाइनरी प्रतिनिधित्व में कम से कम 1 के साथ बहुत कम संख्या के रूप में चुना जाता है (65537 10001 है) । अतीत में, ई = 3 या ई = 17 भी चुने गए थे, लेकिन अभ्यास में सुरक्षित नहीं माना जाता था क्योंकि उन्हें सिफरटेक्स्ट की तीसरी या 17 वीं जड़ ले कर हमला किया जा सकता था। यदि ई = 3 और एम = 3, तो 3^3 27 है, और यह पता लगाने के लिए कोई प्रतिभा नहीं है कि एम 3 है क्योंकि सिफरटेक्स्ट 27 है, मॉड्यूलस एन (जो आमतौर पर बहुत बड़ा होता है) के बावजूद। तो खतरे इस तथ्य में निहित है कि सिफरटेक्स्ट, एक्सपोनेंटिएशन के बाद भी, "मॉड्यूलस सीमा" को पार नहीं करता है और इसलिए हमें मूल संदेश पर पहुंचने के लिए ई-वें रूट लेने की अनुमति देता है। 1024 - 4096 बिट्स के सामान्य मॉड्यूल के साथ, यह अब ई = 65537 के साथ कोई समस्या नहीं है।

बाइनरी प्रतिनिधित्व में कुछ 1 एम^ई फास्ट कंप्यूटिंग के लिए भी अच्छे हैं। मॉड्यूलर एक्सपोनेंटिएशन को अक्सर Multiply and Square एल्गोरिदम का उपयोग करके कार्यान्वित किया जाता है, और प्रदर्शन कुछ ई के साथ छोटे ई के लिए सबसे अच्छा है। यह इस तरह क्यों चुना जाता है, न कि दूसरे तरीके से, उदाहरण के लिए कुछ कम के साथ एक छोटा सा डी है? शुरुआत के लिए, डी इस तरह अनुमान लगाना आसान होगा। दूसरा फायदा यह है कि डिजिटल हस्ताक्षर के साथ, आप आमतौर पर एक बार दस्तावेज़ पर हस्ताक्षर करते हैं लेकिन इसे अक्सर सत्यापित करते हैं। इसका मतलब है कि एम^डी एक बार किया जाता है लेकिन एम^ई अक्सर होता है, इसलिए आपके पास सामान्य कार्य सबसे अच्छा प्रदर्शन होता है जबकि दुर्लभ कार्य को खराब करने की अनुमति दी जाती है।

संपादित करें:

आप से पूछा कि क्या मैं आगे क्या आरएसए-PSS जैसी योजनाओं के क्रम में करने के सुरक्षित होने के लिए समझा सकता है।

जब की तुलना क्या OAEP पीएसएस हस्ताक्षर के लिए क्या करता है एन्क्रिप्शन के लिए करता है और दो सुंदर समान लग रहे हो। और वास्तव में वे कर रहे हैं, वे दोनों प्रक्रिया है, जो कुछ मान्यताओं के तहत OAEP और PSS का साध्य सुरक्षा के लिए अनुमति देता है में यादृच्छिकीकरण परिचय। मुझे उपयोगी होने के लिए यह paper भी मिला। प्रावधान सुरक्षा पुराने स्कूल पीकेसीएस 1.5 एन्क्रिप्शन और हस्ताक्षरों पर एक बड़ा फायदा है, जिसे समान धारणाओं के तहत सिद्ध रूप से सुरक्षित नहीं दिखाया जा सकता है (मुख्य बिंदु: कोई निर्धारिक योजना नहीं हो सकती है, यादृच्छिकरण आवश्यक है)। प्रस्तावित हस्ताक्षर और एन्क्रिप्शन योजनाओं के बीच एक स्पष्ट अंतर यह है कि हस्ताक्षर योजनाएं हमेशा पहले हस्ताक्षर किए जाने वाले हस्ताक्षरित संदेश को अनिवार्य करती हैं। यह न केवल दक्षता के संबंध में समझ में आता है, बल्कि यह कुछ हमलों को भी रोकता है जो अन्यथा संभव हो सकते हैं। और मुझे लगता है कि हमें एन्क्रिप्शन के लिए हस्ताक्षर और एन्क्रिप्शन योजनाओं के लिए हमेशा हस्ताक्षर योजनाओं का उपयोग क्यों करना चाहिए: प्रस्तावित योजनाएं सुरक्षा प्रमाणों से जुड़ी हैं, हमारी हस्तनिर्मित योजनाएं नहीं हैं।

cryptographers हम में से जीवन मात्र मनुष्यों आसान बनाने के लिए उन योजनाओं का आविष्कार - वे हमें उपकरण है कि आदर्श नहीं दुरुपयोग या दुरुपयोग के लिए एक न्यूनतम करने के लिए विकल्पों की संख्या कम के लिए अनुमति देते हैं। उदाहरण के लिए, भले ही आप आरएसए-ओएईपी का उपयोग करके एक अच्छी हस्ताक्षर योजना के साथ आने में कामयाब रहे, भले ही इसका उपयोग करने वाले किसी व्यक्ति को यह पता न हो कि हस्ताक्षर लागू करने से पहले उन्हें अपने संदेश क्यों पहले रखना चाहिए। उस प्रकार का दुरुपयोग आरएसए-पीएसएस के साथ भी एक संभावना नहीं है।

तुम भी कुछ अच्छा पठन सामग्री के बारे में पूछा। अभी भी एक क्लासिक और लायक पढ़ने -

  • Applied Cryptography:

    व्यावहारिक पक्ष: हालांकि यह एक बहुत ही व्यक्तिपरक विषय है, मैं वास्तव में इन का आनंद लिया। कुछ सुरक्षा लोग कहते हैं कि यह खतरनाक है क्योंकि इससे लोगों को विश्वास होता है कि वे अपने स्वयं के क्रिप्टो लिखने के लिए पर्याप्त जानते हैं। लेकिन मुझे लगता है कि हम सभी बड़े हो गए हैं, है ना?

  • Cryptography Engineering - कुछ अच्छी व्यावहारिक सलाह है और क्रिप्टोग्राफी कोड को लागू करते समय चेतावनी का उल्लेख भी करना अभी भी बहुत अच्छा है।

  • Handbook of Applied Cryptography - यह मुफ़्त है और अभी भी विशेष रूप से कार्यान्वयन के संबंध में अच्छी सलाह के एक बहुत है।

सैद्धांतिक पक्ष:

  • Modern Cryptography - यह सिद्धांत और व्यवहार के बीच एक संकर है और अंतर्दृष्टि बातें व्यवहार में गलत हो सकता है कि कैसे की एक बहुत कुछ है।

  • Cryptography - Theory and Practice - यह मेरे लिए एक गेम परिवर्तक था, मैं प्यार इस पुस्तक को प्यार करता हूं। यदि आपने केवल एक पुस्तक पढ़ी है, तो इसे एक होने दें :)

  • Introduction to Modern Cryptography - "आधुनिक दृष्टिकोण" और सुरक्षा प्रमाण वास्तव में कैसे काम करते हैं और किस धारणा के तहत एक महान काम करता है।

  • Foundations of Cryptography I&II - यदि पिछली पुस्तक के बाद भी आप एक तरफा कार्यों और दोस्तों के सिद्धांत को पर्याप्त नहीं प्राप्त कर सकते हैं, तो यह आपकी पुस्तक है। बहुत तकनीकी

सुरक्षा केवल क्रिप्टोग्राफी नहीं है:

  • Security engineering - कई उदाहरण कैसे ध्वनि सिद्धांतों व्यवहार में गलत हो सकता है

  • Information Security - सुरक्षा इंजीनियरिंग के समान, एक दायरे में illustrating सुरक्षा सिर्फ क्रिप्टोग्राफी से बड़ा है।

इसके अलावा, मैं नए हमलों, प्रौद्योगिकी आदि मैंने पाया r/netsec बहुत उपयोगी है, साथ ही निम्न ट्विटर पर शोधकर्ताओं और चिकित्सकों, वे पोस्ट दिलचस्प सामग्री नियमित रूप से के बारे में हाल के कागजात पढ़कर तारीख तक रखने की कोशिश ।

अंत में, यदि आपके पास समय है, तो Coursera और Udacity पर क्रिप्टोग्राफी पाठ्यक्रम लें! मुझे लगता है कि वे अगले कुछ हफ्तों में शुरू हो जाएंगे, वे वास्तव में महान हैं, मुझे यकीन है कि आपको पछतावा नहीं होगा। उनके पास बहुत सारे व्यावहारिक अभ्यास थे जो बहुत मजेदार और अच्छी तरह से क्रिप्टोग्राफी कार्यान्वयन पर हमला करने के विभिन्न तरीकों को चित्रित करते हैं।

+1

धन्यवाद, बहुत मददगार! - "अतिरिक्त चीजों की देखभाल करने की आवश्यकता है [..]। [हस्ताक्षर पैकेज] अतिरिक्त रूप से मैंने जो चीजों का उल्लेख किया है उसका ख्याल रखता है"। मुझे लगता है कि आपने उन चीजों का स्पष्ट रूप से उल्लेख नहीं किया है या मैं उन्हें नहीं मिला। क्या अतिरिक्त चीजें हैं? एसएसपी, हस्ताक्षर के लिए आरएसएएसएसए-पीएसएस का उपयोग क्यों करें और आरएसईईएस-ओएईपी (निजी कुंजी का उपयोग करके एन्क्रिप्ट करना) क्यों नहीं? - क्या आप व्यावहारिक उपयोग के लिए कुछ सैद्धांतिक पाठ्यपुस्तक आरएसए ज्ञान से कैसे प्राप्त करें, इसके बारे में कुछ और पढ़ने के स्रोतों की सिफारिश कर सकते हैं? (क्योंकि अधिकांश पुस्तकालयों के लिए भी, मैं ज्यादातर मामूली उदाहरण देखता हूं।) – Albert

+0

@ अल्बर्ट मैंने अपना जवाब अपडेट किया, उम्मीद है कि मदद करता है? – emboss

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