1

有谁知道,或者可能会指出,提示我到有记录的资源?

我想要的是这样的信息:

PrivateKeyInfo ::= SEQUENCE {
  version         Version, (1byte)
  algorithm       AlgorithmIdentifier,(2byte)
  PrivateKey      OCTET STRING (xbyte)
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER, (1byte)
  parameters      ANY DEFINED BY algorithm OPTIONAL (ybyte)
}
// separators are encoded as 0

关键部分实际上是字节和分隔符是什么,所以我可以手动解析它。

实际上,我很乐意仅获得有关所有格式的信息。因为现在首先关心的是 openssl 密钥格式。其次,openssh 密钥格式似乎完全不同。

4

2 回答 2

1

好的,基本前提是了解ASN.1

ASN.1 是描述数据结构的抽象语法规范。它是递归的和复杂的。我感兴趣的是它定义的确切数据结构,而不是合成器。

所以任何可消化标记的简单顶部表示是:

|Type(1byte)|Length(1-xbyte)|Value(ybyte)|

Type: |class(2bit)|form(1bit)|tag(5bit)|

Type.class 被定义为意味着

  • 00:UNIVERSAL,一种普遍有效的类型
  • 01: APPLICATION, 一种特定于应用程序的类型
  • 10:特定于上下文
  • 11:私人

只有 UNIVERSAL 类符合显示的结构。其他类可以完全重新定义一切。

Type.form 被定义为

  • 0:基元,如 INTEGER
  • 1:构造,如 SEQUENCE

Type.tag 被定义为

  • 0x00:EOC
  • 0x01:布尔值
  • 0x02:整数
  • 0x03:位字符串
  • 0x04: OCTET_STRING
  • 0x05:空
  • 0x06: 对象标识符
  • 0x07:对象描述符
  • 0x08:外部
  • 0x09:真实
  • 0x0A:枚举
  • 0x0B:嵌入_PDV
  • 0x0C:UTF8 字符串
  • 0x10:序列
  • 0x11:设置
  • 0x12:数字字符串
  • 0x13:可打印字符串
  • 0x14:电传字符串
  • 0x15: 可视文本字符串";
  • 0x16:IA5字符串
  • 0x17:UTC时间
  • 0x18:广义时间
  • 0x19:图形字符串
  • 0x1A:可见字符串
  • 0x1B:通用字符串
  • 0x1C:通用字符串
  • 0x1E:BMP字符串

长度可以定义

  • Short -> 当定义为 Primitive -> 第一位为 0 其他 7 位定义值
  • Long -> 当定义为 Primitive -> 第一位为 1 其他 7 位定义后面长度值的长度
  • 不定 -> 这里长度值以 2 个空字节结束
于 2020-08-04T06:38:14.570 回答
1

OpenSSL Ed25519 密钥根据 RFC8410 进行编码:

   OneAsymmetricKey ::= SEQUENCE {
      version Version,
      privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
      privateKey PrivateKey,
      attributes [0] IMPLICIT Attributes OPTIONAL,
      ...,
      [[2: publicKey [1] IMPLICIT PublicKey OPTIONAL ]],
      ...
   }

   PrivateKey ::= OCTET STRING

   PublicKey ::= BIT STRING

   For the keys defined in this document, the private key is always an
   opaque byte sequence.  The ASN.1 type CurvePrivateKey is defined in
   this document to hold the byte sequence.  Thus, when encoding a
   OneAsymmetricKey object, the private key is wrapped in a
   CurvePrivateKey object and wrapped by the OCTET STRING of the
   "privateKey" field.

   CurvePrivateKey ::= OCTET STRING

为了进一步澄清,有一个示例密钥:

30 2E 02 01 00 30 05 06  03 2B 65 70 04 22 04 20
5F E5 F1 D9 02 D6 B4 2E  55 B6 E4 E4 01 E9 87 C3
F2 BC 7F 95 D3 31 88 86  3D E9 17 60 B7 D5 84 92

30 2E => SEQUENCE of 3 Elements having length of 46
02 01 00 => INTEGER of length 1 being 00 (Version)
30 05 => SEQUENCE of 1 Element having length of 5
06  03 2B 65 70 => OBJECT IDENTIFIER of length 3 being 2B 65 70 (PrivateKeyAlgorithmIdentifier)
04 22 => OCTET STRING of Length 34
04 20 => OCTET STRING of Length 32
Value of the real OCTET STRING (PrivateKey):
5F E5 F1 D9 02 D6 B4 2E  55 B6 E4 E4 01 E9 87 C3
F2 BC 7F 95 D3 31 88 86  3D E9 17 60 B7 D5 84 92
于 2020-08-04T10:09:03.303 回答