Java:将公钥从字节数组转换为字符串并返回时出错

时间:2013-11-17 16:02:34

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

我有这个奇怪的错误,我无法找到解决方法。

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

  {  

     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.

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

2 个答案:

答案 0 :(得分:4)

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

为了让您意识到错误是什么,让我们说您使用ASCII而不是UTF8。 ASCII字符从0到127.所有其他128字节值不表示有效字符。因此,如果密钥包含任何这些值,则转换为String会丢失它们。任何编码基本上都是一样的(IIRC,ISO8859-1除外)。

答案 1 :(得分:0)

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

相关问题