init repo

This commit is contained in:
Mike D'Morto 2021-03-19 15:17:37 +07:00
commit cd3a619c9a
6 changed files with 361 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.DS_Store
CMakeLists.txt.user*
.idea
*.autosave
.vscode/
build/

26
README.md Normal file
View File

@ -0,0 +1,26 @@
# Keys.lol generator
This repository contains the key generator for [Keys.lol](https://keys.lol)
## Building and installing
1. cd to `~/go/src/github.com/sjorso/keys-generator`
2. install required packages with `go get`
3. build the executable with `go build`
4. include the executable in `$PATH`: `sudo cp keys-generator /usr/local/bin`
## Usage
For generating keys, run:
```bash
keys-generator btc <page number>
keys-generator eth <page number>
```
For searching by private key, run:
```bash
keys-generator btc-search <btc private key>
keys-generator eth-search <eth private key>
```
## License
This project is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)

80
bitcoin-keys.go Normal file
View File

@ -0,0 +1,80 @@
package main
import (
"fmt"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcutil"
"math/big"
)
var largestBitcoinSeed = new(big.Int).SetBytes([]byte{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x40,
})
type key struct {
private string
compressed string
uncompressed string
}
func generateBitcoinKeys(pageNumber string, keysPerPage int) (keys []key) {
basePage := new(big.Int).Sub(makeBigInt(pageNumber), one)
// convert the "int" to "string" because i dont know how to create a bigInt from an "int"
stringInt := fmt.Sprintf("%d", keysPerPage)
firstSeed := new(big.Int).Add(new(big.Int).Mul(basePage, makeBigInt(stringInt)), one)
var padded [32]byte
bitcoinKeys := make([]key, 0, keysPerPage)
for i := 0; i < keysPerPage; i++ {
// Check to make sure we're not out of range
if firstSeed.Cmp(largestBitcoinSeed) > 0 {
break
}
// Copy firstSeed value's bytes to padded slice
copy(padded[32-len(firstSeed.Bytes()):], firstSeed.Bytes())
// Get private and public keys
privKey, public := btcec.PrivKeyFromBytes(btcec.S256(), padded[:])
// Get compressed and uncompressed addresses for public key
caddr, _ := btcutil.NewAddressPubKey(public.SerializeCompressed(), &chaincfg.MainNetParams)
uaddr, _ := btcutil.NewAddressPubKey(public.SerializeUncompressed(), &chaincfg.MainNetParams)
// Encode addresses
wif, _ := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, false)
bitcoinKeys = append(bitcoinKeys, key{
private: wif.String(),
compressed: caddr.EncodeAddress(),
uncompressed: uaddr.EncodeAddress(),
})
firstSeed.Add(firstSeed, one)
}
return bitcoinKeys
}
func findBtcWifPage(wifString string, keysPerPage int) string {
wif, err := btcutil.DecodeWIF(wifString)
if err != nil {
return "Error: could not decoding WIF"
}
// convert the "int" to "string" because i dont know how to create a bigInt from an "int"
stringInt := fmt.Sprintf("%d", keysPerPage)
page, _ := new(big.Int).DivMod(new(big.Int).SetBytes(wif.PrivKey.D.Bytes()), makeBigInt(stringInt), makeBigInt(stringInt))
page.Add(page, one)
return page.String()
}

164
bitcoin-keys_test.go Normal file
View File

