2009-06-19 12 views
26

मैं पाइथन में एक प्रोग्रामर को विंडोज इंस्टालर के माध्यम से वितरित करने के लिए एक प्रोग्राम बना रहा हूं।पायथन में पीजीपी कैसे करें (उत्पन्न कुंजी, एन्क्रिप्ट/डिक्रिप्ट)

कार्यक्रम को उपयोगकर्ता की सार्वजनिक कुंजी से एन्क्रिप्टेड प्रति दिन फ़ाइल डाउनलोड करने और फिर इसे डिक्रिप्ट करने में सक्षम होना चाहिए।

तो मुझे एक पायथन पुस्तकालय खोजने की ज़रूरत है जो मुझे सार्वजनिक और निजी पीजीपी कुंजी उत्पन्न करने देगी, और सार्वजनिक कुंजी के साथ एन्क्रिप्टेड फ़ाइलों को भी डिक्रिप्ट करेगा।

क्या यह कुछ pyCrypto करेगा (दस्तावेज़ीकरण घबराहट है)? क्या अन्य शुद्ध पायथन पुस्तकालय हैं? किसी भी भाषा में एक स्टैंडअलोन कमांड लाइन उपकरण के बारे में कैसे?

मैंने अभी तक जीएनयूपीजी देखा है लेकिन विंडोज़ पर यह इंस्टॉल करना रजिस्ट्री में सामान करता है और हर जगह डीएलएस फेंकता है, और फिर मुझे इस बारे में चिंता करने की ज़रूरत है कि उपयोगकर्ता ने पहले से ही यह इंस्टॉल किया है, कैसे अपनी मौजूदा कीरिंग बैकअप लेना है। मैं सिर्फ एक पाइथन लाइब्रेरी या कमांड लाइन उपकरण और चाबियाँ खुद को चाबियाँ बनाना चाहूंगा।

अद्यतन: पीईएमई काम कर सकता है लेकिन यह पाइथन 2.4 के साथ संगत प्रतीत नहीं होता है जिसे मुझे उपयोग करना है।

उत्तर

24

आपको PyCrypto या PyMe की आवश्यकता नहीं है, ठीक है, हालांकि ये पैकेज हो सकते हैं - आपको विंडोज़ के तहत सभी प्रकार की समस्याएं हो सकती हैं। इसके बजाय, खरगोश-छेद से बचें और मैंने क्या किया? gnupg 1.4.9 का प्रयोग करें। आपको एंड-यूजर मशीनों पर पूर्ण इंस्टॉलेशन करने की आवश्यकता नहीं है - वितरण से gpg.exe और iconv.dll पर्याप्त हैं, और आपको बस पथ में कहीं भी होना चाहिए या पूर्ण पथनाम का उपयोग करके अपने पायथन कोड से एक्सेस करना होगा। रजिस्ट्री में कोई भी परिवर्तन आवश्यक नहीं है, और यदि आप चाहें तो सब कुछ (एक्जिक्यूटिव और डेटा फाइल) को एक फ़ोल्डर में ही सीमित किया जा सकता है।

एक मॉड्यूल GPG.py है जिसे मूल रूप से एंड्रयू कुचलिंग द्वारा लिखा गया था, जिसे रिचर्ड जोन्स द्वारा बेहतर किया गया था और स्टीव ट्रुगॉट द्वारा आगे बढ़ाया गया था। यह here उपलब्ध है, लेकिन जैसा कि यह विंडोज के लिए उपयुक्त नहीं है क्योंकि यह os.fork() का उपयोग करता है। हालांकि मूल रूप से PyCrypto का हिस्सा, यह PyCrypto के अन्य हिस्सों से पूरी तरह से स्वतंत्र है और काम करने के लिए केवल gpg.exe/iconv.dll की आवश्यकता है।

मेरे पास एक संस्करण (gnupg.py) है जो ट्रागॉट के GPG.py से लिया गया है, जो subprocess मॉड्यूल का उपयोग करता है। यह Windows के तहत ठीक काम करता है, कम से कम मेरी प्रयोजनों के लिए - मैं इसका इस्तेमाल निम्न कार्य करें:

  • कुंजी प्रबंधन - पीढ़ी, लिस्टिंग, निर्यात आदि
  • किसी बाहरी स्रोत से आयात कुंजी (जैसे सार्वजनिक कुंजी प्राप्त एक साथी कंपनी से)
  • एन्क्रिप्ट और डेटा को डिक्रिप्ट
  • प्रवेश करें और सत्यापित हस्ताक्षर

