From 6be9bf9c3c4aa6429115fb76c46d1f09372e74eb Mon Sep 17 00:00:00 2001 From: catbref Date: Wed, 15 May 2019 11:00:53 +0100 Subject: [PATCH] Add mnemonic phrase support to VanityGen --- src/main/java/org/qora/VanityGen.java | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/qora/VanityGen.java b/src/main/java/org/qora/VanityGen.java index 45504530..c975862f 100644 --- a/src/main/java/org/qora/VanityGen.java +++ b/src/main/java/org/qora/VanityGen.java @@ -8,8 +8,12 @@ import java.util.Random; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; import org.qora.account.PrivateKeyAccount; +import org.qora.crypto.Crypto; +import org.qora.utils.BIP39; import org.qora.utils.Base58; +import com.google.common.primitives.Bytes; + public class VanityGen { public static void main(String argv[]) throws IOException { @@ -23,14 +27,25 @@ public class VanityGen { Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); Random random = new SecureRandom(); - byte[] seed = new byte[32]; + byte[] entropy = new byte[16]; while (true) { - random.nextBytes(seed); - PrivateKeyAccount account = new PrivateKeyAccount(null, seed); + // Generate entropy internally + random.nextBytes(entropy); + + // Use SHA256 to generate more bits + byte[] hash = Crypto.digest(entropy); + + // Append first 4 bits from hash to end. (Actually 8 bits but we only use 4). + byte checksum = (byte) (hash[0] & 0xf0); + byte[] entropy132 = Bytes.concat(entropy, new byte[] { checksum }); + + String mnemonic = BIP39.encode(entropy132, "en"); + + PrivateKeyAccount account = new PrivateKeyAccount(null, hash); if (account.getAddress().startsWith(argv[0])) - System.out.println(String.format("Address: %s, public key: %s, private key: %s", account.getAddress(), Base58.encode(account.getPublicKey()), Base58.encode(seed))); + System.out.println(String.format("Address: %s, public key: %s, private key: %s, mnemonic: %s", account.getAddress(), Base58.encode(account.getPublicKey()), Base58.encode(hash), mnemonic)); } }