0

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

parsePublicKeyisfor when the public key is an encoded object - if the bitstring can't be decoded this routine throws an IOException.getPublicKeyData's的注释是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 中编码,并且可以将这两种格式转换回来并强制执行。

4

1 回答 1

2

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”中的内容。

于 2020-12-26T16:50:11.877 回答