2012-04-17 3 views
20

Ich habe binäre ASN.1-Datenobjekte, die ich in mein Java-Projekt einlesen muss. Ich möchte nur die ASN.1 Struktur und Daten, wie sie zum Beispiel durch den BER-Viewer analysiert wird:Analyse von ASN.1-Binärdaten mit Java

ASN.1 structure as shown in BER viewer

Der ASN.1-Parser von BouncyCastle nicht in der Lage ist, diese Struktur zu analysieren (gibt nur anwendungsspezifische binäre Datentyp).

Welche ASN.1-Bibliothek kann ich verwenden, um ein solches Ergebnis zu erhalten? Hat jemand Beispielcode, der zeigt, wie ein ASN.1-Objekt analysiert wird?

BTW: Ich habe auch mehrere kostenlose ASN.1 Java Compiler ausprobiert, aber keiner ist in der Lage, Java Code zu generieren, der die ASN.1 Spezifikation hat.

+0

Möchten Sie nur einen Strom von BER-Daten zu analysieren, oder haben Sie eine bestimmte ASN.1 Grammatik implementieren möchten? –

+0

Ich habe eine ASN.1-Grammatik, aber die ASN.1-Compiler, die ich getestet habe, akzeptieren es nicht. Jedenfalls würde ich es vorziehen, nicht auf die Objekte beschränkt zu sein, für die ich die Grammatik habe. – Robert

Antwort

15

Ich muss mich selbst korrigieren - es ist möglich, die Daten mit ASN.1 Parser in BouncyCastle enthalten - aber der Prozess ist nicht so einfach.

Wenn Sie nur die Daten in einer ASN.1-Struktur drucken möchten, empfehle ich Ihnen, die Klasse org.bouncycastle.asn1.util.ASN1Dump zu verwenden. Es kann durch folgenden einfachen Code-Schnipsel verwendet werden:

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

es die Struktur druckt aber nicht die Daten - aber durch die ASN1Dump in eine eigene Klasse kopieren und modifizieren für dieses Beispiel OCTET_STRINGS auszudrucken leicht getan werden kann, .

Zusätzlich zeigt der Code in ASN1Dump, ASN.1 Strukturen zu analysieren.Für das Beispiel der in meiner Frage verwendeten Daten können eine Ebene tiefer mit dem folgenden Code analysiert werden:

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

Wenn Sie nur die BER-kodierten Daten dekodieren möchten, gibt es zahlreiche Parser. Hast du es versucht? Es gibt sogar zwei in der Sonne JDK - com.sun.jmx.snmp.BerDecoder und com.sun.jndi.ldap.BerDecoder.

+4

Hinweis: JDK-Klassen in com.sun. * - Paketen sind keine öffentlichen APIs und können in zukünftigen Versionen entfernt/geändert werden. – Puce

+0

@Tom: Ich würde diese Klassen versuchen, aber die Dokumentation dieser Klassen ist so gut wie die Dokumentation von mehreren anderen ASN.1-Projekten: fast nicht existierende ... – Robert

+0

Die Dokumentation ist nicht ideal, aber die Klassen sind Einfach, und Sie können den Quellcode über OpenJDK erhalten. Ich könnte mir vorstellen, dass Sie durch Lesen und Experimentieren alles lernen können, was Sie wissen müssen. –

3

Es ist nicht klar aus Ihrer Frage, ob Sie die ASN.1-Spezifikation für die BER haben, die Sie analysieren möchten. Bitte beachten Sie, dass Sie ohne die ASN.1-Spezifikation nur dann einen Teil der Daten erfassen können, wenn EXPLICIT TAGS in der ASN.1-Spezifikation verwendet wurden, aus der sie generiert wurden. Einige Tools wie das von OSS Nokalva verfügen über eine Bibliothek (JAR-Datei) namens JIAAPI, mit der Sie BER-Codierungen ohne vorherige Kenntnis der ASN.1-Spezifikation durchlaufen und manipulieren können.

Wenn Sie die ASN.1-Spezifikation haben, sollte jeder ASN.1 Java-Compiler damit umgehen können.

Sie können eine kostenlose Testversion des OSS ASN.1 Tools für Java von http://www.oss.com/asn1/products/asn1-download.html herunterladen, um zu sehen, ob es für Sie besser funktioniert als die anderen, die Sie erfolglos ausprobiert haben.

2

Ich muss alle Arten von ASN.1 Daten in Krypt analysieren können. Obwohl krypt ein Ruby-Projekt ist, sollten Sie sich die JRuby extension ansehen - der Code für die Handhabung von ASN.1-Parsing/Encoding ist vollständig in Java geschrieben und modular genug für eine einfache Extraktion.

Ich habe auch eine Java-only version gemacht, aber es fehlt etwas von der höheren Funktionalität der ersteren. Aber da es kurz ist, ist es vielleicht eine gute Gelegenheit, um loszulegen.

+0

Sie Code sieht gut aus - leider habe ich festgestellt, dass ich nicht nur einen ASN.1 Parser/Deserializer, sondern auch den Serialisierungsteil brauche. – Robert

+0

Danke! Ich habe aufgehört, die Java-only-Version voranzutreiben, als ich begann, sie in krypt zu integrieren, dort finden Sie auch die [Serialisierungsbits] (https://github.com/emboss/krypt-core-java/tree/master/src/ impl/krypt/asn1). Das ganze impl-Paket ist in sich abgeschlossen, also wird es nicht mit JRuby-Besonderheiten vermischt - Sie sollten es leicht extrahieren können. – emboss

1

Ich verwende bouncycastle API die Zeichenfolge Struktur zu drucken, unten ist der Code-Schnipsel:

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

Im Ergebnis ist das Drucken der Struktur, aber in Oktettstring ist es Drucklänge statt Wert. Wie wird der Wert gedruckt?

+0

Ich habe die gleiche Anforderung, ich habe asn1Object. Von dort muss ich die Daten analysieren und erforderliche Daten erhalten, könnten Sie bitte den Code bereitstellen? –

+0

Was ist CustomTreeNode? –

4

einfach auf „true“ zu drucken verwenden Werte

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

Zu Informationszwecken: Der dumpAsString mit zwei Parametern ist in älteren Bouncycastle-Versionen nicht verfügbar. – kukudas