Чтение закодировать ASN файл вручную
- Как прочитать кодировать файл ASN вручную?
- Что такое Tag-Length-Value, Есть ли хороший учебник?
В следующих примерах я читаю каждый из них, но не могу понять, может ли кто-нибудь помочь прочитать каждый из них:
- 30 82 02 10 04 01 56… (для многих других байтов)
Первый байт 00110000 в двоичном виде. Первые два бита равны 00, поэтому класс снова равен 0. Третий бит равен 1, поэтому он структурирован. Последние пять бит - 10000, поэтому тег - 16 десятичных. Следующий байт равен 82 шестнадцатеричным, что составляет 130 десятичных знаков, что составляет 128 + 2, следующие 2 байта дают длину. Это 02 10, что интерпретируется в формате "big-endian" как 2*256 + 16 = 528. Следующие 528 байтов, начиная с 04 01 56, содержат содержимое.
- дф 82 02 05 12 34 56 78 90
Первый байт 11011111 в двоичном формате. Первые два бита равны 11, так что это класс 3 - частный. Следующий бит - 0, так что это примитивно. Все остальные пять битов равны 1, поэтому фактический тег начинается со второго байта. Второй байт имеет начальный, а третий - нет, поэтому тег создается, взяв эти два байта (10000010 00000010 в двоичном виде), отбросив их начальные биты, чтобы получить четырнадцать битов 00000100000010, и интерпретируя его как двоичное число, Таким образом, тег является 258 десятичным. Следующий байт 05, что меньше 128, так что это фактическая длина содержимого. Следующие 5 байтов (12 34 56 78 90) являются содержимым.
- 30 80 04 03 56 78 90 00 00
Первый байт, 30, это тот, который мы видели раньше. Это универсальный класс, структурированный, с тегом 16. Следующий байт равен 80, поэтому длина вначале неизвестна. Содержимое - это все следующие байты, вплоть до (но не включая) первых двух последовательных нулевых байтов. Итак, содержимое 04 03 56 78 90, и мы можем из содержимого вычислить, что длина равна 5.
1 ответ
Каждое значение в кодировке представлено как тройка тег-длина-значение.
Тег определяется в определении данных ASN.1 для значения и важен для определения вида значения в случае, если есть несколько возможных вариантов (например, значения CHOICE или дополнительные значения).
Длина кодирует длину правильной части значения в байтах.
Значение является кодировкой транспортируемого значения. Используемая кодировка варьируется в зависимости от типа значения (например, строка использует другую кодировку, чем целое число или идентификатор объекта). В общем, вам нужно определение ASN.1, чтобы понять смысл байтов значения. В случае составных значений в части значения имеется ноль или более полных кодировок значений (каждое со значением tag-length-value), например отдельные поля значения SEQUENCE.
Поиск в Google для кодировки BER ASN.1 показывает много материала, например, этот.
Кстати, ваш третий пример немного вводит в заблуждение. Поток байтов в значении с неопределенной длиной должен быть разбит на вложенные значения (которые могут содержать последовательность байтов 00 00). Только если вы найдете 00 00 в позиции, где ожидается тег, это сигнал об окончании значения. Поэтому необходимо проанализировать содержимое 04 03 56 78 90 (тег 04, длина 03, значение 56 78 90), чтобы убедиться, что следующий 00 00 сигнализирует об окончании.
Редактировать:
Interpretation of the first example:
tag 30: bits 00 (UNIVERSAL) 1 (compound) 10000 (tag 16)
length 82 02 10: bits 1 (long length encoding) 0000010 (length uses 2 bytes)
00000010 00010000 (length in binary, 528 decimal)
Interpretation of the second example:
tag df 82 02: bits 11 (PRIVATE) 0 (primitive) 11111 (long tag encoding)
1 (there is a further tag byte) 0000010 (value 2)
0 (this is the last tag byte) 0000010 (value 2)
total tag value therefore 2*128 + 2 = 258
length 05: bits 0 (short length encoding) 0000101 (length in binary, decimal 5)
Interpretation of the third example:
tag 30: bits 00 (UNIVERSAL) 1 (compound) 10000 (tag value 16)
length 80: indefinite length, so we must look at the contained values
tag 04: bits 00 (UNIVERSAL) 0 (primitive) 00100 (tag value 4)
length 03: bits 0 (short length encoding) 0000011 (length value 3)
value 56 78 90
tag 00: signals end of indefinite length content as there is no
UNIVERSAL tag 0
length 00: dummy length byte of end marker