2015-09-24 2 views
0

У меня есть java.security.util.DerValue, который я извлекаю из X500Name.Декодирование DER-encoded от X500Name

x500Name.findMostSpecificAttribute(SOME_OID) 

Некоторые значения хранятся как DER-кодированные. .toString возвращает мне что-то Лиле:

[DerValue, tag = 18, length = 12] 

Как расшифровать его?

Кроме того, из него невозможно получить байты [].

derValue.getOctetString 

возвращает мне

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

EDIT:

Мое решение:

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 
} 
+0

'derValue.getDataBytes' возвращает также массивы байтов –

ответ

2

Это внутренний класс Sun, это называется sun.security.util.DerValue, не java.security.util.DerValue. Типы ASN.1 идентифицируются информацией в теге. Поэтому он зависит от тега, какие данные можно извлечь из DerValue. Более подробную информацию можно найти in this book или в стандартах 8824-1 and 8825-1.

Однако вы не должны полагаться на внутренние классы Sun. Если вы можете получить базовую кодировку DER в byte[], вы можете использовать, например. Bouncy Castle для разбора BER/DER.

+0

Благодарим за сообщение. Попытка выяснить, как его декодировать с помощью BC. –

1

Класс предоставляет различные конструкторы и методы.

1) Попробуйте другие методы этого класса. Что относительно

toByteArray() 
getDataBytes() 
getAsString() // calls toPrintableString internally 

? Я не могу сказать точно, просто взглянув на байтовый код.

2) Если вы явно вызываете конструктор, попробуйте получить содержимое из аргументов, предоставленных конструктору.

+0

'toByteArray' &' getDataBytes' возвращают байт [], но эти массивы разные. 'getAsString' возвращает' null'. –

+1

@Artsiom: Никто не просил эти два метода возвращать одинаковые значения. Возможно, один возвращает двоичное значение, закодированное DER, в то время как другое возвращает только значение (типа ASN 1, length, value tripel). Может быть, попробуйте сами создать экземпляр известного значения. Например, что-то вроде «010101» (однако кажется, что класс DerValue всегда добавляет 16 к номеру тега, который указывает на ASN1 SEQUENCE, поэтому точно укажите точное значение). Извините, сейчас у меня больше нет времени для расследования, поскольку я борюсь с TLS. – Sebastian

Смежные вопросы