2012-04-17 17 views
20

के साथ ASN.1 बाइनरी डेटा पार्सिंग में मेरे पास बाइनरी ASN.1 डेटा ऑब्जेक्ट्स हैं जो मुझे अपने जावा प्रोजेक्ट में पार्स करने की आवश्यकता है। मैं सिर्फ ASN.1 संरचना और डेटा चाहते हैं के रूप में यह संख्या दर्शक द्वारा उदाहरण के लिए पार्स किया:जावा

ASN.1 structure as shown in BER viewer

BouncyCastle की ASN.1 पार्सर इस संरचना को पार्स करने में सक्षम नहीं है (केवल आवेदन विशिष्ट बाइनरी रिटर्न डाटा प्रकार)।

क्या परिणाम प्राप्त करने के लिए मैं ASN.1 लाइब्रेरी का उपयोग कर सकता हूं? क्या किसी के पास नमूना कोड है जो दर्शाता है कि ASN.1 ऑब्जेक्ट को कैसे पार्स करना है?

बीटीडब्लू: मैंने कई मुफ्त एएसएन .1 जावा कंपाइलर्स भी कोशिश की लेकिन कोई भी एएसएन.1 विनिर्देशन दिए गए जावा कोड को उत्पन्न करने में सक्षम नहीं है।

+0

को महत्व देता है तो आप सिर्फ हिट डेटा की एक धारा पार्स करने के लिए चाहते हैं, या आप एक विशिष्ट ASN.1 व्याकरण को लागू करना चाहते हैं हैं? –

+0

मेरे पास एक ASN.1 व्याकरण है लेकिन मैंने परीक्षण किए गए ASN.1 कंपाइलर इसे स्वीकार नहीं करते हैं। वैसे भी मैं उन वस्तुओं तक सीमित नहीं होना चाहूंगा जिनके लिए व्याकरण है। – Robert

उत्तर

15

मुझे खुद को सही करना है - बाउंसीकास्टल में शामिल ASN.1 पार्सर का उपयोग करके डेटा को पढ़ना संभव है - हालांकि प्रक्रिया इतना आसान नहीं है।

यदि आप केवल एएसएन .1 संरचना में निहित डेटा मुद्रित करना चाहते हैं तो मैं आपको org.bouncycastle.asn1.util.ASN1Dump कक्षा का उपयोग करने की सलाह देता हूं। यह निम्नलिखित सरल कोड स्निपेट द्वारा इस्तेमाल किया जा सकता है:

ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(data)); 
ASN1Primitive obj = bIn.readObject(); 
System.out.println(ASN1Dump.dumpAsString(obj)); 

यह संरचना नहीं बल्कि डेटा प्रिंट - लेकिन एक ही वर्ग में ASN1Dump को कॉपी करने और संशोधित करके उदाहरण OCTET_STRINGS यह आसानी से किया जा सकता है के लिए बाहर मुद्रित करने के लिए ।

इसके अतिरिक्त ASN1Dump में कोड ASN.1 संरचनाओं को पार्स करने के लिए दर्शाता है।उदाहरण के लिए मेरे सवाल में इस्तेमाल किया डेटा निम्नलिखित कोड का उपयोग कर गहरी एक स्तर पार्स किया जा सकता:

DERApplicationSpecific app = (DERApplicationSpecific) obj; 
ASN1Sequence seq = (ASN1Sequence) app.getObject(BERTags.SEQUENCE); 
Enumeration secEnum = seq.getObjects(); 
while (secEnum.hasMoreElements()) { 
    ASN1Primitive seqObj = (ASN1Primitive) secEnum.nextElement(); 
    System.out.println(seqObj); 
} 
1

यदि आप बस बीईआर-एन्कोडेड डेटा को डीकोड करना चाहते हैं, तो वहां कई पार्सर्स हैं। क्या आपने किसी की कोशिश की है? सूर्य जेडीके में भी दो हैं - com.sun.jmx.snmp.BerDecoder और com.sun.jndi.ldap.BerDecoder

+4

नोट: com.sun में जेडीके कक्षाएं। * पैकेज सार्वजनिक एपीआई नहीं हैं जिन्हें भविष्य में रिलीज़ में हटाया जा सकता है/बदला जा सकता है। – Puce

+0

@ टॉम: मैं उन वर्गों को आज़मा दूंगा लेकिन उन वर्गों का दस्तावेज कई अन्य एएसएन .1 परियोजनाओं के दस्तावेज के रूप में उतना ही अच्छा है: लगभग गैर-मौजूदा ... – Robert

+0

दस्तावेज आदर्श नहीं है, लेकिन कक्षाएं हैं सरल, और आप OpenJDK के माध्यम से स्रोत कोड प्राप्त कर सकते हैं। मैं कल्पना करता हूं कि आप पढ़ना और प्रयोग करके जानना चाहते हैं कि सब कुछ सीख सकते हैं। –

