उपयोग कर रहा है मैं सी # में एक DSA हस्ताक्षर कैसे सत्यापित कर सकते हैं सत्यापित करें?सी # में एक DSA हस्ताक्षर कि संख्या/डीईआर इनकोडिंग ASN.1 प्रारूप
को देखते हुए:
- संदेश पाठ,
- एक हस्ताक्षरित डाइजेस्ट (आम तौर पर ASN.1 डीईआर प्रारूप),
- सार्वजनिक कुंजी (एक हस्ताक्षरित X.509 प्रमाणपत्र, पीईएम या डीईआर में प्रारूप)
मैं दृष्टिकोण के एक नंबर की कोशिश की है, लेकिन कोई सफलता नहीं मिली है:
OpenSSL.NET: पुस्तकालय के साथ विभिन्न अजीब त्रुटियों; मुझे open thread running with the author over on SourceForge मिला है लेकिन अभी तक इसे हल करने में सक्षम नहीं हैं।
माइक्रोसॉफ्ट .NET API: तुलना के लिए डीईआर हस्ताक्षर को अनपैक नहीं कर सकता है। एक DSA हस्ताक्षर 40 बाइट (दो 20-बाइट पूर्णांकों) है, लेकिन दो पूर्णांकों का एक DER- एन्कोड अनुक्रम के रूप में प्रस्तुत किया जाता है, तो कुल लंबाई 46 से 48 बाइट (एक त्वरित अवलोकन के लिए this post देखें।) जबकि नेट से रेंज कर सकते ASN.1/DER को पार्स करने के लिए कोड शामिल है (क्योंकि यह डीईआर प्रारूप में प्रमाणपत्र पढ़ सकता है), इसे गहरा दफनाया गया है, और इसका उपयोग करने का कोई तरीका नहीं है ताकि आप ASN.1/DER एन्कोडेड सिग से 40 बाइट्स को सही तरीके से पुनर्प्राप्त कर सकें। यह समस्या अगले विकल्प के लिए मुझे नेतृत्व किया ...
BouncyCastle:
Org.BouncyCastle.Asn1
कार्यों के उपयोग के माध्यम, मैं ASN.1 हस्ताक्षर पार्स और इसे खींच में घटक आर और एस पूर्णांक मूल्यों है सकते हैं। लेकिन जब मैं इन्हें हस्ताक्षर सत्यापन दिनचर्या में पास करता हूं, तो यह कोई स्पष्टीकरण नहीं दे रहा है। मुझे यकीन है कि अगर मैंने कुछ गलत कर रहा हूँ नहीं कर रहा हूँ, क्योंकि सी # एपीआई पूरी तरह से गैर-दस्तावेजी है, और जावा संस्करण मुश्किल से प्रलेखित है (लेकिन कोई उदाहरण या विधिपत्र जानकारी है कि मैं मिल सकता है।)
मैं इस समस्या पर खुद को लगभग एक सप्ताह तक फेंक रहा हूं। मुझे पता है कि किसी ने इसे पहले किया होगा, लेकिन मुझे कोई पूरा/काम करने वाला उदाहरण नहीं मिला है।
मैं तीन सी # यहां बैठे परियोजनाओं मिल गया है, प्रत्येक 95% पूरा, लेकिन एक महत्वपूर्ण दोष यह विफल करने का कारण बनता है के साथ। किसी भी कामकाजी उदाहरण कोड की सराहना की जाएगी।
संपादित करें: यहाँ एक हस्ताक्षर बात की पुष्टि कैसे कोशिश कर रहा हूँ का एक उदाहरण है, Base64 और ASCII हेक्स में बदल जाती यह postable बनाने के लिए। यह विशेष रूप से एक 47 बाइट्स है, लेकिन एक उचित पार्सर अभी भी यह स्वीकार करना चाहिए, अधिक जानकारी के लिए डीईआर कल्पना को पढ़ने
Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=
ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
संरचना (संख्या/डीईआर एक प्रमुख 00 पर हस्ताक्षर की पुष्टि करने के अगर MSB 1 है कहते हैं) डीईआर स्पेक प्रति है; इस प्रकार यह पार्स करता है:
30 2d: sequence, length 45 (may vary from 44 to 46)
02 15: integer, length 21 (first byte is 00 to confirm sign)
009482ad831075b3a773b89ce768dfc983bbc992b7
02 14: integer, length 20 (leading 00 not necessary for this one)
69d6666e29fb06f5f1a5ea0987b761aae0f60933
मेरे अपने डीईआर पार्सर लेखन वास्तव में एक विकल्प नहीं है, त्रुटि के लिए बहुत ज्यादा कमरे है और वहाँ इस ठीक से करने के लिए एक तरह से हो गया है।
मैं सोच रहा था कि क्या आप मुझे एक पक्ष कर सकते हैं और "सी # में डीएसए हस्ताक्षर सत्यापित करें" से "एएसएन.1 प्रारूप के साथ सी # में डीएसए हस्ताक्षर सत्यापित करें" या शीर्षक की तरह से शीर्षक बदल सकते हैं। लोगों को थोड़ा सा खोजने में मदद कर सकते हैं। – Greg
बस एक टिप्पणी के रूप में; मैं दूसरी तरफ जा रहा हूं (जावा में एक हस्ताक्षर सत्यापित करें जो .NET में बनाया गया था); मुझे डीईआर प्रारूप में .NET डीएसए प्रारूप (जो केवल 40 बाइट्स में आर || है) से एक कनवर्टर लिखना पड़ा। जो मैंने यहां पाया है उसके अनुसार (http://www.mombu.com/microsoft/security-crypto/t-dsa-ignature-format-674106.html) डीईआर प्रारूप आर और एस को बड़े-एंडियन होने की उम्मीद करता है लेकिन वह नहीं मैं बिल्कुल काम नहीं करता इसलिए मैंने इसे थोड़ा-सा अंतराल के रूप में छोड़ा और यह काम करता है ... मुझे इस पर कुछ भी स्पष्ट नहीं मिला है; यह बड़ा होना चाहिए- या छोटे-छोटे ... अगर कोई जानता है तो कृपया चुप रहो! – SonarJetLens