如何序列化 BCMcEliecePublicKey?

How do I serialize a BCMcEliecePublicKey?

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

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

我用 XMSSSMT 尝试了相同的代码,它没有问题。 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);
    }

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

简单的回答:你可能做不到。

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

当你深入研究源代码时,你会发现:是的,正是。 class 及其父 classes 都没有实现该接口。

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

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

然后:请理解 "old school" java 二进制对象序列化是目前很少有人会推荐使用的东西。如今,您宁愿将配置数据编译成一些 "bean" 结构,write/read 它们作为 JSON 文本。

最后,如果您真的想要,还有肮脏的技巧,例如参见 [​​=11=]。但再次强调:我建议 不要 花时间在这上面。与 java 样式对象序列化相比,现在有更好的方法来保存数据!