Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中序列化和反序列化RSA密钥对_Java_Security_Serialization_Rsa_Deserialization - Fatal编程技术网

如何在Java中序列化和反序列化RSA密钥对

如何在Java中序列化和反序列化RSA密钥对,java,security,serialization,rsa,deserialization,Java,Security,Serialization,Rsa,Deserialization,我想在我的Java应用程序中实现一些非常基本的安全性,但是我在一开始就被卡住了 我想做的是: 1-生成RSA密钥对 2-将这些密钥以序列化形式存储在我的数据库中,以便我可以在下一次运行应用程序时重新创建它们 3-对它们进行反序列化,这样我就可以将它们恢复为对象形式,并可以使用它们对内容进行加密/解密 问题是,我找不到一个关于如何在任何地方这样做的简单解释。 我尝试了标准的Java序列化/反序列化方法,但它们不起作用。我的代码如下: public static KeyPair Bin2Ke

我想在我的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”

关于如何正确地做到这一点,有什么建议吗

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


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

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

这对我很有用:

@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(); 
}

您使用的是什么版本的java?Sun的1.7版对我适用。如果您遇到异常,请发布异常的完整堆栈跟踪。Mac OSX上的JDK6对我也适用。@Master\T您声明异常来自第一个方法Bin2KeyPair。但是,堆栈跟踪声明它来自String2KeyPair方法。为什么会出现差异?String2KeyPair表示您已保存/还原字符串。它是字符串还是字节数组?你忘了关闭@pd40实际上,你需要关闭所有的*流对象。出于某种原因,在Android(API级别为16的设备,Jelly Bean 4.1)上,我在尝试这段代码时得到了一个“java.io.NotSerializableException:org.apache.harmony.xnet.provider.jsse.OpenSSLKey”。我在emulator上进行了测试,您的答案在Android 6.0上有效,但在4.1上无效。(适用于Android上试图在Java中序列化和反序列化RSA密钥对的任何人)
@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(); 
}