将字符串转换为私钥和公钥(RSA)

8

私钥和公钥是两个字符串:

    static String Public =          
       "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH+wPrKYG1KVlzQUVtBghR8n9d" + "/n" +
     "zcShSZo0+3KgyVdOea7Ei7vQ1U4wRn1zlI5rSqHDzFitblmqnB2anzVvdQxLQ3Uq" + "/n" +
    "EBKBfMihnLgCSW8Xf7MCH+DSGHNvBg2xSNhcfEmnbLPLnbuz4ySn1UB0lH2eqxy5" + "/n"+
     "0zstxhTY0binD9Y+rwIDAQAB"+ "/n";
    static String Private = 
        "MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIr5NQ/LYPG/UCAggA" +"/n"+
      "MBQGCCqGSIb3DQMHBAiLh89iGSkmoASCAoBCpAo9/IzDE3yGhvWr9RgozE7revOo" +"/n"+
          "V2OXmU+d0+WYAAx2GYVaUCbFVrmgiVmrbiTgLUMXAGIpvxQ2rzyIvRHW/RN3Gcky" +"/n"+
        "qR/AwBatzixqrnoS4aD1/Ovjr4hwde4XHYbPEilZZuVAJFiznhy73qm/So4XghSY........." ;

我已经阅读了其他的问题并尝试了它们的解决方案,但是没有什么作用...我有一个公钥和私钥都是字符串。 我需要将它们转换为'Key',但我一直得到java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException.. 在generatePublic和generatePrivate函数中...此外,这些密钥只是用于测试,因此,如果其他人知道它们也没关系...

      public static Key loadPublicKey(String stored) throws GeneralSecurityException, IOException 
       {
      byte[] data = Base64.getDecoder().decode((stored.getBytes()));
      X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
      KeyFactory fact = KeyFactory.getInstance("RSA");
      return fact.generatePublic(spec);

        }


public static Key loadPrivateKey(String key64) throws     GeneralSecurityException, IOException {
        byte[] clear = Base64.getDecoder().decode(key64.getBytes());
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        PrivateKey priv = fact.generatePrivate(keySpec);
        Arrays.fill(clear, (byte) 0);
        return priv;

   }

4
删除换行符+/n - Jens
仍然存在相同的问题...我收到了java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException错误:我将公钥更改为:"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH+wPrKYG1KVlzQUVtBghR8n9dzcShSZo0+3KgyVdOea7Ei7vQ1U4wRn1zlI5rSqHDzFitblmqnB2anzVvdQxLQ3UqEBKBfMihnLgCSW8Xf7MCH+DSGHNvBg2xSNhcfEmnbLPLnbuz4ySn1UB0lH2eqxy50zstxhTY0binD9Y+rwIDAQAB" - Haya Raed
我已经尝试使用公钥进行了测试,它可以正常工作。 - Jens
2
换行符是\n,而不是/n。在字符串中,它看起来像是"\\n" - Artjom B.
提供信息:除了无用的“/n”之外,你的“Public”确实是适用于Java“X509EncodedKeySpec”的X.509-SPKI公钥的base64编码,但是你的“Private”是(开头部分的)加密PKCS8私钥(EncryptedPrivateKeyInfo),而“PKCS8EncodedKeySpec”必须是未加密或者在这里解密。如果你有密码并且(可以)使用BouncyCastle,请参见https://dev59.com/yqrka4cB1Zd3GeqPisPT。否则就比较复杂了。 - dave_thompson_085
1个回答

8

在字符串声明中删除换行符。这不是密钥的一部分:

static String Public =          
       "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH+wPrKYG1KVlzQUVtBghR8n9d" +
     "zcShSZo0+3KgyVdOea7Ei7vQ1U4wRn1zlI5rSqHDzFitblmqnB2anzVvdQxLQ3Uq" + 
    "EBKBfMihnLgCSW8Xf7MCH+DSGHNvBg2xSNhcfEmnbLPLnbuz4ySn1UB0lH2eqxy5" +
     "0zstxhTY0binD9Y+rwIDAQAB";
static String Private = 
        "MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIr5NQ/LYPG/UCAggA" +
      "MBQGCCqGSIb3DQMHBAiLh89iGSkmoASCAoBCpAo9/IzDE3yGhvWr9RgozE7revOo" +
          "V2OXmU+d0+WYAAx2GYVaUCbFVrmgiVmrbiTgLUMXAGIpvxQ2rzyIvRHW/RN3Gcky" +
        "qR/AwBatzixqrnoS4aD1/Ovjr4hwde4XHYbPEilZZuVAJFiznhy73qm/So4XghSY........." ;

我已经尝试了以下代码:

我已经尝试了以下代码:

  public static void main(String[] args) throws GeneralSecurityException, IOException {
      System.out.println(loadPublicKey(Public));

  }

  public static Key loadPublicKey(String stored) throws GeneralSecurityException, IOException 
  {
 byte[] data = Base64.getDecoder().decode((stored.getBytes()));
 X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
 KeyFactory fact = KeyFactory.getInstance("RSA");
 return fact.generatePublic(spec);

   }

输出结果如下:

Sun RSA public key, 1024 bits
  modulus: 140431102839105138202102866401190456107365606715815288536913018579006717438700259314092212104831553250527764925385527697411165705192297577022746989837839401358787285684108054389360182109284048524426941021357601686464156659759470495649944686235380003772357268264646549523784880655065600797504478771675703688879
  public exponent: 65537

@zaph 这是一个由多行组成的字符串.. 除非将其全部放在一行中,否则无法直接编写。 - Haya Raed
@HayaRaed 不可能的。我已经用公钥自己尝试过了,没有任何异常。 - Jens
@Jens 真的吗!!为什么我会得到.... Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) at java.security.KeyFactory.generatePrivate(Unknown Source) at Main.loadPrivateKey(Main.java:144) at Main.main(Main.java:185) Caused by: java.security.InvalidKeyException: IOException : DER input, Integer tag error at sun.security.pkcs.PKCS8Key.decode(Unknown Source) - Haya Raed
@HayaRaed,你提到了私钥部分。我无法检查它,因为你没有完全展示它。 - Jens
看起来这是 DER 而不是 RSA 密钥? - Jens
如何加载私钥? - Navin Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接