मॉड्यूल मुझे मिल गया है अभी दिखाने के लिए आदर्श नहीं है, क्योंकि यह कुछ अन्य सामान जो नहीं होना चाहिए शामिल वहाँ ई - जिसका मतलब है कि मैं इस समय इसे जारी नहीं कर सकता हूं।कुछ बिंदु पर, शायद अगले कुछ हफ्तों में, मैं इसे साफ करने में सक्षम होने की उम्मीद करता हूं, कुछ और यूनिट परीक्षण जोड़ें (उदाहरण के लिए मेरे पास साइन/सत्यापित करने के लिए कोई यूनिट परीक्षण नहीं है) और इसे जारी करें (या तो नीचे मूल PyCrypto लाइसेंस या एक समान वाणिज्यिक-अनुकूल लाइसेंस)। यदि आप प्रतीक्षा नहीं कर सकते हैं, तो ट्रगॉट के मॉड्यूल के साथ जाएं और इसे स्वयं संशोधित करें - यह subprocess मॉड्यूल के साथ काम करने के लिए बहुत अधिक काम नहीं था।

यह दृष्टिकोण दूसरों की तुलना में बहुत कम दर्दनाक था (जैसे SWIG आधारित समाधान, या समाधान जो MinGW/MSYS साथ निर्माण की आवश्यकता होती है) है, जो मैं माना जाता है और साथ प्रयोग किया। मैंने वही उपयोग किया है (gpg.exe/iconv.dll) अन्य भाषाओं में लिखे गए सिस्टम के साथ दृष्टिकोण, उदा। C#, समान रूप से दर्द रहित परिणाम के साथ।

पीएस यह पायथन 2.4 के साथ ही पायथन 2.5 और बाद में काम करता है। अन्य संस्करणों के साथ परीक्षण नहीं किया गया है, हालांकि मुझे किसी भी समस्या का पता नहीं लगा है।

+0

धन्यवाद जो सही लगता है। मुझे नहीं पता था कि मैं सिर्फ जीजीपी से बाहर निकल सकता हूं। यह कीरिंग कहां रखेगा? यदि उपयोगकर्ता पहले से ही जीजीपी स्थापित है तो क्या यह विधि किसी भी समस्या का कारण बन जाएगी? कोई मौका मैं देख सकता था कि आपका कोड कुंजी पीढ़ी कैसे करता है, और महत्वपूर्ण आयात करता है? – Greg

+0

जब भी आप अपना अंतिम कोड जारी करते हैं तो हमें यहां अपडेट करना भी सुनिश्चित करें। – Greg

+0

जब आप gpg कहते हैं, तो पथ निर्दिष्ट करें जहां आप --homedir तर्क का उपयोग करके कीरिंग को छीनना चाहते हैं। (यह आपके लिए पहले से ही ट्रोगॉट के मॉड्यूल का उपयोग कर किया गया है - एक जीपीजी कक्षा है जिसका कन्स्ट्रक्टर एक gnupghome पैरामीटर लेता है जिसे आप इस निर्देशिका में सेट कर सकते हैं।) Pubring.gpg, secring.gpg और trustdb.gpg द्वारा निर्दिष्ट फ़ोल्डर में बनाया गया है - -homedir। मुझे विश्वास नहीं है कि अगर उपयोगकर्ता पहले से ही gpg पहले से स्थापित है तो समस्या का कारण बन जाएगा - - homedir तर्क रजिस्ट्री में किसी भी मान को ओवरराइड करना चाहिए। –

6

पीईजीपीपीओ पीजीपी का समर्थन करता है - यद्यपि आपको यह सुनिश्चित करने के लिए परीक्षण करना चाहिए कि यह आपके विनिर्देशों के लिए काम करता है।

हालांकि प्रलेखन, आने अगर आप util/test.py (मॉड्यूल परीक्षण स्क्रिप्ट) के माध्यम से देखें, तो आप उनके पीजीपी समर्थन का एक अल्पविकसित उदाहरण मिल सकता है के लिए कठिन है:

