簡體   English   中英

ASN.1標簽含義

[英]ASN.1 tag meaning

我有一個具有以下值的標簽: Tag(nr=16, typ=32, cls=0)

這些值中的每一個是什么意思?

基於https://en.wikipedia.org/wiki/X.690#Types ,我認為 typ=32 應該表示 TIME-OF-DAY ,但這在我的上下文中沒有意義。

那么我的背景是什么? 很高興您問到:我正在解壓縮使用以下內容創建的 ECDH_SECP256R1 私鑰:

>>> import asn1
>>> from Crypto.IO.PKCS8 import unwrap
>>> import binascii
>>> from CryptoMobile.EC import *
>>> ec_B = ECDH_SECP256R1()
>>> ec_B.get_privkey()
b'0\x81\x87\x02\x01\x000\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x04m0k\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90'
>>> unwrap(ec_B.get_privkey())
('1.2.840.10045.2.1', b'0k\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90', b'\x06\x08*\x86H\xce=\x03\x01\x07')
>>> 
>>> 
>>> decoder = asn1.Decoder()
>>> decoder.start(unwrap(ec_B.get_privkey())[1])
>>> tag, value = decoder.read()
>>> tag
Tag(nr=16, typ=32, cls=0)
>>> value
b'\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90'

我在想那個標簽告訴我如何理解這個價值。 或者也許 Python 已經從標簽中理解了值? 這是最終的解碼值嗎?

>>> print(binascii.hexlify(value))
b'0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90'

還是我必須使用標簽知識來進一步解碼?

請注意,在 ASN.1 中,標簽沒有任何意義……它僅用於對數據進行編碼和解碼(並且僅在 BER、DER、CER 編碼規則中)

要了解數據的含義,您始終需要 ASN.1 規范(@Crypt32 中的ECPrivateKey答案)

編碼和解碼 BER 的所有概念在文檔 x.690 中進行了解釋

當您對標簽進行編碼時(請參閱 x.690 文檔中的 8.1.2),您需要 3 條信息:

  • Class:通用、應用、上下文或私有
  • 原始/構造標志
  • 標簽號

讓我們以ECPrivateKey ...

  • Class 是通用的 ('00'B),它是為規范提供的 ASN.1 類型保留的 class (SEQUENCE)
  • 標志已構建。 因為 SEQUENCE 是組件的容器
  • 標簽號為 16(由 ASN.1 提供)

所以,回到你的問題:

標簽(nr=16, typ=32, cls=0)

  • nr 是標簽號
  • typ 是原始/構造標志
  • cls 是 class

請注意,名稱來自您正在使用的工具,而不是 ASN.1 詞匯表

編輯:它實際上在您提供的鏈接中得到了很好的總結https://en.wikipedia.org/wiki/X.690#Types

Go 到https://asn1.io/asn1playground/並編譯以下規范...

Example DEFINITIONS EXPLICIT TAGS ::= 
BEGIN
ECPrivateKey ::= SEQUENCE {
    version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey     OCTET STRING,
    -- parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, --
    publicKey  [1] BIT STRING OPTIONAL
}                                          
END

解碼以下值(我只是將 306B 放在您的值之前)...這意味着 107 字節的 SEQUENCE

306B0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90

你看到你的value是version、privateKey和publicKey的序列(可選參數不存在)

ECPrivateKey SEQUENCE: tag = [UNIVERSAL 16] constructed; length = 107
  version INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
    1
  privateKey OCTET STRING: tag = [UNIVERSAL 4] primitive; length = 32
    0x576a804c09c5a16f57d9bb46737b5448ea ...
  publicKey : tag = [1] constructed; length = 68
    BIT STRING: tag = [UNIVERSAL 3] primitive; length = 66
      0x0004f054ea725e78b6a8e8045420f1be81 ...
Successfully decoded 109 bytes.
rec1value ECPrivateKey ::= 
{
  version ecPrivkeyVer1,
  privateKey '576A804C09C5A16F57D9BB46737B5448EA ...'H,
  publicKey '00000100 11110000 01010100 11101010 011 ...'B
}

標簽 16 是SEQUENCESEQUENCE OF typ=32表示第 6 位設置為 1,因此 SEQUENCE 為構造形式。 事實上,在密碼學消息中,SEQUENCE 總是以構造形式使用。 我不知道cls=0是什么意思(我不熟悉 Python)。

SEQUENCE是具有任意字段的結構。 SEQUENCE OF是相同類型(原始或構造)元素的有序數組。 確切類型( SEQUENCE of SEQUENCE OF )由 ASN.1 模塊定義確定。

在您的情況下, value是一個有效的ECPrivateKey (根據RFC 5915 )結構,定義如下:

ECPrivateKey ::= SEQUENCE {
    version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey     OCTET STRING,
    parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
    publicKey  [1] BIT STRING OPTIONAL
}

和 ASN.1 編輯器中的轉儲:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM