23

我有二进制 ASN.1 数据对象,需要解析到我的 Java 项目中。我只想要 ASN.1 结构和数据,例如由 BER 查看器解析:

BER 查看器中显示的 ASN.1 结构

BouncyCastle 的 ASN.1 解析器无法解析此结构(仅返回应用程序特定的二进制数据类型)。

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

顺便说一句:我还尝试了几个免费的 ASN.1 Java 编译器,但没有一个能够生成给定 ASN.1 规范的工作 Java 代码。

4

5 回答 5

21

我必须纠正自己 - 可以使用 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);
}
于 2012-05-11T11:57:21.363 回答
7

只需使用“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();
于 2014-08-16T07:06:47.967 回答
3

从您的问题中不清楚您是否具有您尝试解析的 BER 的 ASN.1 规范。请注意,在没有 ASN.1 规范的情况下,如果在生成数据的 ASN.1 规范中使用了显式标签,则只能部分理解数据。一些工具,例如来自OSS Nokalva的工具,有一个名为 JIAAPI 的库(jar 文件),它允许您在不了解 ASN.1 规范的情况下遍历和操作 BER 编码。

如果您确实有 ASN.1 规范,那么任何 ASN.1 Java 编译器都应该能够处理这个问题。

您可以从http://www.oss.com/asn1/products/asn1-download.html下载 OSS ASN.1 Tools for Java 的免费试用版,看看是否比您尝试失败的其他工具更适合您。

于 2012-04-17T21:58:10.777 回答
2

我需要能够解析 krypt 中任何类型的 ASN.1 数据。虽然 krypt 是一个 Ruby 项目,但您可能想看看JRuby 扩展- 处理 ASN.1 解析/编码的代码完全用 Java 编写,并且足够模块化以便于提取。

我还制作了一个纯 Java 版本,但它缺少前者的一些高级功能。但既然它很简洁,也许这是一个让你开始的好机会。

于 2012-04-30T12:13:22.963 回答
1

如果您只想解码 BER 编码的数据,则有许多解析器。你试过吗?Sun JDK 中甚至还有两个 - com.sun.jmx.snmp.BerDecodercom.sun.jndi.ldap.BerDecoder

于 2012-04-17T12:24:47.520 回答