3

यह आपके प्रश्न से स्पष्ट नहीं है कि आपके पास बीईआर के लिए ASN.1 विनिर्देश है या नहीं, जिसे आप पार्स करने का प्रयास कर रहे हैं। कृपया ध्यान दें कि ASN.1 विनिर्देश के बिना, आप केवल डेटा का आंशिक अर्थ ही बना सकते हैं यदि EXPLICIT टैग का उपयोग ASN.1 विनिर्देश में किया गया था, जिससे इसे उत्पन्न किया गया था। कुछ टूल, जैसे कि OSS Nokalva में से एक लाइब्रेरी (जार फ़ाइल) है जिसे JIAAPI कहा जाता है जो आपको एएसएन.1 विनिर्देश के पूर्व ज्ञान के बिना बीईआर एन्कोडिंग को पार करने और कुशलतापूर्वक उपयोग करने की अनुमति देता है।

यदि आपके पास ASN.1 विनिर्देश है, तो कोई भी ASN.1 जावा कंपाइलर इसे संभालने में सक्षम होना चाहिए।

आप http://www.oss.com/asn1/products/asn1-download.html से जावा के लिए ओएसएस ASN.1 टूल्स का नि: शुल्क परीक्षण डाउनलोड कर सकते हैं यह देखने के लिए कि आपके द्वारा असफल प्रयासों की तुलना में आपके लिए बेहतर काम करता है या नहीं।

2

मुझे क्रिप्ट में किसी भी प्रकार के ASN.1 डेटा को पार्स करने में सक्षम होना चाहिए। हालांकि क्रिप्ट एक रूबी प्रोजेक्ट है, आप JRuby extension पर एक नज़र डालना चाहते हैं - ASN.1 पार्सिंग/एन्कोडिंग को संभालने के लिए कोड पूरी तरह से जावा में लिखा गया है और आसान निष्कर्षण के लिए मॉड्यूलर पर्याप्त है।

मैंने Java-only version भी बनाया, लेकिन यह पूर्व की उच्च स्तरीय कार्यक्षमता में से कुछ खो रहा है। लेकिन चूंकि यह संक्षिप्त है, शायद यह आपको शुरू करने का एक अच्छा मौका है।

+0

आप कोड अच्छे दिखते हैं - दुर्भाग्य से मैंने देखा कि मुझे केवल एएसएन .1 पार्सर/डेसेरियलाइज़र की आवश्यकता नहीं है बल्कि धारावाहिक भाग भी है। – Robert

+0

धन्यवाद! मैंने जावा-केवल संस्करण को आगे बढ़ाना बंद कर दिया जब मैंने इसे क्रिप्ट में एकीकृत करना शुरू किया, वहां आपको [सीरियलाइजेशन बिट्स] भी मिलेगा (https://github.com/emboss/krypt-core-java/tree/master/src/ impl/krypt/asn1)। पूरे इम्प्लेक्स पैकेज स्वयं निहित है, इसलिए यह JRuby विनिर्देशों के साथ अंतःस्थापित नहीं होगा - आपको इसे आसानी से निकालने में सक्षम होना चाहिए। – emboss

1

मैं bouncycastle एपीआई का उपयोग कर रहा स्ट्रिंग संरचना मुद्रित करने के लिए नीचे दिए गए कोड का टुकड़ा है:

ASN1InputStream bIn = new ASN1InputStream(input); 
    DERObject obj = bIn.readObject(); 
    System.out.println(CustomTreeNode.dumpAsString(obj)); 

परिणामस्वरूप यह संरचना संरचना है लेकिन ऑक्टेट स्ट्रिंग में यह मूल्य की बजाय मुद्रण लंबाई है। मूल्य प्रिंट कैसे करें?

+0

मेरे पास एक ही आवश्यकता है, मेरे पास asn1Object है। वहां से मुझे डेटा को पार्स करने और आवश्यक डेटा प्राप्त करने की आवश्यकता है, क्या आप कोड प्रदान कर सकते हैं? –

+0

कस्टमट्रीनोड क्या है? –

4

बस प्रिंट "सही" का उपयोग

ASN1InputStream ais = new ASN1InputStream(
     new FileInputStream(new File("d:/myfile.cdr"))); 
    while (ais.available() > 0) { 
     ASN1Primitive obj = ais.readObject(); 
     System.out.println(ASN1Dump.dumpAsString(obj, true)); 
    } 
    ais.close(); 
+0

सूचना उद्देश्य के लिए: दो पैरामीटर वाले डंपएएसस्ट्रिंग पुराने बाउंसीकैसल संस्करणों में उपलब्ध नहीं है। – kukudas