if verbose: print ' PGP mode:', 
obj1=ciph.new(password, ciph.MODE_PGP, IV) 
obj2=ciph.new(password, ciph.MODE_PGP, IV) 
start=time.time() 
ciphertext=obj1.encrypt(str) 
plaintext=obj2.decrypt(ciphertext) 
end=time.time() 
if (plaintext!=str): 
    die('Error in resulting plaintext from PGP mode') 
print_timing(256, end-start, verbose) 
del obj1, obj2 

इसके अलावा, PublicKey/pubkey.py निम्नलिखित प्रासंगिक तरीकों के लिए प्रदान करता है:

def encrypt(self, plaintext, K) 
def decrypt(self, ciphertext): 
def sign(self, M, K): 
def verify (self, M, signature): 
def can_sign (self): 
    """can_sign() : bool 
    Return a Boolean value recording whether this algorithm can 
    generate signatures. (This does not imply that this 
    particular key object has the private information required to 
    to generate a signature.) 
    """ 
    return 1 
+2

मुझे कुंजी जेनरेट करने का कोई तरीका नहीं दिखाई देता है, या डेटा को एन्क्रिप्ट करने के लिए किसी अन्य पार्टी की सार्वजनिक कुंजी स्वीकार नहीं करता है। कोई विचार? – Greg

+3

नहीं, PyCrypto में MODE_PGP विरासत, प्रयोगात्मक कोड है जो शायद सही काम नहीं करता है। (Https://bugs.launchpad.net/pycrypto/+bug/996814 देखें)। इसका इस्तेमाल न करें। हम इसे जल्द ही PyCrypto से हटा देंगे। – dlitz

+1

फिर आप क्या सुझाव देते हैं, @dlitz? – raylu

2

PyMe अजगर 2.4 के साथ पूर्ण संगतता का दावा करता है, और मैं बोली:

पायमे का नवीनतम संस्करण (इस लेखन के रूप में) v0.8.0 है। डेबियन के लिए अपने द्विआधारी वितरण बड़ा घूँट v1.3.33 और कम से 'अस्थिर' वितरण में प्रदान की GPGME v1.1.6 और अजगर v2.3.5, v2.4.4, और v2.5.2 (के लिए जीसीसी v4.2.3 साथ संकलित किया गया था पहर)। विंडोज के लिए इसका द्विआधारी वितरण बड़ा घूँट v1.3.29 और GPGME v1.1.6 के लिए MinGW v4.1 और अजगर v2.5.2 के साथ संकलित किया गया था (हालांकि एक ही द्विआधारी स्थापित हो जाते हैं और अच्छी तरह से रूप v2.4.2 में ठीक काम करता है) ।

मुझे यकीन नहीं है कि आप क्यों कहते हैं "यह पाइथन 2.4 के साथ संगत प्रतीत नहीं होता है जिसे मुझे उपयोग करना है" - कृपया निर्दिष्ट करें?

और हाँ यह जीपीजीएमई पर सेमी-पायथोनिक (एसडब्ल्यूआईजीडी) रैपर के रूप में मौजूद है - यह एक सी लाइब्रेरी है जो मूल रूप से नौकरी करने के बाद पाइथन एक्सटेंशन विकसित करने का एक लोकप्रिय तरीका है।

PyPgp का एक बहुत ही सरल दृष्टिकोण है - यही कारण है कि यह एक एकल, सरल पायथन लिपि है: मूल रूप से यह कमांड लाइन पीजीपी कमांड के लिए "खोल आउट" से अधिक कुछ नहीं करता है। उदाहरण के लिए, डिक्रिप्शन बस है:

def decrypt(data): 
    "Decrypt a string - if you have the right key." 
    pw,pr = os.popen2('pgpv -f') 
    pw.write(data) 
    pw.close() 
    ptext = pr.read() 
    return ptext 

यानी।, एन्क्रिप्टेड साइफटेक्स्ट को pgpv -f के मानक इनपुट में लिखें, पीजीपीवी के मानक आउटपुट को डिक्रिप्ट किए गए सादे टेक्स्ट के रूप में पढ़ें।

पीईपीजीपी भी एक पुरानी परियोजना है, हालांकि इसकी सादगी का मतलब है कि इसे आधुनिक पायथन (उदाहरण के लिए, अब-बहिष्कृत os.popen2 के बजाय उपप्रोसेसर) के साथ काम करना मुश्किल नहीं होगा। लेकिन आपको अभी भी PGP इंस्टॉल करने की आवश्यकता है, या पीईपीजीपी कुछ भी नहीं करेगा ;-)।