@ -0,0 +1,164 @@
package main
import (
"reflect"
"testing"
)
func Test_generateBitcoinKeys(t *testing.T) {
type args struct {
pageNumber string
keysPerpage int
}
tests := []struct {
name string
args args
wantKeys []key
}{
{
"It can generate keys starting from the first seed",
args{"1", 10},
[]key{
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", compressed: "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH", uncompressed: "1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH", compressed: "1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP", uncompressed: "1LagHJk2FyCV2VzrNHVqg3gYG4TSYwDV4m"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreB1FQ8BZ", compressed: "1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb", uncompressed: "1NZUP3JAc9JkmbvmoTv7nVgZGtyJjirKV1"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreB4AD8Yi", compressed: "1JtK9CQw1syfWj1WtFMWomrYdV3W2tWBF9", uncompressed: "1MnyqgrXCmcWJHBYEsAWf7oMyqJAS81eC"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBF8or94", compressed: "17Vu7st1U1KwymUKU4jJheHHGRVNqrcfLD", uncompressed: "1E1NUNmYw1G5c3FKNPd435QmDvuNG3auYk"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBKdE2NK", compressed: "1Cf2hs39Woi61YNkYGUAcohL2K2q4pawBq", uncompressed: "1UCZSVufT1PNimutbPdJUiEyCYSiZAD6n"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBR6zCMU", compressed: "19ZewH8Kk1PDbSNdJ97FP4EiCjTRaZMZQA", uncompressed: "1BYbgHpSKQCtMrQfwN6b6n5S718EJkEJ41"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBbMaQX1", compressed: "1EhqbyUMvvs7BfL8goY6qcPbD6YKfPqb7e", uncompressed: "1JMcEcKXQ7xA7JLAMPsBmHz68bzugYtdrv"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBd7uGcN", compressed: "1HSxWThjiwbC4dJbXHMpBfwRenB12UguG5", uncompressed: "1CijKR7rDvJJBJfSPyUYrWC8kAsQLy2B2e"},
{private: "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreBoNWTw6", compressed: "13DaZ9nfmJLfzU6oBnD2sdCiDmf3M5fmLx", uncompressed: "1GDWJm5dPj6JTxF68WEVhicAS4gS3pvjo7"},
},
},
{
"It can generate keys for the last page",
args{"904625697166532776746648320380374280100293470930272690489102837043110636675", 128},
[]key{
// 64 keys
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqemizF9vA", compressed: "12d8ggXP5MSJoEuqtRJqyZpLxqUAztmrpH", uncompressed: "1PDSZN2qgFcuay1vVRxYo1yp9gfXeSKJgt"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqemmsbvAo", compressed: "1Et3i5Bjbn5cLbqwngT3HeSxQG3sXyvC7L", uncompressed: "1EsDryguZoanBraPCYCk9bUoynfY6PoNvj"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqemtri4qS", compressed: "1MJu8dVQVRx6AeSLuHA9avGQALqxGFB4iw", uncompressed: "1FKs7XQkQS5MHqEmFeKmx9vhpBRNYUxBn5"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqemyyKQGD", compressed: "16qmCy9t35haJZfbnq4PkXfeKMjNQvx5h", uncompressed: "1GkQuui5ofmtJMnQvrMzVs3Rw2qnBj8Hms"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenBBbpLQ", compressed: "1DHQUMNsRoZiCpcd7PhmHgrQvDUPGwGptK", uncompressed: "13bFiKHMPA6ydmC4jctqqdvRNPHq8JLhQc"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenEc4n5A", compressed: "1MiUJRU3fSSgvSeF56BjMZaFHjcWmZS8w", uncompressed: "16gK4BTErckvm22uqTAcbztsEzdRq4JwT4"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenQFmCR7", compressed: "1HWyLvUVJvkwmFgF2SvPkhHA5ttRhjGR1h", uncompressed: "1QeXZe66ay57kpkjxT6ydcpRe5J1TA997"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenVqqaRt", compressed: "1DPinkkKGeh4B5Qynr1aHwfGPz38BBCd67", uncompressed: "18FeyYSiZBLvsSuKVtwDugRCvvtVU4t4LE"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqencAZErF", compressed: "1BPdPPj9jgtHT3usnF8AizRfnbXVVFPVDT", uncompressed: "126uVWnkbykXpUzNEuk7erFyuMYaePSWoV"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenfnqBWw", compressed: "1CvKupTzRqsDi5Zf4QdbVYhmaQUkF667hM", uncompressed: "1Cud5ZFu44376mtdGytFVQxoXZFsAf396W"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenripixH", compressed: "1J5kaAUPpLZor6UVkTeJYtBojgXrtWsknv", uncompressed: "129Zk4KrdjCtTkPDKDA9yKEoyQMKg7nnY4"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqenwBMVJd", compressed: "1MYwjHMGQZjWFYnXmWMMnaueyn6fHCYL6L", uncompressed: "1GahK7oUFETxTRp1tpcHt6EXchCerop1sj"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeo3RQvkv", compressed: "18HrrgAZ3csXpqJevSembrbCv43UR2LoTo", uncompressed: "1BTcZcviXTJSoHRxaQZwvPWeUCwJMqj9id"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeo6TidXi", compressed: "19kvXX4hHGF9cTJmomrN6CBePfEhpKDRWP", uncompressed: "1MadvbXBmgUo18XiwiS7w3nx4gPyHbGiqL"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeoCq3htf", compressed: "15av1HesW2XF4hs8XP9aNGjezNnuJa3pjW", uncompressed: "1DYHVPZKncADbTRUyqQ6vLzAzotJBBdNVZ"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeoQJAair", compressed: "15pTbF1pm6oEDHEMW4K1TUv3xdMUodTfWu", uncompressed: "1CaZUpjd7VmsyWDFrk9WG9nTYMLcLLvvCw"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeoUG67kV", compressed: "158eqSFXqk53iyMnMZoENAE2o965Fe4dHy", uncompressed: "1DdXcnmYs4zWryEvfXJJWqu86T4DbQD2a8"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeodFUkKT", compressed: "1CqJeCZBiLkB3bSgGiRoEURSj6LGqVqqRg", uncompressed: "1DZSj1cyJbhCzgz1UgTvPZHRZVvoGyDUAX"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeog8LP2s", compressed: "1Ksi2xmc9vi5wnxNdxKkcs3pmsLQakoBBF", uncompressed: "14jo3BJqdNzVJcz4YrF4EMYvHSGgwdYKYY"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeoqicdaf", compressed: "1MydgvXarZNjDs8Nzh5SkR4LsJbSszAEEU", uncompressed: "1DBXK2tjeJXdy128r6yhBqET55wPqSGSvc"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeovMf19o", compressed: "1968U6xwiis6ipAaE4uP7H985Sg2xPtPiL", uncompressed: "1237sbJWPKg2MdZzuSqRaqEaaaKGXA1Cou"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqep2apkpy", compressed: "14jbc7bNhF94oiWX5p8dSHP6UkyPhysYW4", uncompressed: "1KnvaEg8NFdeRY3GjcUZm1NoVq8PcdNLcV"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqep9EVtUJ", compressed: "14csyS7vQKBLUn9Am1HHEu1ZfaLd3L6VgQ", uncompressed: "1JcTeDgX1dVMwiW9DN61Gt1x4U7rbLrQAs"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqepEKAcje", compressed: "1LoNTxsB9bGXRqRBLqbKwNz9yzF39amkiC", uncompressed: "14gXLdfh2sqCnuMvDEPMpAzgAMRt9iDPT9"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqepQhCqTK", compressed: "19z7VNJxr5bfEiKLWot8B2rnMe2uMazX2F", uncompressed: "1NPNXYwZXjHHUmNZ5yjGCRXycWbJSduFfz"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqepToGvwg", compressed: "1CBotfPmWKCTP7qEB63nB4D6cSbsBv8qXn", uncompressed: "1FPQXEjTh5RAfnJeNAPyv5xfEwTNVbGTHn"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqepaaXPow", compressed: "16B4ucETeu2MwKxm5WxxzbTLfBBrj1NRGZ", uncompressed: "1GHKXCXPYhyJpPizgewyt22e67gcBben5Y"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqepktCsqr", compressed: "19RQEGMBaKNGGQNnftS1VeaHEQSo7iv9NC", uncompressed: "1HskyAaSKozKoQ3YzretZsBzhcFGusoMiU"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeptR3dcN", compressed: "1NsUwAZiojCb9ufDiLoTiijBFy2UvAj4tp", uncompressed: "1NtcfxvCYX76JR1cqp61ToAmtXzwYxatQb"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeq1Uaa93", compressed: "17tBvAGvVofr253SMc1H2Y4MALpvK8nqdV", uncompressed: "1GtuZvcbKw1TsDkCQhDSvyvnfqnBiZHZqk"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeq35A1TA", compressed: "1LFEfrvJb2tsaDm5h94AxDK77X1dqfdnEu", uncompressed: "1Gqw7w79Mb69tUFFRGpHHwtPkY6nEKint3"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqBRruvU", compressed: "1DDNFwqNX3m5kVWRg1ePAqoJngAavxBmnM", uncompressed: "1DeRhsAca8qjL6Qk2E2d9L3wopD6MLWcDy"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqGkUfLX", compressed: "12eqsJftjhW21MkA4AMqFntXUfMVkTzDvz", uncompressed: "1yqGdk4DoEd1xiN3bhFdzf6ZGPxiymDvX"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqPropqU", compressed: "1bD9vUMnriNiAE9yRRuxPs8cZ6FnF5mTz", uncompressed: "1E4NhgXkqpZvnZPBZwynzNmTAcgKLiPUre"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqVd2ZnE", compressed: "146WXvKwWuLH8xrFB7esbMHrN37qYYrWpN", uncompressed: "1LJ5utuGegyKa6YbVTtxzZndFnSdHNzC5C"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqaKfzBW", compressed: "1HrRcmLhkirJeYcyKoYq5uJc2Zeb94E1vz", uncompressed: "1KVPFr2XEwessL8J4zmqi5yFqD2BYVJ2Dk"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqhYRAUZ", compressed: "125wpFbHQrdRFuLvesEY96RavHM9T1yTFF", uncompressed: "1NMiUoStJMYxfWw6APLRoMs24Fqsr9tmg7"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqequMbUK2", compressed: "1PdyW6CsrYbfcQsLNvp2BprLjvPTDYvBo3", uncompressed: "12GQjWsXZ7rfRYCR4E5bHMg8AkoSxmPBox"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeqy1cgUY", compressed: "1HYXgyq17sNtGPVsrakdE2bfW1Hu1qpCq", uncompressed: "14AJuXrdKFD8RzVtsF89FYVN4DSmb9xEPf"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqer5piUXL", compressed: "1LnSLVs7CGEQBbY6w2J7kMAU8P48rA8zKQ", uncompressed: "1N1sRyurQe7YouraPgh4rxV8JfARdv7zAH"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqerBWAT6z", compressed: "1LihsAYyVCsfuXXQaQfexNtHDCSWVzu2QQ", uncompressed: "12gG3cNVexUjXCY3KqHi891Kiafsb8AaBy"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqerKGMy47", compressed: "1BMNiGzCvpAMQGTn7NSFPTUtjwSNeB27nP", uncompressed: "16oS9HkwfDmrCSGkaFe7KDQgkMFy5GXFoc"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqerQMuaXp", compressed: "1qapNkhu4ARLB2VvhjiRzoQUQdBedWx69", uncompressed: "1E7rN6ZJ7g6mHYEZ643bJSFXSkwLw6Zzam"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqerai1D7C", compressed: "1WZ1qft3wFmk8QP4dfUSqpyC4JEUiV1FR", uncompressed: "18yhGBghaycjg3UhR2fiquffntYQpUGDE7"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqerf2U3AK", compressed: "12yHuvGnsJbAEgvqajjPdCve91Aa294AHt", uncompressed: "17QPbFArTP6M6QRg2ZE18D3fvzZYxnRUSb"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqeromqrGX", compressed: "1EmghU6CBBfw1wyJqguXeWtjUhW3kmzwbU", uncompressed: "1Fp1zhPoKnKfm8MLYkQZ33GZRbJpE9inpB"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqertvRkec", compressed: "19CEpYsRwMirXiFFSM7daVxtwALrERMaWf", uncompressed: "12TqhXBmGoaaJoudt1MdysYb2JqGWUGoL1"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqes1UC6J5", compressed: "13wyRkVE4XGmNW3g2xgA2SGpKysDtjy1Ka", uncompressed: "14X7DSjXSQBqvFVshZuNwVW6GZyNp79AjF"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqes6XLxKo", compressed: "1AaoXdKGqj5bHoFAUSLwfv5C2CkAi5RjFE", uncompressed: "1ADGZZSKRqz3ydkn714Qzw1FJSbUZZGEr1"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesAbJPSv", compressed: "1EsZ8f9hGrd9cH35gWLuKbP3J793rArBSt", uncompressed: "1E1oVu22jUEvmQTFDy9bTgabSfmns6fQFY"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesHpSgWj", compressed: "1Lj2EgsaunRNwsyEK32ebjofbu1tPxxtEy", uncompressed: "1KWhn5gquQvXyXp9BMgJ6HYfNwpHZDmJ5c"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesTFJEbX", compressed: "12sQJfPVt5YuAbmDCWnym5tNDfshtpBXhB", uncompressed: "122Vo9PeKd4j8zSGBeQHdmks6GnkpycXNz"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesYcYp9K", compressed: "1FyqVysQjVwyQatuoop3ByZYPecUhj6bnr", uncompressed: "1PMB9Etp3xaDKxpmofy1MmjJF1kvCtH8UA"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesi68P9B", compressed: "1DNv5wVZKZvFp5gktKtN83ZwEfcQt8oKac", uncompressed: "1zrbUnLczbHkA6pzXuZDD6jNsoKMqGBcy"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqesmCC6YY", compressed: "1Aea8LKoEEWpPqTqaSwRYfksmUScVqV1F6", uncompressed: "18PUeum1Su423DmV2jEGdSd3ewiPfsZZ7z"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqestnHCQU", compressed: "1Nk4wGvaSinFVdrnMfEexLDnBZvWPY393C", uncompressed: "1GLiZZVt326aA8JHG2dEJHC591DXDQNKTs"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqet3sujS6", compressed: "1A81LWBrirUNAKpUVFS37xWT4GAMYU5qgD", uncompressed: "1MFyofP8SVtsEYDHQbZg7XJgfDeSP4ysPm"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqet8uM8zj", compressed: "1BJYFk5827oeYipArjTvLL7JdR4ivCGFYj", uncompressed: "1XunvtCGpmb7uw9qxWwaZFfHNFdUmuMVG"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetEoeLmv", compressed: "1Lvxa3uJyPyRLbrNpGx761aSDWrJ77aTNm", uncompressed: "1J2zofmGpMUSaNGdTZEhMRYXdWsBQFMpS"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetNQLySX", compressed: "1JSVicNeasrtuiDpb6r4J5fWxjfdU7ZyWT", uncompressed: "1LWBSfTeaLRNS1vyGSKy2BVW2nd6W9sk8Q"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetVTGEAr", compressed: "1FjMR9gvnmZ3JYMxBbyc3aZK717b5txJoC", uncompressed: "1F3zbGb5JLBnmCAAYjCCv35zkggrXfi8LR"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetbh69Dr", compressed: "1HjFHBmhUQkKntPPeWmiLiNGewRAMQWNYs", uncompressed: "15K4QVHD5T1KvW4it56qNuGJoTGMpUaFMj"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetd9ZKJ4", compressed: "1NjSB7UL4MtdjmPbTUfaHne9R5C2YGxUSA", uncompressed: "1Knh2eFMtzMEtmvGHW14ELG8F9Ny6jV4s3"},
{private: "5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetqj84qw", compressed: "1GrLCmVQXoyJXaPJQdqssNqwxvha1eUo2E", uncompressed: "1JPbzbsAx1HyaDQoLMapWGoqf9pD5uha5m"},
},
},
{
"It generates nothing when out of range",
args{"904625697166532776746648320380374280100293470930272690489102837043110636999", 128},
[]key{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if gotKeys := generateBitcoinKeys(tt.args.pageNumber, tt.args.keysPerpage); !reflect.DeepEqual(gotKeys, tt.wantKeys) {
t.Errorf("Expected:")
for _, expectedKey := range tt.wantKeys {
t.Errorf("%#v", expectedKey)
}
t.Errorf("Actual:")
for _, actualKey := range gotKeys {
t.Errorf("%#v", actualKey)
}
}
})
}
}
func Test_findBtcWifPage(t *testing.T) {
type args struct {
wifString string
keysPerPage int
}
tests := []struct {
name string
args args
wantPage string
}{
{
"It can find the page that a random WIF is on",
args{"5KQkycVaH2urSTz9CQ4fGdWz3a5n9TFKLDwxzREv8tBtcXYW9Ua", 128},
"741968862012117112677494014490987968047399326671284349197372731288562495168",
},
{
"It can find a WIF on the first page",
args{"5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", 128},
"1",
},
{
"It can find a WIF on the last page",
args{"5Km2kuu7vtFDPpxywn4u3NLpbr5jKpTB3jsuDU2KYEqetqj84qw", 128},
"904625697166532776746648320380374280100293470930272690489102837043110636675",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if gotPage := findBtcWifPage(tt.args.wifString, tt.args.keysPerPage); !reflect.DeepEqual(gotPage, tt.wantPage) {
t.Errorf("Expected: %v", tt.wantPage)
t.Errorf("Actual: %v", gotPage)
}
})
}
}

