Подтвердить что ты не робот

Анализ двоичных данных ASN.1 с помощью Java

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

ASN.1 structure as shown in BER viewer

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

Какую библиотеку ASN.1 можно использовать для получения такого результата? Кто-нибудь имеет пример кода, который демонстрирует, как разбирать объект ASN.1?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Просто используйте "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();

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Если вы просто хотите декодировать BER-кодированные данные, там есть множество парсеров. Вы пробовали? В Sun JDK есть даже два - com.sun.jmx.snmp.BerDecoder и com.sun.jndi.ldap.BerDecoder.

Ответ 6

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

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

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