【问题标题】:How to convert bouncycastle getEncoded format into X.509 format for RSA public key如何将 bouncycastle getEncoded 格式转换为 RSA 公钥的 X.509 格式
【发布时间】:2017-02-06 16:48:09
【问题描述】:

如果调用 'getEncoded' 时使用 base64 编码的公钥产生这个

mQENBFh1kBcBCADMUkNW2qFgeRnornjhT3lt73wTGcO9rt+Ktr1tcopmOPTfNq3
feZNFHRUsBt0Nnuj9+vSD2cwFRoZDNulhnBD8lAJYOD427uvV+KBDF/5pCQKh2S
mDK8tJI/ncLIlX4SFa8F9f36FySglpkzA59IFtHdUBz9w+PJRqUQ5MVRzNHYBbv
6aeIWwl46KrL3eibRgBDVuEOKAoesdb+xErs9cqg3KSVi01XBgr+XMSgOBz4J3f
J4HdibsJdz1+113aKT++4LUSuuyeVbw3K/ZgMkrsyeJw84sHhF2kDu61atSUsQE
nJwBF2sPA9V/i28fftxodgg5qbEs8egdsw/wxGzsfABEBAAG0K0NocmlzIFpoZW
5nIChjemhlbmcpIDxjemhlbmdAYXRsYXNzaWFuLmNvbT6JATkEEwEIACMFAlh1k
BcCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRARY82BslwTrMvtB/4t
LoRH91p09vM1sSQ77RC+XwQqhhvN1BAeqGxqZpgCO6Ld5KRh8f4mFY8nXjDCSyy
ydTBzIUp6aG0f+2EBhArtk/oU/pi8D4zHoeBkrl23/234s1kBI5F2g2kd6itwP8
ekimaUyNFdPIN1dPwdxhuspOUtFNR+HsT3BT32v4Afd7sWVNTFrkapxTdxxZkVb
+FS0wbuzFzB2gb8AvEGevzF/hQXOf3r8QzUQoEZ14pigNu/arlXzEuzXJXXT/AQ
nAzbVENoFrhojxqEU7RxH8J4nao8OfpYfL7w3T7PC3nFFSTYSwvYItGkl9DPPiZ
GWZTrb6VfpFGNLHwCoLOaf8ShsAIAAA==

如何将其转换为 X.509?

我需要这样做的原因是创建一个 java.security.PublicKey 对象。我也在这里问过:https://security.stackexchange.com/questions/150422/what-format-is-bouncycastle-opengpg-public-key/150427#150427 并且我已经确认它是一个长度为 2048 的密钥,但通常使用 X.509 标准读取 PublicKeys。如果有另一种阅读方式,那就太好了。

【问题讨论】:

  • 我不知道“通常”。 SSL/TLS 和 S/MIME 使用包含公钥的 X.509 证书,这些肯定有很大的用途,但 PGP 和 SSH 都有自己的公钥格式,它们不是 X.509,也被广泛使用。 pedrofb 的回答是正确的,Java crypto out-of-the-box 仅支持 X.509 并且(正如我在安全中确认的那样)这个密钥是 PGP 而不是 X.509。您可能会很高兴知道 SSH 格式的开销要少得多,并且在大小上更接近原始密钥。

标签: bouncycastle


【解决方案1】:

X.509 是用于管理数字证书和公钥加密的公钥基础架构的标准。 X509 证书包括一个公钥、一组属性,如 subjectissuerserialnumberkeyusage,以及颁发证书的证书颁发机构的签名

因此公钥和X509certificate的内容是不等价的。可以从证书中提取公钥,但使用公钥无法推断出证书。事实上,多个 x509 证书可能包含相同的公钥

根据您的链接,密钥是 OpenPGP 格式。 Java 没有此键的默认阅读器,但您可以使用 Bouncycastle (package bcpg)

//Convert key from base64 to binary
byte pubKeyBinary[] =DatatypeConverter.parseBase64Binary(pubKeyBase64);

//load Public key with bouncycastle
Security.addProvider(new BouncyCastleProvider());
PGPPublicKeyRing  pgpPub = new PGPPublicKeyRing(pubKeyBinary, new JcaKeyFingerprintCalculator());
PublicKey pubKey = 
   new JcaPGPKeyConverter().setProvider("BC").getPublicKey(pgpPub.getPublicKey());

【讨论】:

  • base64 键为什么比标准的 X.509 键长?
  • 我在答案中包含了根据您的链接加载密钥的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2011-07-28
  • 2017-10-14
  • 2012-02-23
相关资源
最近更新 更多