openssl生成的ed25519密钥的精确字节格式

openssl生成的ed25519密钥的精确字节格式,openssl,format,openssh,ed25519,Openssl,Format,Openssh,Ed25519,是否有人知道,或可能指出,暗示我这是记录在案的资源 我想要的是这样的信息: PrivateKeyInfo ::= SEQUENCE { version Version, (1byte) algorithm AlgorithmIdentifier,(2byte) PrivateKey OCTET STRING (xbyte) } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT

是否有人知道,或可能指出,暗示我这是记录在案的资源

我想要的是这样的信息:

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
cruzial部分实际上是字节和分隔符,因此我可以手动解析它

事实上,我很高兴能得到所有格式的信息。
因为现在首先要考虑的是openssl密钥格式。其次,openssh密钥格式似乎完全不同。

好的,基本上先决条件是理解ASN.1

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

因此,任何可消化代币的简单顶部表示为:

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

Type: |class(2bit)|form(1bit)|tag(5bit)|
Type.class定义为

  • 00:UNIVERSAL,一种通用有效的类型
  • 01:应用程序,一种特定于应用程序的类型
  • 10:特定于上下文
  • 11:私人
只有通用类符合显示的结构。 其他类完全可以重新定义一切

Type.form定义为

  • 0:原语,如整数
  • 1:构造,如序列
Type.tag定义为

  • 0x00:EOC
  • 0x01:布尔值
  • 0x02:整数
  • 0x03:位\u字符串
  • 0x04:八位字节字符串
  • 0x05:NULL
  • 0x06:对象标识符
  • 0x07:对象描述符
  • 0x08:外部
  • 0x09:真实
  • 0x0A:枚举
  • 0x0B:嵌入式PDV
  • 0x0C:UTF8String
  • 0x10:序列
  • 0x11:设置
  • 0x12:数值字符串
  • 0x13:可打印字符串
  • 0x14:电传字符串
  • 0x15:可视图文字符串”
  • 0x16:IA5String
  • 0x17:UTCTime
  • 0x18:通用化时间
  • 0x19:图形字符串
  • 0x1A:VisibleString
  • 0x1B:通用字符串
  • 0x1C:通用字符串
  • 0x1E:BMPString
长度可以定义

  • 短->定义为基元->第一位为0其他7位定义值
  • Long->定义为基元时->第一位为1,其他7位定义以下长度值的长度
  • 不确定->此处长度值以2个空字节终止

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