Схема подписи BLS в Java: хранение и загрузка ключей - PullRequest
0 голосов
/ 20 декабря 2018

Нам нужен метод для подписи сообщений с использованием как можно более коротких подписей, встречающихся в схеме BLS, которая обещает довольно короткие подписи.При использовании реализации JPBC примеры просты в настройке и запуске, но в них отсутствует довольно важная часть: хранение и загрузка секретных ключей.

  • Пример с текущего веб-сайта JPBC BLS 1 не содержит никакого хранилища, он просто проверяет сообщение, используя экземпляры в ОЗУ.
  • Более старый пример с того же сайта 2 , который больше не связан с сайтомно можно найти, используя поисковые системы, относится к store методу, который, похоже, с тех пор был удален из библиотеки в пользу реализации, которая не содержит никаких возможностей хранения.
  • Экземпляры AsymmetricCipherKeyPair (которыекоторые я получаю из keygen) сами по себе не сериализуемы, также как и экземпляры BLS01PublicKeyParameters или BLS01PrivateKeyParameters, причем поля, содержащие ключи (sk и pk), являются закрытыми и вводятся только для *Интерфейс 1018 *, который мало что говорит о содержимом.

В качестве обходного пути я реализовал storЭтот метод (без обработки всех исключений) выглядит примерно так:

public static void storePrivateKey(AsymmetricCipherKeyPair key, String filename)
        throws FileNotFoundException, IOException {
    Field f = null;
    f = key.getPrivate().getClass().getDeclaredField("sk");
    if (f != null) {
        f.setAccessible(true);
        Object fieldContent = null;
        fieldContent = f.get(key.getPrivate());
        if (fieldContent != null) {
            byte[] data = null;
            if (fieldContent instanceof ImmutableZrElement) {
                ImmutableZrElement izr = (ImmutableZrElement)fieldContent;
                data = izr.toBytes();
            }
            try (FileOutputStream fos = new FileOutputStream(filename)) {
                fos.write(data);
            }
        }
    }
}

С аналогичным подходом для открытых ключей.Это означает, что теперь я использую рефлексию для извлечения содержимого частного поля, чтобы сохранить его где-нибудь.Это решение, очевидно, представляет собой хакерскую коллекцию всевозможных неприятных запахов, но это пока лучшее, что я придумал.Я знаю, что запись некоторых байтов на диск не должна быть такой сложной, но я действительно не могу найти правильный способ сделать это.Кроме того, чтобы быть грубым, я не зашифрован: я хочу применить эту схему для подписи и проверки некоторых сообщений, вот и все.Я понимаю, что мне следует углубиться в математику всего подхода, но время ограничено - вот почему я выбрал библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...