+0

पीईएमई यह मुद्दा था: http://stackoverflow.com/questions/1030297/how-to-make-a-pyme-python-library-run-in-python-2-4-on-windows – Greg

+0

हाँ, थिट दावा मैंने उद्धृत किया है (विंडोज़ के बारे में, विशेष रूप से) खराब स्थापित है (विंडोज़ में, केवल एक्सटेंशन को पायथन के विशिष्ट संस्करणों के लिए संकलित करने की आवश्यकता है, इसलिए 2.4 के लिए संकलित एक 2.4 के लिए काम नहीं करेगा)। आपको बस पुनः संयोजित करना है (जिसके लिए एमएसवीसी 6.0 की आवश्यकता है)। –

3

M2Crypto में पीजीपी मॉड्यूल है, लेकिन मैंने वास्तव में इसका उपयोग करने की कोशिश नहीं की है। यदि आप इसे आज़माते हैं, और यह काम करता है, तो कृपया मुझे बताएं (मैं वर्तमान M2Crypto रखरखावकर्ता हूं)। कुछ लिंक:

अद्यतन: पीजीपी मॉड्यूल तरीकों कुंजी उत्पन्न करने के लिए प्रदान नहीं करता है, लेकिन शायद इन निचले स्तर RSA के साथ बनाया जा सकता है , DSA आदि मॉड्यूल। मुझे पता नहीं है कि पीजीपी अंदरूनी है, इसलिए आपको विवरण खोदना होगा। साथ ही, यदि आप जानते हैं कि openssl कमांड लाइन कमांड का उपयोग करके इन्हें कैसे उत्पन्न किया जाए, तो इसे M2Crypto कॉल में कनवर्ट करना उचित रूप से आसान होना चाहिए।

+0

हम्म, यह आशाजनक लग रहा था लेकिन मुझे नहीं लगता कि कुंजी कैसे उत्पन्न करें। – Greg

+0

आप निचले स्तर के आरएसए, डीएसए आदि मॉड्यूल के साथ चाबियाँ उत्पन्न करने में सक्षम हो सकते हैं। –

2

जैसा कि अन्य ने ध्यान दिया है, पीईएमई इसके लिए कैननिकल समाधान है, क्योंकि यह जीपीजीएमई पर आधारित है, जो जीएनयूपीजी पारिस्थितिक तंत्र का हिस्सा है।

Windows के लिए, मैं दृढ़ता से, GnuPG वितरण के रूप में Gpg4win उपयोग करने के लिए दो कारणों के लिए सलाह देते हैं:

यह GnuPG 2, जो अन्य बातों के अलावा, gpg2.exe है, जो (अंत में, मैं जोड़ सकते हैं कर सकते हैं शामिल हैं पर आधारित है:) gpg-agent.exe ऑन-डिमांड शुरू करें (gpg v1.x नहीं कर सकता)।

और दूसरा, यह जीएनयूपीजी डेवलपर्स द्वारा निर्मित एकमात्र आधिकारिक विंडोज़ है। जैसे यह लिनक्स से विंडोज तक पूरी तरह से संकलित है, इसलिए इसे तैयार करने में गैर-मुक्त सॉफ़्टवेयर का आईओटा उपयोग नहीं किया गया था (सुरक्षा सूट के लिए काफी महत्वपूर्ण :)।

1

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

import pgpy 
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>) 
key,_ = pgpy.PGPKey.from_file(<path to your private key>) 
with key.unlock(<your private key passpharase>): 
    print (key.decrypt(emsg).message) 

हालांकि सवाल बहुत पुराना है। मुझे उम्मीद है कि यह भविष्य के उपयोगकर्ताओं की मदद करेगा।

+0

जानकारी के लिए धन्यवाद। क्या यह वास्तव में सार्वजनिक कुंजी का उपयोग करके एन्क्रिप्शन कर सकता है? इसके अलावा, पैकेज के लिए एक लिंक शायद मददगार हो सकता है। – lazyList

+0

@lazyList यहां देखें: https://github.com/SecurityInnovation/PGPy –

+0

धन्यवाद @ रोई अनुयार। पीजीपी आधारित पासवर्ड सुरक्षा कार्यक्रम बनाने के लिए पहले से ही इसका इस्तेमाल किया गया है। मदद की सराहना करें। – lazyList