डीएसए के साथ हस्ताक्षर नहीं कर सकते


0

DSA कुंजी के साथ बनाया गया है:

openssl genpkey -genparam -algorithm DSA -out dsaparams.pem -pkeyopt dsa_paramgen_bits:1024

openssl genpkey -paramfile dsaparams.pem -out dsakey.pem

जब मैंने हस्ताक्षर करने का प्रयास किया, तो यह त्रुटि प्रदर्शित हो रही है:

echo 'bacon' > text

openssl pkeyutl -sign -in text -inkey dsakey.pem -out sig
Public Key operation error

इसके साथ साइन इन करना संभव है, openssl dgst -signलेकिन ऊपर दिए गए आदेशों के साथ नहीं।

ऐसा क्यों होता है? man openssl-pkeyutlडीएसए का कहना है कि हस्ताक्षर और सत्यापन की अनुमति देता है। मैं ओपनएसएसएल 1.1.0 जी का उपयोग कर रहा हूं


जवाबों:


1

TLDR: ऐसा लगता है openssl pkeyutlकि एक हैश पर हस्ताक्षर करने के लिए डिज़ाइन किया गया है, लेकिन एक छोटी फ़ाइल दी गई है जहाँ हैश की उम्मीद है; और OpenSSL 1.1.0g (लेकिन OpenSSL 1.0.2g) में मौजूद कुछ चेक उस गलती को पकड़ लेते हैं।


एफडब्ल्यूआईडब्ल्यू, उस समय कोई त्रुटि नहीं थी जब मैंने ओपनएसएसएल 1.0.2 जी के साथ प्रश्न के आदेशों की कोशिश की। लेकिन मुझे 3 कारण दिखाई देते हैं कि यह विफल हो सकता है (और, पहले, के लिए):

  1. openssl pkeyutlएक हैश प्रदर्शन नहीं करने के लिए प्रलेखित है, जो बाहरी रूप से किए जाने की उम्मीद है। इसलिए मेरा अनुमान है कि इनपुट फ़ाइल निजी कुंजी के q पैरामीटर से कम होने पर openssl pkeyutl छाल के नए संस्करण अच्छी तरह से विफल हो जाते हैं , क्योंकि ऐसा करने के लिए केवल ध्वनि चीज है। यह कम से कम आदमी पृष्ठ के अनुरूप है :

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

    दूसरे शब्दों में, अगर डाइजेस्ट का मान sha1 है तो इनपुट SHA-1 हैश फंक्शन आउटपुट की 20 बाइट लंबी बाइनरी एन्कोडिंग होनी चाहिए।

  2. इन दिनों, 1024-बिट डीएसए को ठीक से पदावनत किया जाता है, और कुछ स्थानों पर (कुछ एसएसएच कार्यान्वयन सहित) इसके लिए समर्थन को सरसरी तौर पर हटा दिया गया है।

  3. इन दिनों, SHA-1 को सही ढंग से हटा दिया गया है।

मैं कम से कम 2048-बिट डीएसए, एसएचए -256, और हस्ताक्षर की गणना करने से पहले फाइल को हैश करने का सुझाव दूंगा, जो सबसे अच्छा हो सकता है openssl dgstजिसके साथ हैश-तब-साइन openssl pkeyutlकर सकते हैं , जब नहीं कर सकते। मैं एक ओपन गुरु नहीं हूं, लेकिन मैं निम्नलिखित की जांच करने की कोशिश करूंगा:

# generate a private key and extract the public key
openssl genpkey -paramfile dsaparams.pem -out dsaprivkey.pem
openssl dsa -in dsaprivkey.pem -pubout > dsapubkey.pem

# create a file "myfile" to be signed
echo 'The Magic Words are Squeamish Ossifrage' > myfile

# create signature "myfile.sig"
openssl dgst -sha256 -sign dsaprivkey.pem myfile > myfile.sig

# verify "myfile" against signature "myfile.sig" and public key
openssl dgst -sha256 -verify dsapubkey.pem -signature myfile.sig myfile

नोट: पूर्व- निर्मित 1.0.2g 160-बिट q (शायद SHA-1 का उपयोग करके) के साथ हस्ताक्षर उत्पन्न करता है । प्रति टिप्पणी , मैं जोड़ा -sha256करने के लिए openssl dgstहै, लेकिन यह कोई फर्क नहीं बनाया है। प्रयोग यह सुझाव देते हैं कि इसका उपयोग करना आवश्यक है -pkeyopt dsa_paramgen_q_bits:256, भले ही वह मैन पेज स्पष्ट रूप से बताता -pkeyopt dsa_paramgen_md:sha256हो:

dsa_paramgen_md:digest
पैरामीटर पीढ़ी के दौरान उपयोग करने के लिए पाचन। से एक होना चाहिए sha1, sha224या sha256। यदि सेट किया जाता है, तो q में बिट्स की संख्या निर्दिष्ट पाचन के आउटपुट आकार से मेल खाएगी और dsa_paramgen_q_bitsपैरामीटर को अनदेखा किया जाएगा (..)


यहां तक ​​कि 3072, यह पाठ पर हस्ताक्षर नहीं करता है, या यहां तक ​​कि हैशsha256

धन्यवाद। openssl dgst -signRSA और DSA के साथ कार्यों का उपयोग करना , लेकिन मुझे अभी भी संदेह है कि कमांड क्यों openssl pkeyutlहस्ताक्षर नहीं करेगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.