18
helpers.go Normal file
View File

@ -0,0 +1,18 @@
package main
import (
"log"
"math/big"
)
var one = big.NewInt(1)
func makeBigInt(number string) *big.Int {
i, success := new(big.Int).SetString(number, 10)
if !success {
log.Fatal("Failed to create BigInt from string")
}
return i
}

66
main.go Normal file
View File

@ -0,0 +1,66 @@
package main
import (
"fmt"
"log"
"os"
)
func main() {
coin := os.Args[1]
keysPerPage := 128
switch coin {
case "btc":
printBitcoinKeys(os.Args[2], keysPerPage)
case "btc-search":
printBtcWifSearch(os.Args[2], keysPerPage)
// case "eth":
// printEthereumKeys(os.Args[2], keysPerPage)
// case "eth-search":
// printEthPrivateKeySearch(os.Args[2], keysPerPage)
default:
log.Fatal("Invalid coin type")
}
}
func printBitcoinKeys(pageNumber string, keysPerPage int) {
bitcoinKeys := generateBitcoinKeys(pageNumber, keysPerPage)
length := len(bitcoinKeys)
for i, key := range bitcoinKeys {
fmt.Printf("%v", key)
if i != length-1 {
fmt.Print("\n")
}
}
}
func printBtcWifSearch(wif string, keysPerPage int) {
pageNumber := findBtcWifPage(wif, keysPerPage)
fmt.Printf("%v", pageNumber)
}
//func printEthereumKeys(pageNumber string, keysPerPage int) {
// ethereumKeys := generateEthereumKeys(pageNumber, keysPerPage)
//
// length := len(ethereumKeys)
//
// for i, key := range ethereumKeys {
// fmt.Printf("%v", key)
//
// if i != length-1 {
// fmt.Print("\n")
// }
// }
//}
//func printEthPrivateKeySearch(privateKey string, keysPerPage int) {
// pageNumber := findEthPrivateKeyPage(privateKey, keysPerPage)
//
// fmt.Printf("%v", pageNumber)
//}