代码之家  ›  专栏  ›  技术社区  ›  matec

PEM至PrivateKey

  •  3
  • matec  · 技术社区  · 7 年前

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

    问题似乎已经解决了 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
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   matec    7 年前

    多亏了格雷格和詹姆斯的评论,我才得以让它发挥作用。有两个问题:

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