23

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

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 構造を解析する方法を示しています。たとえば、私の質問で使用されているデータは、次のコードを使用して 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 仕様で EXPLICIT TAGS が使用されている場合にのみ、データの部分的な意味を理解できることに注意してください。OSS Nokalvaのツールなど、一部のツールにはJIAAPI と呼ばれるライブラリ (jar ファイル) があり、ASN.1 仕様の事前知識がなくても BER エンコーディングをトラバースして操作できます。

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

OSS ASN.1 Tools for Java の無料試用版をhttp://www.oss.com/asn1/products/asn1-download.htmlからダウンロードして、失敗した他のツールよりもうまく機能するかどうかを確認できます。

于 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の 2 つもあります。

于 2012-04-17T12:24:47.520 に答える