【问题标题】:Java: Error while converting Public Key from byte array to string and backJava:将公钥从字节数组转换为字符串并返回时出错
【发布时间】:2013-11-17 16:02:33
【问题描述】:

我有一个奇怪的错误,我找不到解决办法。

所以我生成了一个公钥-私钥对,将其转换为字节数组,然后从数组中恢复原始密钥。没有错误

  {  

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
     kpg.initialize(1024);
     KeyPair keyPair = kpg.generateKeyPair();
     PublicKey pub = keyPair.getPublic();
     byte[] pubBytes = pub.getEncoded();

     try
     {
         // to recover the key
        KeyFactory kf = KeyFactory.getInstance("RSA");

        PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pubBytes));

     }
     catch(Exception e)
     {
         System.out.println(e.getMessage());
     }

     System.out.println("Finish");

之后我重复相同的步骤,但在恢复密钥之前,我将字节数组转换为字符串,然后再返回。在这种情况下,我会出错。

     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
     kpg.initialize(1024);
     KeyPair keyPair = kpg.generateKeyPair();
     PublicKey pub = keyPair.getPublic();
     byte[] pubBytes = pub.getEncoded();

     try
     {

         String pub1 = new String(pubBytes, "UTF-8"); 

         byte[] pub2 = pub1.getBytes("UTF-8");

         // to recover the key
        KeyFactory kf = KeyFactory.getInstance("RSA");

        PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));

     }
     catch(Exception e)
     {
         System.out.println(e.getMessage());
     }

错误发生在一行:

PublicKey pub_recovered = kf.generatePublic(new X509EncodedKeySpec(pub2));

它说:

java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=111, too big.

有谁知道如何解决以及为什么会发生这种情况?该消息说无效密钥异常,但是由于它在第一种情况下起作用,我更倾向于在字节转换期间发生错误。完全没有意义。

【问题讨论】:

  • String pub1 = new String(pubBytes, "UTF-8"); 是没有意义的。

标签: java utf-8 bytearray public-key typeconverter


【解决方案1】:

密钥包含任意字节。这些字节不一定代表有效的 UTF8 字符。因此,您不应该将它们转换为字符串,因为这是有损转换。如果你真的需要一个字符串,那么使用 Hex 或 Base64 编码。

为了让您了解错误是什么,假设您使用 ASCII 而不是 UTF8。 ASCII 字符从 0 到 127。所有其他 128 字节值不代表有效字符。因此,如果键包含任何这些值,则转换为 String 会丢失它们。任何编码都基本相同(IIRC、ISO8859-1 除外)。

【讨论】:

    【解决方案2】:

    我之前也遇到过类似的问题,忘记导入项目中包含key的配置文件,我的配置文件是conf/XX.properties

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 2014-02-21
      • 2012-02-24
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多