Javaプロジェクトに解析する必要があるバイナリASN.1データオブジェクトがあります。ASN.1構造とデータが必要なのは、たとえばBERビューアによって解析されるためです。
BouncyCastleのASN.1パーサーは、この構造を解析できません(アプリケーション固有のバイナリデータタイプのみを返します)。
そのような結果を取得するためにどのASN.1ライブラリを使用できますか?ASN.1オブジェクトを解析する方法を示すサンプルコードは誰にもありますか?
ところで、私はいくつかの無料のASNも試しました。1Javaコンパイラですが、動作するJava与えられたコードはASN.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構造を解析する方法を示しています。たとえば、私の質問で使用されているデータは、次のコードを使用して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);
}
「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();
解析しようとしている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ツールの無料トライアルをダウンロードできます=失敗した他のユーザーよりもうまく機能するかどうかを確認します。
BERでエンコードされたデータをデコードするだけの場合は、多数のパーサーが存在します。試しましたか? Sun JDKには com.Sun.jmx.snmp.BerDecoder と com.Sun.jndi.ldap.BerDecoder の2つさえあります。
Kryptであらゆる種類のASN.1データを解析できるようにする必要があります。 kryptはRubyプロジェクトですが、 JRuby拡張 -ASN.1の解析/エンコードを処理するためのコードは完全に= Javaおよび簡単に抽出できるように十分にモジュール化されています。
Javaのみのバージョン も作成しましたが、前者の高レベルの機能の一部が欠落しています。しかし、簡潔なので、始めるのに良い機会かもしれません。
私はbouncycastle APIを使用して文字列構造を出力しています。以下はコードスニペットです。
ASN1InputStream bIn = new ASN1InputStream(input);
DERObject obj = bIn.readObject();
System.out.println(CustomTreeNode.dumpAsString(obj));
結果として、それは構造を出力しますが、オクテット文字列では、値ではなく長さを出力します。値を印刷する方法は?