Как мне сериализовать BCMcEliecePublicKey?
Я хочу сериализовать открытый ключ McEliece (BCMcEliecePublicKey), но всегда получаю NotSerializableException.
java.io.NotSerializableException: org.bouncycastle.pqc.crypto.mceliece.McEliecePublicKeyParameters
Я попробовал тот же код с XMSSMT, и он работал без проблем. Версия Bouncy Castle - это новая версия 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 ответ
Простой ответ: вы, вероятно, не можете.
Это исключение говорит вам, что класс соответствующего не реализует java.io.Serializable.
И когда вы покопаетесь в исходном коде, вы обнаружите: да, именно так. Ни этот класс, ни какой-либо из его родительских классов не реализуют этот интерфейс.
Как и здесь, базовый класс: McElieceParameters (и нет, этот интерфейс CypherParameters также не реализует Serializable).
Угадайте здесь: надувной замок не хочет, чтобы вы использовали сериализацию по умолчанию для таких объектов!
А потом: пожалуйста, поймите, что сериализацию двоичных объектов Java старой школы - это то, что мало кто рекомендовал бы использовать в эти дни в любом случае. В настоящее время вы предпочитаете компилировать ваши данные конфигурации в некоторые структуры типа "bean", чтобы записывать / читать их как текст JSON.
Наконец, если вы действительно хотите, есть грязные хаки, см. Здесь, например. Но опять же: я бы посоветовал не тратить на это ваше время. В наши дни есть намного лучшие способы сохранить ваши данные, по сравнению с сериализацией объектов в стиле Java!