如何序列化 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 样式对象序列化相比,现在有更好的方法来保存数据!
我想序列化 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 样式对象序列化相比,现在有更好的方法来保存数据!