SHOW:
|
|
- or go back to the newest paste.
1 | #include <stdio.h> | |
2 | #include <stdlib.h> | |
3 | #include <string.h> | |
4 | #include <time.h> | |
5 | #include <openssl/sha.h> | |
6 | ||
7 | const char *coin_err; | |
8 | #define bail(s) { coin_err = s; return 0; } | |
9 | ||
10 | int unbase58(const char *s, unsigned char *out) { | |
11 | static const char *tmpl = "123456789" | |
12 | "ABCDEFGHJKLMNPQRSTUVWXYZ" | |
13 | "abcdefghijkmnopqrstuvwxyz"; | |
14 | int i, j, c; | |
15 | const char *p; | |
16 | ||
17 | memset(out, 0, 40); | |
18 | for (i = 0; s[i]; i++) { | |
19 | if (!(p = strchr(tmpl, s[i]))) | |
20 | bail("bad char"); | |
21 | ||
22 | c = p - tmpl; | |
23 | for (j = 37; j--; ) { | |
24 | c += 58 * out[j]; | |
25 | out[j] = c % 256; | |
26 | c /= 256; | |
27 | } | |
28 | ||
29 | if (c) bail("address too long"); | |
30 | } | |
31 | ||
32 | return 1; | |
33 | } | |
34 | ||
35 | int valid(const char *s) { | |
36 | unsigned char dec[40], d1[SHA256_DIGEST_LENGTH], d2[SHA256_DIGEST_LENGTH]; | |
37 | ||
38 | coin_err = ""; | |
39 | if (!unbase58(s, dec)) return 0; | |
40 | ||
41 | SHA256(SHA256(dec, 33, d1), SHA256_DIGEST_LENGTH, d2); | |
42 | ||
43 | if (memcmp(dec + 33, d2, 4)) | |
44 | bail("bad digest"); | |
45 | ||
46 | return 1; | |
47 | } | |
48 | ||
49 | #define C_1_INDEX 6 | |
50 | #define C_2_INDEX 11 | |
51 | #define C_3_INDEX 27 | |
52 | #define C_4_INDEX 34 | |
53 | #define C_5_INDEX 47 | |
54 | ||
55 | int main (void) { | |
56 | const char *chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; | |
57 | char addr[100]; | |
58 | strcpy(addr, "5HpHag-65TZ-G1PH3CSu63k8Dbp-D8s5ip-nEB3kEsreAnc-uDf"); | |
59 | ||
60 | int i; | |
61 | for (i = 0; addr[i]; i++) { | |
62 | if (addr[i] == '-') printf("index: %d\n", i); | |
63 | } | |
64 | ||
65 | int c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0, status; | |
66 | float startTime, endTime; | |
67 | - | for (c1 = 26; c1 < 58; c1++) { |
67 | + | for (c1 = 0; c1 < 58; c1++) { |
68 | addr[C_1_INDEX] = chars[c1]; | |
69 | - | for (c2 = 56; c2 < 58; c2++) { |
69 | + | for (c2 = 0; c2 < 58; c2++) { |
70 | addr[C_2_INDEX] = chars[c2]; | |
71 | printf("Test: %c%c...", chars[c1], chars[c2]);fflush(stdout); | |
72 | startTime = (float)clock()/CLOCKS_PER_SEC; | |
73 | for (c3 = 0; c3 < 58; c3++) { | |
74 | addr[C_3_INDEX] = chars[c3]; | |
75 | for (c4 = 0; c4 < 58; c4++) { | |
76 | addr[C_4_INDEX] = chars[c4]; | |
77 | for (c5 = 0; c5 < 58; c5++) { | |
78 | addr[C_5_INDEX] = chars[c5]; | |
79 | status = valid(addr); | |
80 | if (status) { | |
81 | printf("\nFOUND: %s\n", addr); | |
82 | return 1; | |
83 | } | |
84 | } | |
85 | } | |
86 | } | |
87 | endTime = (float)clock()/CLOCKS_PER_SEC; | |
88 | printf("%fs\n", (endTime-startTime)); | |
89 | } | |
90 | } | |
91 | ||
92 | return 0; | |
93 | } |