【问题标题】:How to decide publicKey is raw bits or encoded and is private key is always pkcs8 encoded?如何确定 publicKey 是原始位还是编码的,并且私钥总是 pkcs8 编码的?
【发布时间】:2021-04-03 18:48:12
【问题描述】:

最近我在阅读bouncycastle(java)的代码,我注意到在使用EdDSA时,我们使用org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#getPublicKeyData来获取org.bouncycastle.jcajce.provider.asymmetric.edec.BCEdDSAPublicKey#populateFromPubKeyInfo中的publicKey。但是在使用 RSA 时,我们在 org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey#populateFromPublicKeyInfo 中使用 org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#parsePublicKey

parsePublicKey的评论是for when the public key is an encoded object - if the bitstring can't be decoded this routine throws an IOException.getPublicKeyData的评论是for when the public key is raw bits.

我很困惑我们如何决定使用哪种方法?这是写在EdDSA 规范还是其他地方?我四处搜寻,一无所获。

编辑:

以下是我收集的信息,如果我错了,请纠正我。

EdRsa publicKey 和 RSA publicKey 都是 ASN.1 编码,org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#getPublicKeyData 的使用只是因为 EdRsa publicKey 只包含一个组件(一个简单的字节数组),而 rsa key 包含两个组件(模块和 publicExp)。

几乎所有的私钥都是 pkcs#8 编码的,毕竟它被命名为“私钥信息语法标准”。但是rsa privateKey也可以在pkc#8之前的pkcs#1中编码,这两种格式可以转换回来强制。

【问题讨论】:

    标签: bouncycastle private-key eddsa


    【解决方案1】:

    RFC 5280 指定 X.509 公钥在 SubjectPublicKeyInfo ASN.1 序列中编码。这有两个部分:第一个('algorithm')是一个 AlgorithmIdentifier,它告诉您密钥用于什么算法,第二个('subjectPublicKey')是一个 ASN.1 BIT STRING,其解释取决于算法。

    对于 EdDSA,它在 X.509 中的使用在 RFC 8410 中指定。该 RFC 提供了在 Ed25519/Ed448 的“算法”中使用的 OBJECT IDENTIFIER,并保留了原始 EdDSA RFC - RFC 8032 中指定的公钥格式,即一个字节字符串,这就是“subjectPublicKey”中的内容。

    【讨论】:

    • OTOH RSA 在 3280 2.3.1 中指定为 ASN.1 结构,实际上与 PKCS1 (RFC 2313, 2437, 4347, 8017) 相同,但未在此处引用,在 4055 1.2 中再次确认.
    • 那么 EdDSA publicKey 是原始位,因为它只包含一个对象,而 rsa 密钥是 asn.1 编码的,因为它包含两个对象(模数和 publicExp)?
    • @NickAllen:不是真的。 EdDSA 密钥包含两个值,y 和 sign(x),采用 8032 定义的固定编码,不使用 ASN1。 ECDSA(和 ECDH)基于 X9.62 和 SEC1 在 5480 中描述了 两个 表示,两者都是固定的非 ASN1,它们在语义上表示两个值 x,y 或 x,sign_or_parity(y)。 OTOH DSA pubkey 是单个整数,但按照 3279 2.3.2 中的定义进行了 ASN1 编码。基本上这是标准化者做出的任意决定,您必须阅读他们写的内容。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多