[英]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 條信息:
讓我們以ECPrivateKey
...
所以,回到你的問題:
標簽(nr=16, typ=32, cls=0)
請注意,名稱來自您正在使用的工具,而不是 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 是SEQUENCE
或SEQUENCE 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.