关于安全性:SHA3-512在Java中生成密钥

SHA3-512 to Generate Keys in Java

是否有可能使用Java 3-512(JavaC9中可用的KECAK子集)在Java中生成密钥?

我搜索了大量的噪音和文档,试图找出这个问题。目前,似乎sha3-512可以作为messagedigest的哈希,但不能用于生成密钥。我下面的代码试图以可预测的方式生成密钥(用于钱包目的,如bip32,但超出了货币到区块链的使用范围)

http://Github.com/DevsS/BlockchainFullNode /BoB/D29 78E598B4CCDDF4B336713B2C3E839 A6B181/SRC/MON/JAVA/APP/MID/KEZZ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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)。理想情况下,需要的是一个sha3-512 trng在生成和sha3prng在生成键。因为keygenerator需要一个secureRandom,所以如果java.security.secureRandom仍然像sha1prng一样不安全,我会感到惊讶。

http://Github.com/DevsS/BlockchainFullNode /BoB/D29 78E598B4CCDDF4B336713B2C3E839 A6B181/Test/Maule/Java/APP/My/KEZZTest.JavaSyL16-L22

1
2
3
4
5
6
7
8
    @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);
    }

有人能告诉我他们有没有办法让这个工作


您要找的似乎不是现成的:

注意,SHA1SHA1PRNG不是等效的。前者是散列算法,后者是一种伪随机生成算法(当然,它使用SHA1来更新其内部状态)。这种差异的一个微不足道的结果是,SHA1输出固定大小的位,其中SHA1PRNG输出任意多的位。

由于这种差异,EDCOX1〔5〕不能直接用作EDCOX1〔6〕,虽然在Java中是可用的。您需要做的是,使用SHA3-512实现一个PRNG算法(这部分非常困难,因为生成一个伪随机流非常困难),并通过您的自定义Security Provider注册它(就像Bouncy Castle做的那样),使用一些名称MySHA3PRNG注册它。之后,您可以得到一个名为MySHA3PRNG的实例,就像您对SHA1PRNG所做的那样。其余的仍保持原样。

这个棘手部分的一个主要问题可能是:从这里引用,

The paper"Sponge-based pseudo-random number generators" talks about just that and it also describes a clean and efficient way to construct a re-seedable PRNG with a (Keccak) sponge function. What you'll get is a PRNG based on a cryptographic hash function… with the usual security implications.

For example: the paper explicitly states that you should reseed regularly with sufficient entropy to prevent an attacker from going backwards on the period of the PRNG (which is probably what you've been hearing about).

但是,您需要的是一个不需要重新播种的PRNG算法。我希望您有足够的理论背景来证明您的自定义PRNG算法是安全的。

祝你好运!