【问题标题】:convert string to private and public key (RSA)将字符串转换为私钥和公钥 (RSA)
【发布时间】:2017-09-08 09:11:13
【问题描述】:

作为私钥和公钥的两个字符串是:

    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........." ;

我已经阅读了其他问题并尝试了他们的解决方案,但没有任何效果....我有一个公钥和私钥都是字符串。我需要将它们转换为“密钥”,但我不断收到 java.security.spec .InvalidKeySpecException: java.security.InvalidKeyException ..at 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;

   }

【问题讨论】:

  • 去掉换行符+ "/n"
  • 仍是同样的问题..我得到java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:我改变了公共密钥: “MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH + wPrKYG1KVlzQUVtBghR8n9dzcShSZo0 + 3KgyVdOea7Ei7vQ1U4wRn1zlI5rSqHDzFitblmqnB2anzVvdQxLQ3UqEBKBfMihnLgCSW8Xf7MCH + DSGHNvBg2xSNhcfEmnbLPLnbuz4ySn1UB0lH2eqxy50zstxhTY0binD9Y + rwIDAQAB”跨度>
  • 我自己用公钥试了一下,效果很好
  • 换行符是\n,而不是/n。在字符串中,这看起来像 "\\n"
  • Necroed but for info:除了无关的/n,您的Public 确实是适用于Java X509EncodedKeySpec 的X.509-SPKI 公钥的base64,但您的Private是(base64 开头的)加密 PKCS8 私钥 (EncryptedPrivateKeyInfo) 而PKCS8EncodedKeySpec 必须未加密 或此处解密 .如果您有密码并且(可以)使用 BouncyCastle,请参阅stackoverflow.com/questions/49932334/…,否则会相当复杂。

标签: java encryption rsa encode


【解决方案1】:
//Function is in scala and need input parameter as string to be decrypted

def RsaDecryption(inParm: String): String = {
      val decoded_string = inParm.getBytes()
      val strBytes = getDecoder.decode(decoded_string)
      //println("String in Bytes "+strBytes)
      val DecryptKey  = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl3XbajBtSXXJ45h4OYxN6Acqry6+032MmMvB7R4vZ5t/sIEo7IAblOY/JGrHpikVWvmSw+vVyYlQ6W8EVi60/QvZXdqBf+Sbmu6JusuKX8ObkpDr4DXcJCvW1k6TGzuYN9X2WTIknRL8z/OabFAf79ybBFwDWq/vhoagMMDz03FCt0sydo83m878WW4pqVYzRW0OHug3dHhePuL21+oOIFK5+H3FMLT1mPV9FDVu33RtopsoKkkPJ8/MtowgRi+Uk8WHXEcf+NGQh3wee8Tz8LT2UuiCeq997PjfP8LipRyZ9wS0FsZb33Wgbcgns6MTBQPfsPz1b97x46IN7zsJeQIDAQAB"
      val DecBytes = Base64.getDecoder().decode(DecryptKey)
      val DecSpec = new X509EncodedKeySpec(DecBytes)
      val keyFactory = KeyFactory.getInstance("RSA")
      val DecKey = keyFactory.generatePublic(DecSpec)
      val decryptionCipher2 = Cipher.getInstance("RSA")
      decryptionCipher2.init(Cipher.DECRYPT_MODE, DecKey)
      val decryptedMessage = decryptionCipher2.doFinal(strBytes)
      val decmsg = new String(decryptedMessage)
      //println(DecKey)
      //println("Public key string "+getEncoder.encodeToString(DecKey.getEncoded()))
      return decmsg
    }

【讨论】:

    【解决方案2】:

    删除字符串声明中的换行符。这不是关键的一部分:

    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 它是一个多行字符串.. 不能按原样写... 除非全部放在一行中
    • @HayaRaed 不可能。我自己用公钥试过了,没有例外
    • @Jens 真的!!为什么我得到......线程“主”中的异常 java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:DER 输入,sun.security.rsa.RSAKeyFactory.engineGeneratePrivate 处的整数标记错误(未知来源)在 java.security.KeyFactory.generatePrivate(Unknown Source) 在 Main.loadPrivateKey(Main.java:144) 在 Main.main(Main.java:185) 原因:java.security.InvalidKeyException:IOException:DER 输入,整数标记sun.security.pkcs.PKCS8Key.decode 的错误(未知来源)
    • @HayaRaed 您参考了私钥部分。我不能检查它,因为你没有完整地显示它
    • 看起来它是 DER 而不是 RSA 密钥?
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2013-07-17
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多