如何序列化BCMcEliecePublicKey?

时间:2019-05-10 18:10:21

标签: java serialization bouncycastle post-quantum-cryptography

我想序列化McEliece公钥(BCMcEliecePublicKey),但始终会收到NotSerializableException。

 java.io.NotSerializableException: org.bouncycastle.pqc.crypto.mceliece.McEliecePublicKeyParameters

我使用XMSSMT尝试了相同的代码,并且可以正常工作。充气城堡版本是新的1.61版

这里有一个小代码作为示例:

    //key generation
    Security.addProvider(new BouncyCastlePQCProvider());
    KeyPairGenerator keygen = null;
    try {
        keygen = KeyPairGenerator.getInstance("McEliece", "BCPQC"); //XMSSMT
    } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
        System.out.println("Error: KeyPairGenerator could not be instanciated. " + e.getMessage());
    }

    //XMSSMTParameterSpec bcSpec = new XMSSMTParameterSpec(10, 5, XMSSMTParameterSpec.SHA256);
    McElieceKeyGenParameterSpec bcSpec = new McElieceKeyGenParameterSpec();

    try {
        keygen.initialize(bcSpec, new SecureRandom());
    } catch (InvalidAlgorithmParameterException e) {
        System.out.println("Error: Initialize failed. " + e.getMessage());
    }

    PublicKey pub = keygen.generateKeyPair().getPublic();

    //BCMcEliecePublicKey pubMcEliece = (BCMcEliecePublicKey) pub;
    //McEliecePublicKeyParameters keyParameters = new McEliecePublicKeyParameters(pubMcEliece.getN(), pubMcEliece.getT(), pubMcEliece.getG());

    //serialization
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(pub); //keyParameters
        System.out.println("OK");
    } catch (IOException e) {
        System.out.println(e);
    }

要序列化密钥,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

简单的答案:您可能做不到。

该异常告诉您相应的类不会实现java.io.Serializable。

当您深入研究源代码时,您会发现:确实如此。该类或其任何父类都没有实现该接口。

就像这里的基类:McElieceParameters(不,该接口CypherParameters也不实现Serializable)。

在这里猜测:有弹性的城堡不要想要使用默认的序列化对象!

然后:请理解,无论如何,这些天很少有人建议使用“古老的” java二进制对象序列化。如今,您宁愿将配置数据编译成类似“ bean”的结构,以JSON文本的形式写入/读取。

最后,如果您确实愿意,这里有肮脏的骇客,例如,请参见here。但是,再次提醒您:不要花时间在此上。与Java样式对象序列化相比,如今有很多更好的方法来持久化数据!