5

これは私の方法です:

import org.bouncycastle.asn1.ASN1InputStream;
import java.io.ByteArrayInputStream;
...
public static byte[] toDERBytes(byte[] data) throws IOException
{
    ByteArrayInputStream inStream = new ByteArrayInputStream(data);

    //Uses imported bouncy castle library:
    ASN1InputStream asnInputStream = new ASN1InputStream(inStream);
    byte[] derArray = asnInputStream.readObject().getEncoded();
    asnInputStream.close();

    return derArray;
}

BouncyCastle のドキュメントによると、ASN1InputStream.readobject() は実際には ASN1 ではなく DER オブジェクトを取得する必要があることがわかりました。(私の理解では、DER は ASN1 のサブタイプです)

次に、バイトを返します。

これは半分の時間で機能しますが、残りの半分で次のエラーが発生します。

java.io.IOException: DER length more than 4 bytes: XXX

私の質問は次のとおりです。

  1. エラーがたまにしか表示されないのはなぜですか? (私は常に65バイトのデータを与えます)
  2. どうすれば修正できますか?
  3. 正しい方法で DER をエンコードしていますか?
4

1 に答える 1

6

私が呼び出すメソッドは、エンコードされるデータではなく、エンコードされたデータを想定しています。私はアホです。

ばかげた番号。2: DER は一種の圧縮アルゴリズムだと思っていましたが、明確に定義された型、フィールド、データを持つオブジェクトをエンコードするためのものです。JSON や XML に似ていると思います。

結局のところ、私がこれを for/in で使用するフレームワークは、OpenSSL によって提供されているため、誤って DER を使用しているだけです。すべてのバイトが既に明確に定義されているため、そのフレームワークに価値はありません。

DER(random_byte_string_data) のようなものを言うのは意味がありません。なぜなら、結果は [type;length;data] または実際のバイト単位で次のようになるからです: 04 10 <10 バイトのデータ> (04 は octet_string =バイト配列)

個人的には、DERの値がまったくわかりません.人間が読めるものではありません.とにかくコンピューターレベルでバイトを扱っているのであれば、なぜ余分なパディングが必要なのでしょうか? DERデータが何であるかを知っている場合にのみ、DERデータを実際にマッピングできます(DERはXML / JSONとは異なり、DERは教えてくれません)-つまり、DERを使用するには、事前に確立されたスキーム/プロトコルが必要です。

これは私を元に戻します:定義済みの環境/プロトコルでバイトを扱っている場合、なぜこの小学校のようなばかげたパディングと帯域幅/スペースの無駄ですか?

DERの代わりにチェックサムを追加してデータを圧縮する形式ではないのはなぜですか...

于 2014-12-12T07:49:28.330 に答える