TLDR: ऐसा लगता है openssl pkeyutlकि एक हैश पर हस्ताक्षर करने के लिए डिज़ाइन किया गया है, लेकिन एक छोटी फ़ाइल दी गई है जहाँ हैश की उम्मीद है; और OpenSSL 1.1.0g (लेकिन OpenSSL 1.0.2g) में मौजूद कुछ चेक उस गलती को पकड़ लेते हैं।
एफडब्ल्यूआईडब्ल्यू, उस समय कोई त्रुटि नहीं थी जब मैंने ओपनएसएसएल 1.0.2 जी के साथ प्रश्न के आदेशों की कोशिश की। लेकिन मुझे 3 कारण दिखाई देते हैं कि यह विफल हो सकता है (और, पहले, के लिए):
openssl pkeyutlएक हैश प्रदर्शन नहीं करने के लिए प्रलेखित है, जो बाहरी रूप से किए जाने की उम्मीद है। इसलिए मेरा अनुमान है कि इनपुट फ़ाइल निजी कुंजी के q पैरामीटर से कम होने पर openssl pkeyutl छाल के नए संस्करण अच्छी तरह से विफल हो जाते हैं , क्योंकि ऐसा करने के लिए केवल ध्वनि चीज है। यह कम से कम आदमी पृष्ठ के अनुरूप है :
आरएसए, ईसीडीएसए और डीएसए हस्ताक्षरों के मामले में, यह उपयोगिता इनपुट डेटा पर हैशिंग का प्रदर्शन नहीं करेगी, बल्कि सीधे हस्ताक्षर एल्गोरिथ्म के इनपुट के रूप में डेटा का उपयोग करेगी। कुंजी प्रकार, हस्ताक्षर प्रकार और गद्दी के मोड के आधार पर, इनपुट डेटा की अधिकतम स्वीकार्य लंबाई भिन्न होती है। सामान्य तौर पर, आरएसए के साथ हस्ताक्षरित डेटा प्रमुख मापांक से अधिक लंबा नहीं हो सकता है, ईसीडीएसए और डीएसए के मामले में डेटा फ़ील्ड आकार से अधिक लंबा नहीं होना चाहिए, अन्यथा यह चुपचाप फ़ील्ड आकार में छोटा हो जाएगा।
दूसरे शब्दों में, अगर डाइजेस्ट का मान sha1 है तो इनपुट SHA-1 हैश फंक्शन आउटपुट की 20 बाइट लंबी बाइनरी एन्कोडिंग होनी चाहिए।
इन दिनों, 1024-बिट डीएसए को ठीक से पदावनत किया जाता है, और कुछ स्थानों पर (कुछ एसएसएच कार्यान्वयन सहित) इसके लिए समर्थन को सरसरी तौर पर हटा दिया गया है।
- इन दिनों, 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पैरामीटर को अनदेखा किया जाएगा (..)