【问题标题】:PEM to PrivateKeyPEM 到 PrivateKey
【发布时间】:2018-06-11 04:13:09
【问题描述】:

我需要将位于内存中的 PEM 格式的 RSA 私钥转换为 Android 上的PrivateKey

问题似乎已经解决了for public keys,但我正在努力让它为私钥工作。我正在尝试以下代码:

String pemkey = "MIICWwIBAAKBgQDIuL0SzG1+wgyaoyDyHvYIaG10ePXBHqaKTnYyZfY5RzaEFLE/vBdFN2Di7AMH3/5iN/YFQqLsVjKqzX3E3LM2dJOZ9qSWeYArSyQPbhy0eM/3amwchvtLvhVLm2UqVFLjiPGlyYX3D75ETD5tmgulAc5ZDRtGqYVoLKPmZ0USPwIDAQABAoGAErfDjf65UUJISZ1fw6Rmfic62csz47P3hNtHQ3Dlsra020FQvChOpTpCUzb+G1xkjQU58Iijx9VL+Uiba2HHZmiJX2LgS3KKqKFZKmbKZnZQTiw+2o+4AXhtcAYfSAJE9TgRPEhwhZmzV2cvfUk5AjnOghSn2gGjdD1g4xtH22ECQQD/ZbfEd2HEGqHf6j/AVMW+N/Q1xtYIB8r0CWxF6cNw5iq/8Ce9ujpnAFi0vgtojyKDlgwBp4XMU2C4is49EkFhAkEAyTH96mS8dExAAmi3Mm2seUIEOtKwuLD6BEECecPyZSIOd24tfNbmA7Ri6MpGjyLZoNoJQ0AJGcnWU1tnc8bXnwJAS+jYyP1OwrHDwUDnt+u6ZoJNBJrXzMU8LnKKivEjFPBkbm4b8cljSHAS7Y266FX6xS+Y2/kFzKhPjCo9iGtfoQJAOv39hYyj9TWmTw6FKLQfri49L0I3ru+1Xynwn+NkX2Ls+vfDPqeEKfHqTneA2NdPGGrV7HIKORWFUkuqubfD4QJAK60RuhDSeH+ZljcYLhbHLoTnja/uTcvDAd0M4ll2HUNId4jPbYl1qw7OQwfg8apKmGwp7HGW50o/EItvvJrR7w==";
byte[] encoded = Base64.decode(pemkey, Base64.DEFAULT);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey sessionkey = kf.generatePrivate(keySpec);

(密钥和我的比特币钱包不一样,所以不要打扰^^)

最后一行给出了错误

java.security.spec.InvalidKeySpecException:
        Must use RSAPublicKeySpec or PKCS8EncodedKeySpec;
        was java.security.spec.X509EncodedKeySpec

我测试了 pemkey 字符串在其他语言(例如 Python RSA.importkey)中可以正常工作。

编辑:

根据评论的建议(以及重复链接的问题的答案),我还尝试将X509EncodedKeySpec 替换为PKCS8EncodedKeySpec。然后我得到的新错误是

java.security.spec.InvalidKeySpecException:
        java.lang.RuntimeException:
        error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

【问题讨论】:

  • 您可以尝试使用PKCS8EncodedKeySpec 作为私钥,RSAPublicKeySpec 作为公钥。告诉我它是否有效,但肯定你必须使用新的私钥
  • 在将X509EncodedKeySpec 替换为PKCS8EncodedKeySpec 后,我得到了java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
  • 请查看我发布的重复链接
  • 这不是一个 PKCS8EncodedKeySpec,它是一个原始的 RSA 私钥。答案总是“不要那样做”。将密钥转换为 PKCS8Encoded 密钥规范。 Easy 回答。 Harder 回答。

标签: java android private-key pem


【解决方案1】:

感谢 Greggz 和 James 的 cmets,我能够让它工作。有两个问题:

  • X509EncodedKeySpec 必须替换为 PKCS8EncodedKeySpec
  • 提供的pemkey 是 PKCS#1(被“BEGIN RSA PRIVATE KEY”识别),但需要是 PKCS#8(被“BEGIN PRIVATE KEY”识别)。

【讨论】:

  • 很难理解为什么您首先将其转换为 base-64。在大多数情况下,它已经是。
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
相关资源
最近更新 更多