1

我想序列化 McEliece 公钥 (BCMcEliecePublicKey),但总是得到 NotSerializableException。

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

我用 XMSSMT 尝试了相同的代码,它没有问题。Bouncy Castle 版本是新的 Release 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);
    }

我必须更改什么才能序列化密钥?

4

1 回答 1

0

简单的答案:你可能不能。

那个异常告诉你对应的类没有实现java.io.Serializable。

当您深入研究源代码时,您会发现:是的,完全正确。该类及其任何父类都没有实现该接口。

像这里一样,基类:McElieceParameters(不,CypherParameters 接口也没有实现 Serializable)。

在这里猜测:充气城堡不希望您对此类对象使用默认序列化!

然后:请理解“老派”java二进制对象序列化是当今很少有人会推荐使用的东西。如今,您更愿意将配置数据编译成类似“bean”的结构,以 JSON 文本的形式写入/读取它们。

最后,如果你真的想要,还有一些肮脏的技巧,例如看这里。但再说一遍:我建议不要花时间在上面。与 java 风格的对象序列化相比,现在有更好的方法来保存你的数据!

于 2019-05-10T18:21:17.890 回答