最近我正在阅读 bouncycastle(java) 的代码,我注意到在使用 EdDSA 时,我们使用org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#getPublicKeyData
的是在org.bouncycastle.jcajce.provider.asymmetric.edec.BCEdDSAPublicKey#populateFromPubKeyInfo
. 但是在使用 RSA 时,我们使用的是org.bouncycastle.asn1.x509.SubjectPublicKeyInfo#parsePublicKey
in org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey#populateFromPublicKeyInfo
。
parsePublicKey
isfor 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 中编码,并且可以将这两种格式转换回来并强制执行。