Как мне сериализовать 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!

Другие вопросы по тегам