这是我的方法:
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
我的问题是:
答案 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 ...