解析与Java ASN.1二进制数据(Parsing ASN.1 binary data with

2019-06-23 17:20发布

我有我需要解析到我的Java项目的二进制ASN.1数据对象。 我只是想ASN.1结构和数据,因为它被解析例如通过BER观众:

BouncyCastle的的ASN.1语法分析器不能解析该结构(仅返回应用特定的二进制数据类型)。

什么ASN.1库我可以用它来获得这样的结果? 是否有人有演示如何解析ASN.1对象的示例代码?

BTW:我也试了几个免费ASN.1 Java编译但没有一个能够产生可给予ASN.1规范工作的Java代码。

Answer 1:

我必须纠正自己 - 这是可以读出使用包含在BouncyCastle的ASN.1语法分析器中的数据 - 但是这个过程并非如此简单。

如果你只想打印包含在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);
}


Answer 2:

只要使用“真”打印值

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


Answer 3:

它不是从你的问题清楚你是否拥有你正在试图解析BER的ASN.1规范。 请注意,如果没有ASN.1规范,只能使数据的部分意义,如果显式标签是在从它生成的ASN.1规范使用。 一些工具,如从一个OSS Nokalva有一个库(JAR文件)称为JIAAPI它允许您遍历和操纵BER编码不ASN.1规范的先验知识。

如果你有ASN.1规范,任何ASN.1 Java编译器应该能够处理这个问题。

您可以从以下网址下载OSS ASN.1工具针对Java的免费试用http://www.oss.com/asn1/products/asn1-download.html看到比你不成功尝试的人,如果你的作品好。



Answer 4:

如果你只是想给BER编码数据进行解码,有无数的解析器那里。 你试过没有? 甚至有两个太阳JDK - com.sun.jmx.snmp.BerDecoder和com.sun.jndi.ldap.BerDecoder 。



Answer 5:

我需要能够分析任何种类的ASN.1数据的krypt。 虽然krypt是一个Ruby项目,你可能想看看在JRuby的延伸 -完全用Java编写的,并易于提取足够的模块化处理ASN.1解析/编码的代码。

我还做了一个纯Java的版本 ,但它缺少一些前任的高级功能。 但由于它的简洁,也许是让你开始的好机会。



Answer 6:

我使用BouncyCastle的API来打印字符串结构,下面是代码片段:

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

在结果正在打印的结构,但在字节串正在打印长度,而不是值。 如何打印的价值?



文章来源: Parsing ASN.1 binary data with Java