Разбор ASN.1 двоичные данные с Java

У меня есть двоичный ASN.1 объекты данных, которые мне нужно проанализировать в моем проекте Java. Я просто хочу АСН.1 структура и данные, как она анализируется, например, BER viewer:

ASN.1 structure as shown in BER viewer

ASN.1 синтаксический анализатор BouncyCastle не может анализировать эту структуру (возвращает только двоичный тип данных приложения).

что ASN.Библиотека 1 я могу использовать, чтобы получить такой результат? У кого-нибудь есть пример кода, который демонстрирует, как разобрать АСН.Один объект?

BTW: я также попробовал несколько бесплатных ASN.1 Java-компиляторы, но никто не может генерировать рабочий Java-код, заданный may ASN.Спецификация 1.

6 ответов


Я должен исправить себя - можно прочитать данные с помощью ASN.1 парсер включен в BouncyCastle-однако процесс не так прост.

Если вы только хотите напечатать данные, содержащиеся в ASN.1 структура я рекомендую вам использовать класс org.после установки BouncyCastle.является asn1.утиль.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);
}

просто используйте "true" для печати значений

    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();

из вашего вопроса неясно, есть ли у вас ASN.1 спецификация для BER, который вы пытаетесь проанализировать. Обратите внимание, что без ASN.1 спецификация, вы можете только частично понять данные, если явные теги были использованы в ASN.1 спецификация, из которой он был создан. Некоторые инструменты, такие как ОСС Nokalva имейте библиотеку (файл jar), называемую JIAAPI, которая позволяет вам пересекать и манипулировать кодировками BER без предварительного знания АСН.Спецификация 1.

Если у вас есть ASN.1 спецификация, любой ASN.1 компилятор Java должен быть в состоянии справиться с этим.

вы можете скачать бесплатную пробную версию ASN OSS.1 Инструменты для Java от http://www.oss.com/asn1/products/asn1-download.html чтобы увидеть, работает ли лучше для Вас, чем другие, которые вы безуспешно пытались.


Мне нужно иметь возможность анализировать любой ASN.1 данные в крипте. Хотя krypt является проектом Ruby, вы можете взглянуть на расширение JRuby - код для обработки ASN.1 синтаксический анализ / кодирование написано полностью на Java и достаточно модульно для легкого извлечения.

Я также сделал Java-только версия, но ему не хватает некоторых функций более высокого уровня первого. Но так как это лаконично, возможно, это хорошая возможность, чтобы вы начали.


Если вы просто хотите декодировать данные, закодированные в BER, существует множество синтаксических анализаторов. Вы пробовали? Есть даже два в Солнце JDK - com.солнце.с помощью JMX.протокол SNMP.BerDecoder и com.солнце.в JNDI.протокол LDAP.BerDecoder.


Я использую bouncycastle API для печати Строковой структуры, ниже приведен фрагмент кода:

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

в результате это структура печати, но в строке октета это длина печати вместо значения. Как напечатать значение?