Как мне сериализовать BCMcEliecePublicKey? - PullRequest
1 голос
/ 10 мая 2019

Я хочу сериализовать открытый ключ 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 Ответ

0 голосов
/ 10 мая 2019

Простой ответ: вы, вероятно, не можете.

Это исключение говорит вам, что класс соответствующего не реализует java.io.Serializable.

И когда вы покопаетесь в исходном коде, вы обнаружите: да, именно так. Ни этот класс, ни какой-либо из его родительских классов не реализуют этот интерфейс.

Как и здесь, базовый класс: McElieceParameters (и нет, этот интерфейс CypherParameters также не реализует Serializable).

Гадание здесь: надувной замок не хочет использовать для этих объектов сериализацию по умолчанию!

И затем: пожалуйста, поймите, что сериализация Java-двоичных объектов "старой школы" - это то, что мало кто рекомендовал бы использовать в наши дни в любом случае. В настоящее время вы предпочитаете компилировать ваши данные конфигурации в некоторые "bean" -подобные структуры, чтобы записывать / читать их как текст JSON.

Наконец, если вы действительно хотите, есть грязные хаки, см., Например, здесь . Но опять же: я бы посоветовал не тратить на это ваше время. В наши дни есть намного лучшие способы сохранения ваших данных по сравнению с сериализацией объектов в стиле Java!

...