web-dev-qa-db-ja.com

Javaを使用したASN.1バイナリデータの解析

Javaプロジェクトに解析する必要があるバイナリASN.1データオブジェクトがあります。ASN.1構造とデータが必要なのは、たとえばBERビューアによって解析されるためです。

ASN.1 structure as shown in BER viewer

BouncyCastleのASN.1パーサーは、この構造を解析できません(アプリケーション固有のバイナリデータタイプのみを返します)。

そのような結果を取得するためにどのASN.1ライブラリを使用できますか?ASN.1オブジェクトを解析する方法を示すサンプルコードは誰にもありますか?

ところで、私はいくつかの無料のASNも試しました。1Javaコンパイラですが、動作するJava与えられたコードはASN.1仕様である可能性があります。

20
Robert

私は自分で修正する必要があります。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構造を解析する方法を示しています。たとえば、私の質問で使用されているデータは、次のコードを使用して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);
}
18
Robert

「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();
4
test1

解析しようとしているBERのASN.1仕様があるかどうかは、質問から明らかではありません。 ASN.1仕様がない場合、生成元のASN.1仕様でEXPLICIT TAGSが使用されている場合にのみ、データを部分的に理解できることに注意してください。 OSS Nokalva からのものなどの一部のツールには、ASA.1仕様の事前の知識がなくてもBERエンコーディングをトラバースおよび操作できるJIAAPIと呼ばれるライブラリ(jarファイル)があります。

ASN.1仕様がある場合、どのASN.1 Javaコンパイラでもこれを処理できるはずです。

Java http://www.oss.com/asn1/products/asn1-download.html のOSS ASN.1ツールの無料トライアルをダウンロードできます=失敗した他のユーザーよりもうまく機能するかどうかを確認します。

3
Paul Thorpe

BERでエンコードされたデータをデコードするだけの場合は、多数のパーサーが存在します。試しましたか? Sun JDKには com.Sun.jmx.snmp.BerDecodercom.Sun.jndi.ldap.BerDecoder の2つさえあります。

2
Tom Anderson

Kryptであらゆる種類のASN.1データを解析できるようにする必要があります。 kryptはRubyプロジェクトですが、 JRuby拡張 -ASN.1の解析/エンコードを処理するためのコードは完全に= Javaおよび簡単に抽出できるように十分にモジュール化されています。

Javaのみのバージョン も作成しましたが、前者の高レベルの機能の一部が欠落しています。しかし、簡潔なので、始めるのに良い機会かもしれません。

2
emboss

私はbouncycastle APIを使用して文字列構造を出力しています。以下はコードスニペットです。

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

結果として、それは構造を出力しますが、オクテット文字列では、値ではなく長さを出力します。値を印刷する方法は?

0
user2335004