init repo
This commit is contained in:
commit
cd3a619c9a
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
.DS_Store
|
||||
CMakeLists.txt.user*
|
||||
.idea
|
||||
*.autosave
|
||||
.vscode/
|
||||
build/
|
||||
|
||||
26
README.md
Normal file
26
README.md
Normal 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
80
bitcoin-keys.go
Normal 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
164
bitcoin-keys_test.go
Normal 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
18
helpers.go
Normal 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
66
main.go
Normal 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)
|
||||
//}
|
||||
Loading…
x
Reference in New Issue
Block a user