我想序列化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);
}
要序列化密钥,我需要更改什么?
答案 0 :(得分:0)
简单的答案:您可能做不到。
该异常告诉您相应的类不会不实现java.io.Serializable。
当您深入研究源代码时,您会发现:确实如此。该类或其任何父类都没有实现该接口。
就像这里的基类:McElieceParameters(不,该接口CypherParameters也不实现Serializable)。
在这里猜测:有弹性的城堡不要想要使用默认的序列化对象!
然后:请理解,无论如何,这些天很少有人建议使用“古老的” java二进制对象序列化。如今,您宁愿将配置数据编译成类似“ bean”的结构,以JSON文本的形式写入/读取。
最后,如果您确实愿意,这里有肮脏的骇客,例如,请参见here。但是,再次提醒您:不要花时间在此上。与Java样式对象序列化相比,如今有很多更好的方法来持久化数据!