SHA3-512 для генерации ключей в Java - PullRequest
0 голосов
/ 27 апреля 2018

Можно ли использовать SHA3-512 (подмножество keccak, доступное в Java9) для генерации ключей в Java?

Я искал много шума и документации, чтобы попытаться выяснить это. В настоящее время кажется, что SHA3-512 доступен как хэш для MessageDigest, но не для генерации ключей. Мой код ниже пытается сгенерировать ключи предсказуемо (для целей кошелька, таких как BIP32, но за пределами валюты для использования блокчейна)

https://github.com/devssh/BlockchainFullNode/blob/d2978e598b4cdecdf4b3337713b2c3e839a6b181/src/main/java/app/model/Keyz.java#L111-L128

    public static String GenerateSeed() throws Exception {
        SecureRandom random = new SecureRandom();
        byte[] seed = random.generateSeed(512);
        return Base64.getEncoder().encodeToString(seed);
    }

    public static Keyz GenerateKey(String seedString) {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyPairGenerator keyGen1 = KeyPairGenerator.getInstance("ECDSA");
        ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
        SecureRandom random1 = SecureRandom.getInstance("SHA1PRNG");
        random1.setSeed(Base64.getDecoder().decode(seedString));
        keyGen1.initialize(ecSpec, random1);
        KeyPair keyPair1 = keyGen1.generateKeyPair();
        PublicKey pub1 = keyPair1.getPublic();
        PrivateKey priv1 = keyPair1.getPrivate();
        //Keyz is a simple model that stores the 3 fields below and overrides equals and hashcode on those fields
        return new Keyz("random", pub1, priv1);
    }

Как вы можете видеть, он использует SHA1PRNG для предсказуемой генерации пары ключей детерминистически (меня устраивает проблема безопасности), так что ключи могут быть воссозданы детерминистически.

Вот тест JUnit, чтобы убедиться, что ключи детерминированы (работает для SHA1PRNG, должен работать в SHA3PRNG). В идеале требуется SHN3-512 TRNG в GenerateSeed и SHA3PRNG в GenerateKey. Поскольку генератору ключей требуется SecureRandom, я был бы удивлен, если java.Security.SecureRandom все еще находится на чем-то небезопасном, как SHA1PRNG.

https://github.com/devssh/BlockchainFullNode/blob/d2978e598b4cdecdf4b3337713b2c3e839a6b181/test/main/java/app/model/KeyzTest.java#L16-L22

    @Test
    public void shouldReturnDeterministicKeys() throws Exception {
        String seedString = GenerateSeed();
        Keyz random1 = GenerateKey(seedString);
        Keyz random2 = GenerateKey(seedString);
        //This assertion works as we override equals and hashcode
        assertEquals(random1, random2);
    }

Может кто-нибудь, пожалуйста, дайте мне знать, если они нашли способ заставить это работать

1 Ответ

0 голосов
/ 27 апреля 2018

Кажется, то, что вы ищете, не доступно из коробки:

Обратите внимание, что SHA1 и SHA1PRNG не эквивалентны. В то время как первый является алгоритмом хеширования, последний является алгоритмом генерации псевдослучайного числа (который, конечно, использует SHA1 для обновления своего внутреннего состояния). Одним из тривиальных результатов этого различия является то, что SHA1 выводит фиксированный размер битов, где SHA1PRNG выводит столько бит, сколько вам нужно.

Из-за этой разницы SHA3-512 нельзя использовать как PRNG напрямую, хотя она доступна в Java. Что вам нужно сделать, это реализовать алгоритм PRNG, используя SHA3-512 (эта часть действительно сложна, поскольку генерировать псевдослучайный поток довольно сложно.) И зарегистрировать его через пользовательский Security Provider (как это делает Bouncy Castle). ) с некоторым именем MySHA3PRNG. После этого вы можете получить его экземпляр с именем MySHA3PRNG, как и для SHA1PRNG. Остальное остается как есть.

Основная проблема с этой хитрой частью может заключаться в следующем: Цитировать из здесь ,

В статье " Генераторы псевдослучайных чисел на основе губки " рассказывается именно об этом, а также описывается чистый и эффективный способ создания пересеянного PRNG с функцией губки (Keccak). , Вы получите PRNG, основанный на криптографической хэш-функции ... с обычными последствиями для безопасности.

Например: в документе прямо указано, что вы должны регулярно засевать с достаточной энтропией, чтобы не дать злоумышленнику вернуться назад на период PRNG (о котором вы, вероятно, слышали).

Тем не менее, вам нужен PRNG алгоритм, который не нужно пересеивать. Я надеюсь, что у вас достаточно теоретических знаний, чтобы доказать, что ваш пользовательский алгоритм PRNG безопасен.

Удачи!

...