Можно ли использовать 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);
}
Может кто-нибудь, пожалуйста, дайте мне знать, если они нашли способ заставить это работать