8

के साथ गैर-बख्तरबंद पीजीपी फ़ाइलें डिक्रिप्ट करें मैं एक नोड एप्लिकेशन पर काम कर रहा हूं जिसमें मैंने एक डिक्रिप्टर फ़ंक्शन बनाया है, और इस काम को करने के लिए Openpgp.js npm मॉड्यूल का उपयोग किया है। मैं अपनी सार्वजनिक कुंजी के साथ बनाई गई विभिन्न सबमिट की गई पीजीपी क्लाइंट फाइलों में लेता हूं, उन्हें अपनी निजी कुंजी का उपयोग करके इन्हें डिक्रिप्ट करता हूं, और मेरे लिए एक फ़ोल्डर में डिक्रिप्ट किए गए संस्करणों को स्थानांतरित करता है, और सब कुछ ठीक लगता है .... लंबे समय तक क्योंकि फाइल बख्तरबंद हैं। यहाँ घटनाओं के आदेश दिखा कोड के कुछ नमूना पंक्तियां हैं:OpenPGP.js

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8') 
openpgp.decrypt({ 
     message: openpgp.message.readArmored(encryptedData), 
     publicKeys, 
     privateKey 
}).then((decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data }) 

एक बख़्तरबंद फ़ाइल के माध्यम से आता है, सब कुछ ठीक है और मैं निर्दिष्ट फ़ोल्डर में decrypted फ़ाइल मिलता है। जब एक पाठ संपादक में खोला इन फ़ाइलों को इस के प्रारूप में हैं:

-----BEGIN PGP MESSAGE----- 
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6 
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82 

हालांकि, हम ग्राहकों है कि बख़्तरबंद विकल्प बंद के साथ फ़ाइलें एन्क्रिप्ट है, इसलिए वे जब एक पाठ संपादक में खोला एक hexidecimal प्रकार प्रारूप में आते हैं। ...

7403 436d e6c0 f941 daac 945b 9a81 f066 
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c 
a941 99a8 1053 ae23 f88b 245c f709 c2b2 

..... या के रूप में एन्कोडेड पाठ फ़ाइलें, जो इस तरह दिखेगा:

DµÉ‰í+�3K€Ð�˜PªeZ_|Ò®ó0��ãZqRµ3!ŒpuÉW�NZrìÚk´ 
Aˆ›œiêø8�Ú�ól:äΟ”�6‡) 
w�¬ÌŒWÝÚ¢�Q��œ�œ?�H¨¿�œ//�ÃBA�´>(%°�e� 

(ये पिछले दो सदृश मैं क्या देखते हैं जब मैं ऊपर सांत्वना लॉग ऑन "encryptedData" मेरा कोड ई उदाहरण।)

जब भी कोई गैर-बख्तरबंद फ़ाइलें आती हैं, प्रक्रिया विफल हो जाती है और मुझे शुरुआत में दिखाए गए प्रकार के आधार पर कुछ अलग त्रुटियां मिलती हैं। मैंने fs.readFileSync पर 'utf8' एन्कोडिंग को हटा दिया और डेटा के साथ काम करने के लिए "readArmored" के स्थान पर "सेबिनरी" डाला जो बाइनरी सोच के रूप में काम कर सकता है, लेकिन फिर मुझे "डिक्रिप्शन के लिए अमान्य सत्र कुंजी" के बारे में त्रुटियां मिलती हैं। इसलिए मैंने मुख्य डिक्रिप्ट से पहले "decryptSessionKey" फ़ंक्शन का उपयोग करने की कोशिश की क्योंकि यह दस्तावेज़ों में दिखाया गया है, और यह मुझे एक अपरिभाषित कुंजी और "कोई सममित रूप से एन्क्रिप्टेड सत्र कुंजी पैकेट नहीं मिला" के बारे में एक त्रुटि प्राप्त करता है। इसके अलावा, मैं शायद गलत पेड़ को भड़क रहा हूं, क्योंकि Openpgp.js के साथ बाइनरी का उपयोग करने के लिए एक पासवर्ड की आवश्यकता होती है, जो मैं सोच रहा हूं कि पासफ्रेज से अलग है जो मेरी निजी कुंजी को अनलॉक करता है, जो मेरे पास एकमात्र पासवर्ड है।

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

