如何在Java中序列化和反序列化RSA KeyPair

时间:2012-12-15 17:22:46

标签: java security serialization rsa deserialization

我想在我的Java应用程序中实现一些非常基本的安全性,但是我一开始就陷入困境。

我想做的是: 1 - 生成RSA密钥对 2 - 以序列化形式将这些密钥存储在我的数据库中,这样我就可以在下次运行应用程序时重新创建它们 3 - 对它们进行反序列化,以便我可以将它们恢复为对象形式,并可以使用它们来加密/解密。

问题是,我无法找到关于如何在任何地方执行此操作的直接解释。 我尝试了标准的Java序列化/反序列化方法,但它们不起作用。我的代码如下:

    public static KeyPair Bin2KeyPair(byte[] data){
    try{
        ByteArrayInputStream b = new ByteArrayInputStream(data);
        ObjectInputStream o = new ObjectInputStream(b);
        Object obj =o.readObject();
        return((KeyPair)obj);
    }catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static byte[] KeyPair2Bin(KeyPair kp){

    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o;
    try {
        o = new ObjectOutputStream(b);
        o.writeObject(kp);
        return b.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
    }   
    return  null;
}

我遇到的问题是第二种方法工作正常(将键序列化为字节数组)但第一种方法失败,抛出ClassCastException,告诉我无法将对象强制转换为“KeyPair”。 / p>

有关如何正确执行此操作的任何提示?

编辑:这是异常(它在“return((KeyPair)obj)”抛出;“在第一种方法中”:

java.lang.ClassCastException: [B cannot be cast to java.security.KeyPair
at DARCOServer.security.SecurityManager.String2KeyPair(SecurityManager.java:34)
at DARCOServer.security.SecurityManager.GenerateServerKeys(SecurityManager.java:122)
at DARCOServer.MainClass.main(MainClass.java:13)

2 个答案:

答案 0 :(得分:4)

这对我有用:

@Test
public void serializeTest() throws Exception {

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    KeyPair keyPair = kpg.generateKeyPair();
    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o =  new ObjectOutputStream(b);
    o.writeObject(keyPair);
    byte[] res = b.toByteArray();

    o.close();
    b.close(); 

    ByteArrayInputStream bi = new ByteArrayInputStream(res);
    ObjectInputStream oi = new ObjectInputStream(bi);
    Object obj = oi.readObject();
    assertTrue(obj instanceof KeyPair);

    oi.close();
    bi.close(); 
}

答案 1 :(得分:0)

回答自己,以防有人遇到同样的问题:

不知道它是什么,但是使用BouncyCastle SPI代替默认的JDK似乎可以解决我的问题,现在它正常工作。