Read all about how I wrote this and understanding BIP39 here.
Apart from generating a seed, only English, French, Spanish and Japanese currently packaged, but as WordList
is an interface and you can provide your own.
Use either of these repositories:
repositories {
jcenter()
}
Or:
repositories {
maven {
url 'https://dl.bintray.com/novacrypto/BIP/'
}
}
Add dependency:
dependencies {
compile 'io.github.novacrypto:BIP39:0.1.7'
}
Using a StringBuilder
:
StringBuilder sb = new StringBuilder();
byte[] entropy = new byte[Words.TWELVE.byteLength()];
new SecureRandom().nextBytes(entropy);
new MnemonicGenerator(English.INSTANCE)
.createMnemonic(entropy, sb::append);
System.out.println(sb.toString());
If you're paranoid and/or need higher than normal memory security, consider using a SecureCharBuffer
:
try (SecureCharBuffer secure = new SecureCharBuffer()) {
byte[] entropy = new byte[Words.TWELVE.byteLength()];
new SecureRandom().nextBytes(entropy);
new MnemonicGenerator(English.INSTANCE)
.createMnemonic(entropy, secure::append);
Arrays.fill(entropy, (byte) 0); //empty entropy
//do something with your secure mnemonic
}
try {
MnemonicValidator
.ofWordList(English.INSTANCE)
.validate(mnemonic);
} catch (UnexpectedWhiteSpaceException e) {
...
} catch (InvalidWordCountException e) {
...
} catch (InvalidChecksumException e) {
...
} catch (WordNotFoundException e) {
...
//e.getSuggestion1()
//e.getSuggestion2()
}
As does not use a word list, can be used now for any language.
byte[] seed = new SeedCalculator().calculateSeed(mnemonic, passphrase);
That uses SpongyCastle, if you don't need or want that dependency, you can use javax.crypto
like so:
byte[] seed = new SeedCalculator(JavaxPBKDF2WithHmacSHA256.INSTANCE).calculateSeed(mnemonic, passphrase);
That will not work on Android API < 26 https://developer.android.com/reference/javax/crypto/SecretKeyFactory.html and see Issue #17.