从X500Name解码DER编码的值

时间:2015-09-24 08:59:16

标签: java security encryption cryptography x509certificate

我有一个java.security.util.DerValue,我从X500Name中恢复。

x500Name.findMostSpecificAttribute(SOME_OID)

某些值存储为DER编码。 .toString给我一些礼物:

[DerValue, tag = 18, length = 12]

如何解码?

此外,它无法从中获取字节[]。

derValue.getOctetString

给我回报

java.io.IOException: DerValue.getOctetString, not an Octet String: 18

编辑:

我的解决方案是:

def decodeDERValue(derValue: DerValue): String = {
    val asnInput = new ASN1InputStream(new ByteArrayInputStream(derValue.toByteArray))

    val obj = asnInput.readObject()
    val derValueSting = obj match {
      case p: DERPrintableString => p.getString
      case p: DERUTF8String => p.getString
      case p: DERIA5String => p.getString
      case _ => ASN1Dump.dumpAsString(obj, true)
    }
   asnInput.close()

   derValueSting.trim
}

2 个答案:

答案 0 :(得分:2)

这是一个Sun内部类,它被称为sun.security.util.DerValue,而不是java.security.util.DerValue。 ASN.1类型由标记中的信息标识。因此,它取决于标记您可以从DerValue检索哪种数据。可以在in this book或标准8824-1 and 8825-1中找到更多信息。

但是,您不应该依赖Sun内部课程。如果您可以在byte[]中获取基础DER编码,则可以使用例如Bouncy Castle解析BER / DER。

答案 1 :(得分:1)

该类提供了各种构造函数和方法。

1)尝试此类的其他方法。

怎么样?
toByteArray()
getDataBytes()
getAsString() // calls toPrintableString internally

?我不能肯定地只是对字节代码进行了一些调查。

2)如果显式调用构造函数,请尝试从提供给构造函数的参数中获取内容。