+0

[यह उत्तर] (http://stackoverflow.com/a/33690541/1735215) एक बहुत ही समान प्रश्न (जिस पर यह संभवतः एक डुप्लिकेट है) का उपयोग 'openpgp.message.fromBinary()' के बजाय '' openpgp.message.readArmored() '। मुझे जावास्क्रिप्ट में कोई गहरी विशेषज्ञता नहीं है, लेकिन मुझे विश्वास है कि आप कोशिश कर सकते हैं { संदेश = openpgp.message.readArmored (एन्क्रिप्टेड डेटा); } पकड़ो (गलती) { संदेश = openpgp.message.from बाइनरी (एन्क्रिप्टेड डेटा); 'संदेश' पर' openpgp.decrypt() 'फ़ंक्शन को कॉल करने से पहले }। – 0range

+0

आपके उत्तर के लिए धन्यवाद, हालांकि मैंने उस पोस्ट को देखा है जिसे आपने लिंक किया है, और यह मदद नहीं करता है। जब मैं "बाइनरी" से उपयोग करता हूं, तो मुझे "डेटा Uint8array प्रारूप में होना चाहिए" त्रुटि मिलती है, क्योंकि मैं इसे एक utf-8 स्ट्रिंग के साथ पास कर रहा हूं। यदि मैं स्ट्रिंग को ओपनजीपी उपयोगिता के साथ Uint8 में परिवर्तित करता हूं और फिर डेटा में पास करता हूं, तो मुझे एक और त्रुटि मिलती है: "संदेश डिक्रिप्ट करने में त्रुटि: डिक्रिप्शन के लिए अमान्य सत्र कुंजी।" दोबारा, ये फ़ाइलें हैं जिन्हें मैं सिर्फ पीजीपी डेस्कटॉप में छोड़ सकता हूं और वे तुरंत डिक्रिप्ट कर सकते हैं। मुझे कुछ चाल होनी चाहिए ... – threepears

उत्तर

1

openpgp.message.readArmored() की गैर बख़्तरबंद संस्करण openpgp.message.read()

तो कुछ इस तरह काम करना चाहिए है:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8') 

if encryptedData.startsWith('-----BEGIN PGP MESSAGE-----') 
    encryptedMessage = openpgp.message.readArmored(encryptedData) 
else 
    var TextEncoder = require('text-encoding').TextEncoder; 
    var encryptedUint8 = new TextEncoder().encode(encryptedData); 
    encryptedMessage = openpgp.message.read(encryptedUint8) 

openpgp.decrypt({ 
    message: encryptedMessage, 
    publicKeys, 
    privateKey 
}).then((decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data }) 

(var TextEncoder लाइन यहाँ अगर आप TextEncoder पहले लोड अपने कोड में आवश्यक नहीं है)

+0

आपके उत्तर के लिए धन्यवाद! मैंने कोशिश की और, जैसा कि मुझे डर था, यह बख्तरबंद फाइलों के लिए ठीक काम करता है, लेकिन अन्य फाइलें अभी भी इसे नहीं बनाती हैं। बख्तरबंद नहीं होने वाले प्रत्येक व्यक्ति के साथ, मुझे एक त्रुटि मिलती है जो "TypeError: input.subarray एक फ़ंक्शन नहीं है।" यदि यह मदद करता है तो मैं आपको स्टैक ट्रेस दे सकता हूं, लेकिन आखिरी वस्तु "ऑब्जेक्ट.read (/Users/......./openpgp/dist/openpgp.js:16777:61) पर है" यदि आपके पास कोई है इस त्रुटि को हल करने के तरीके के बारे में और सुझाव, मुझे उन्हें सुनना अच्छा लगेगा, क्योंकि मैंने इसे समझने की कोशिश करने का समय बिताया है और यह अभी भी एक रहस्य है ..... – threepears

+0

@ थ्रीपीर्स - क्षमा करें, मेरी स्किम में प्रलेखन, मैंने 'read()' विधि 'int8array' प्रकार का तर्क लेने पर ध्यान नहीं दिया। मैं एक रूपांतरण कदम जोड़ दूंगा ... – Stobor

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