Bouncycastle DER长度IO错误:

时间:2014-12-11 16:42:05

标签: java bouncycastle der

这是我的方法:

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 documentation I have seen ASN1InputStream.readobject()实际上应该得到一个DER对象而不是ASN1。 (据我所知,DER是ASN1的子类型)

然后我返回字节。

这有一半的时间,但另一半我得到这个错误:

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

我的问题是:

  1. 为什么我只得到错误有时候? (我总是给它65字节的数据)
  2. 我该如何解决?
  3. Am I DER编码正确吗?

1 个答案:

答案 0 :(得分:5)

我调用的方法需要编码数据,而不是要编码的数据。我是个白痴。

Idiocy nr。 2: 我认为DER是一种压缩算法,但它用于编码具有明确定义的类型,字段和数据的对象。 与JSON或XML类似,我想。

事实证明,我将使用这个for / in也只是错误地使用DER,因为它是由OpenSSL提供的 - 它没有为该框架添加任何值,因为所有字节都已经很好地定义了。

说DER(random_byte_string_data)之类的东西是没有意义的,因为结果会像这样,[type; length; data]或实际的字节: 04 10 <10字节数据&gt; (04是用于octet_string =字节数组的类型)

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

这让我回过头来说:如果你在预定义的环境/协议中处理字节,为什么这种学龄级的填充和浪费带宽/空间?

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