如何确定 publicKey 是原始位还是编码的,私钥总是 pkcs8 编码的?

How to decide publicKey is raw bits or encoded and is private key is always pkcs8 encoded?

最近在读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包含两个组件(modules和publicExp ).

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

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

就 EdDSA 而言,它在 X.509 中的使用在 RFC 8410. That RFC provides the OBJECT IDENTIFIER to use in the 'algorithm' for Ed25519/Ed448 and retains the public key format specified in the original EdDSA RFC - RFC 8032 中指定,即一个字节字符串,所以这就是 'subjectPublicKey'.

中的内容