2009-10-23 7 views
5

ओपनएसएसएल, साथ ही साथ अन्य डीएसए कार्यान्वयन, ASN.1 प्रारूप में हस्ताक्षर आउटपुट का उपयोग करते हुए ASN.1 प्रारूप में डीएसए हस्ताक्षर आयात करने के लिए कैसे करें। इस प्रकार, एएसएन .1 संरचना शीर्षकों के कारण 40-बाइट हस्ताक्षर (दो 20-बाइट पूर्णांक) 46 बाइट बन जाते हैं। (विवरण के लिए this forum post देखें।)BouncyCastle (C#)

मेरा प्रश्न है, कोई इस प्रारूप को सी # में कैसे संभालता है? (या कहीं और, उस बात के लिए)

मैं थोड़ी देर के खर्च नेट System.Security.Crypto संकुल का उपयोग कर इसके साथ सौदा करने की कोशिश कर, लेकिन यह है कि (वास्तव में निराशा होती है पर छोड़ दिया है क्योंकि यह स्पष्ट रूप से ASN.1 पार्स करने के लिए आंतरिक कोड है चूंकि यह डीईआर प्रारूप पढ़ सकता है, लेकिन इसका उपयोग करने के लिए आपके पास कोई रास्ता नहीं है - लेकिन मैं digress ...)

फिर, मैंने BouncyCastle C# लाइब्रेरी के साथ काम करना शुरू कर दिया। मैं इसे एक Asn1Object में प्राप्त कर सकते हैं, और अगर मैं इसे विस्तार करते हुए डिबगिंग मैं देख रहा हूँ कि वह दो पूर्णांकों के साथ एक DerSequence शामिल है, लेकिन कैसे मैं उन्हें बाहर खींच है (अधिमानतः BigIntegers में तो मैं उन्हें DSA.VerifySignature फ़ीड कर सकते हैं?)

कोड का नमूना:

Byte[] msgText = ReadFile("test_msg.txt"); 
Byte[] msgSigRaw = ReadFile("test_sig_1.bin"); // reads binary ASN.1 sig using FileStream 
Asn1Object sigASN = Asn1Object.FromByteArray(msgSigRaw); // parses into Asn1Object 
... 
X509Certificate implCert = ReadCertificate("pubcert_dsa.cer"); // cert in DER format 
DsaSigner DSA = new DsaSigner(); 
DSA.Init(false, implCert.GetPublicKey()); 
... 
BigInteger sigIntR, sigIntS; 
... //TODO: how to get signature from sigASN into sigIntR, sigIntS? 
Boolean validSig = DSA.VerifySignature(msgText, sigIntR, sigIntS); // my goal 

उत्तर

4

इस CodeProject लेख पर एक नज़र डालें: http://www.codeproject.com/KB/security/CryptoInteropSign.aspx

यह P1363 सी # में होने की उम्मीद प्रारूप में DSA हस्ताक्षर कन्वर्ट करने के लिए कोड है।

2

कैसे में BouncyCastle सी # एक DSA हस्ताक्षर सत्यापित करने के कुछ उदाहरण कोड:

ISigner sig = SignerUtilities.GetSigner("SHA1withDSA"); 
sig.Init(false, implCert.GetPublicKey()); 
sig.BlockUpdate(msgText, 0, msgText.Length); 
bool valid = sig.VerifySignature(msgSigRaw); 

ध्यान दें कि यह हस्ताक्षरकर्ता ASN.1 और संदेश डाइजेस्ट की गणना के साथ सौदा होगा (मैं मान लिया गया है SHA- 1 यहां आपके लिए इस्तेमाल किया गया था)।

यदि आप अभी भी वास्तव में जानना चाहते हैं कि {आर, एस} मानों के रूपांतरण ASN.1 से कैसे होते हैं, तो DsaDigestSigner के स्रोत में एक नज़र डालें। आंतरिक रूप से यह उचित ASN.1 एन्कोडिंग/डिकोडिंग करता है और फिर निम्न स्तर के सिग ऑपरेशन के लिए DsaSigner क्लास का उपयोग करता है।

+0

धन्यवाद! ऐसा लगता है कि काम करता है! –