|
const crypto = require('crypto'); |
|
const fs = require('fs'); |
|
const https = require('https'); |
|
|
|
async function loadWordlist() { |
|
const url = 'https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt'; |
|
|
|
return new Promise((resolve, reject) => { |
|
https.get(url, (response) => { |
|
if (response.statusCode === 200) { |
|
let data = ''; |
|
response.on('data', (chunk) => { |
|
data += chunk; |
|
}); |
|
response.on('end', () => { |
|
resolve(data.trim().split('\n')); |
|
}); |
|
} else { |
|
reject(new Error(`Can not read file, HTTP code : ${response.statusCode}`)); |
|
} |
|
}).on('error', (err) => { |
|
reject(err); |
|
}); |
|
}); |
|
} |
|
|
|
function generateEntropy(bitSize = 128) { |
|
if (![128, 160, 192, 224, 256].includes(bitSize)) { |
|
throw new Error("Unsupported entropy size."); |
|
} |
|
return crypto.randomBytes(bitSize / 8); |
|
} |
|
|
|
function calculateChecksum(entropy) { |
|
const hash = crypto.createHash('sha256').update(entropy).digest(); |
|
const checksumLength = (entropy.length * 8) / 32; |
|
const checksumBits = hash[0] >> (8 - checksumLength); |
|
return checksumBits; |
|
} |
|
|
|
function entropyToMnemonic(entropy, wordlist) { |
|
const entropyBits = Array.from(entropy) |
|
.map(byte => byte.toString(2).padStart(8, '0')) |
|
.join(''); |
|
const checksumBits = calculateChecksum(entropy).toString(2).padStart(entropy.length * 8 / 32, '0'); |
|
const combinedBits = entropyBits + checksumBits; |
|
|
|
const mnemonic = []; |
|
for (let i = 0; i < combinedBits.length; i += 11) { |
|
const index = parseInt(combinedBits.slice(i, i + 11), 2); |
|
mnemonic.push(wordlist[index]); |
|
} |
|
|
|
return mnemonic.join(' '); |
|
} |
|
|
|
async function generateMnemonic(bitSize = 128) { |
|
const wordlist = await loadWordlist(); |
|
const entropy = generateEntropy(bitSize); |
|
return entropyToMnemonic(entropy, wordlist); |
|
} |
|
|
|
generateMnemonic(256).then((mnemonic) => { |
|
console.log("Recovery Phrase:", mnemonic); |
|
}).catch((error) => { |
|
console.error("Erreur :", error.message); |
|
}); |