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() 实际上应该得到一个 DER 对象而不是 ASN1。(据我了解,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。

事实证明,我打算将其用于/in 的框架也只是错误地使用了 DER,因为它是由 OpenSSL 提供的——它没有为该框架增加任何价值,因为所有字节都已经很好地定义了。

像 DER(random_byte_string_data) 这样说是没有意义的,因为结果会是这样的,[type;length;data] 或实际字节:04 10 <10 bytes of data>(04 是用于 octet_string =字节数组)

就个人而言,现在我明白了,我根本没有得到 DER 的价值——它不是人类可读的,如果你在计算机级别处理字节,那么为什么要额外填充呢?如果您知道 DER 数据是什么(与 XML/JSON 不同,DER 不会告诉您),您只能真正映射 DER 数据——这意味着要使用 DER,您必须有一个预先建立的方案/协议。

这让我回到:如果您在预定义的环境/协议中处理字节,为什么这种小学那种愚蠢的填充和带宽/空间的浪费?

为什么不是添加校验和和压缩数据的格式而不是 DER...

于 2014-12-12T07:49:28.330 回答