【问题标题】:Kotlin convert PKCS1 to PKCS8Kotlin 将 PKCS1 转换为 PKCS8
【发布时间】:2019-04-02 09:43:12
【问题描述】:

我是这样生成私钥的:

val keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC")
val spec = ECGenParameterSpec("secp256k1")
keyPairGenerator.initialize(spec, SecureRandom())
keyPairGenerator.genKeyPair()
val kp = keyPairGenerator.generateKeyPair()

我得到了144 长度的私钥。然后我将我的私钥转换为PKCS1 格式:

val pkInfo = PrivateKeyInfo.getInstance(kp.private.encoded)
val encodable = pkInfo.parsePrivateKey()
val primitive = encodable.toASN1Primitive()
val pkcs1 = primitive.encoded //118 length here

在某些情况下,我需要将 pkcs1 转换回 pkcs8。这对我来说还不清楚。找不到任何可行的解决方案。有没有可能?

附:发现pkcs8到pkcs1的转换here

【问题讨论】:

  • PKCS#1 定义了 RSA 格式。您可能正在使用 X9.62 格式的私钥。 PKCS#8 包含此密钥,因此将其转换为 X9.62 可能比其他方式更容易/
  • 不确定我是否理解你。根据 secp256k1 我原来的私钥不是 X9.62 格式的。还是您的意思是 PKCS1 格式的密钥?
  • 同样,PKCS#1 在这里不起作用。 PKCS#1 代表 RSA 实验室的公钥加密标准。 #1 指定 RSA 本身。您可以在线阅读 RFC。它实际上与ECC无关。只有 RSA 公钥和私有密钥可以使用 PKCS#1 存储,并且可以用 PKCS#8 包装以指示密钥类型并可能对它们进行加密。 PKCS#8 也可用于包装其他格式,例如 X9.62 密钥,通常是 Prime 曲线或 Koblitz 曲线。
  • Thnx,但我仍然不知道该怎么做。

标签: java encryption kotlin private-key pkcs#8


【解决方案1】:

如前所述,私钥采用 X9.62 格式。它不能是 PKCS#1 格式,因为该格式指定的是 RSA,而不是 ECC。

此外,您的 PKCS#8 私钥包含的信息比您从中提取的 X9.62 格式的私钥更多。可以看到PKCS#8的解码here

SEQUENCE (3 elem)
  INTEGER 0
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.10045.2.1 ecPublicKey (ANSI X9.62 public key type)
    OBJECT IDENTIFIER 1.3.132.0.10 secp256k1 (SECG (Certicom) named elliptic curve)
  OCTET STRING (1 elem)
    SEQUENCE (4 elem)
      INTEGER 1
      OCTET STRING (32 byte) 9CDDA50E9E839066257291DBCBDBD9A8A177F350AA522A128163AB7E955622C5
      [0] (1 elem)
        OBJECT IDENTIFIER 1.3.132.0.10 secp256k1 (SECG (Certicom) named elliptic curve)
      [1] (1 elem)
        BIT STRING (520 bit) ... the optional public key ...

内部 X9.62 密钥是序列八位字节字符串中,秘密 (S) 是 32 字节八位字节字符串。

所以你必须添加回信息。这是一个AlgorithmIdentifier,表示ecPublicKey操作以及使用的曲线(重复公钥)。

所以事不宜迟,重新创建 PKCS#8 结构的操作(x962 替换 pkcs1):

ASN1Primitive prim = ASN1Primitive.fromByteArray(x962);
PrivateKeyInfo keyInfo = new PrivateKeyInfo(new AlgorithmIdentifier(
        X9ObjectIdentifiers.id_ecPublicKey,
        SECObjectIdentifiers.secp256k1), prim);

请注意,这是 PKCS#8 的未加密变体,仅显示私钥类型。加密变体加密此结构并添加有关使用的包装机制的信息(例如 AES 加密)。

【讨论】:

  • 我知道我好像在跟踪你,但是私钥 ASN.1 是否已添加到 X9.62 中?没有炮轰 moolah 我只有 -1999 的草稿,但 SECG:SEC1v2-2009 引用参数、公钥和签名到 rfc3279-2002 和 rfc5480-2009 依次分别引用 X9.62-1999 和 -2005,但两者都没有SEC1 和 rfc5915-2010 都引用了私钥; SEC1 直接定义(近乎平凡的)i2os,而 rfc5915 引用 rfc3447=PKCS1v2.1。因此,我一直引用 SEC1 作为 EC 私钥格式。 (我当然同意这不是 PKCS1。)
  • 我也没有,我想 RFC 是从 SEC1 v2,C4 部分获取的。我只是假设 X9.62,因为它在 PKCS#8 中作为 OID。但是,可能是 SEC1 只是将现有的 OID 重新用于私钥格式,而 X9.62 根本没有指定它。毕竟执行 ECC 操作并不真正需要它。
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2023-04-04
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多