当前位置: 首页 > 知识库问答 >
问题:

如何确定公钥是原始比特还是编码的,私钥总是pkcs8编码的?

赫连昕
2023-03-14

最近我在阅读bouncycastle(java)的代码,我注意到在使用EdDSA时,我们使用org.bouncycastle.asn1.x509.subjectPublicKeyInfo#getPublicKeyDataorg.bouncycastle.jcajce.provider.assemetric.edec.bceddsapublickey#PopulateFromPubKeyInfo中获取publicKey。但是在使用RSA时,我们在org.bouncycastle.jcajce.provider.assymetric.RSA.bcrsapublickey#populateFrompublickeyInfo中使用org.bouncycastle.asn1.x509.subjectPublicKeyInfo#parsePublicKeyInfo

ParsePublicKey的注释是,用于当公钥是编码对象时--如果位字符串不能被解码,这个例程将抛出IOException。GetPublicKeyData的注释是,用于当公钥是原始位时。

我很困惑,我们如何才能决定使用哪种方法?这是在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中,这两种格式可以被反向转换和强制转换。

共有1个答案

鞠建安
2023-03-14

RFC 5280指定X.509公钥以SubjectPublicKeyInfo ASN.1序列编码。它有两个部分:第一部分('algorithm')是一个算法中间符,它告诉您密钥用于什么算法,第二部分('subject publickey')是一个ASN.1位字符串,其解释依赖于算法。

对于EDSA,它在X.509中的使用是在RFC8410中指定的。RFC提供了在ED25519/ED448的“算法”中使用的对象标识符,并保留了原始EdDSA RFC-RFC 8032中指定的公钥格式,即字节字符串,因此这就是“主题公钥”中的内容。

 类似资料:
  • 当我用OpenSSL生成RSA密钥对时,似乎私钥(私有指数)总是小于公钥(模)。它是由RSA设计的吗?

  • 我已经在服务器上配置了HSM,现在使用下面的示例代码解密数据 它第一次运行,第二次显示错误 私钥必须是RSAPrivate(Crt)密钥的实例或有PKCS#8编码

  • 我使用secp192r1曲线生成了ECC公钥和私钥。公共密钥数组长度为75,私有密钥数组长度125。为什么私钥比公钥长?为什么私钥的长度不是公钥的两倍?为什么由于secp192r1私钥不是192位=24字节?

  • 问题内容: 我有一个私钥文件(PEM BASE64编码)。我想在其他地方使用它解密其他数据。使用Java,我尝试读取文件并解码其中的BASE64编码数据。这是我尝试的代码段。 import java.io.; import java.nio.ByteBuffer; import java.security. ; import java.security.spec.PKCS8EncodedKeySp

  • 我有一个私钥文件(PEM BASE64编码)。我想用它来解密一些其他数据。使用Java我试着读取文件并解码其中的BASE64编码数据。这是我尝试的代码片段.... 我得到以下错误 类似的问题已经贴在这里,但那些对我没有用。几乎所有的人都建议使用Bouncycastle provider,而Bouncycastle provider并不愿意使用FIPS兼容的provider,并且不确定BC prov