main.c (2265B)
1#include <stdlib.h> 2#include <string.h> 3#include <stdio.h> 4#include <stdint.h> 5 6#define MAXITER 256 * 100 7#define MHASHLEN 40 8#define MAX(x,y) ((x) > (y) ? (x) : (y)) 9#define MIN(x,y) ((x) < (y) ? (x) : (y)) 10 11int 12mhash(const char *str, size_t len) 13{ 14 static char buf[MHASHLEN + 1]; 15 int i, k, v; 16 char c, *bp; 17 18 if (!str || !*str) str = "."; 19 if (len <= 0) return EXIT_FAILURE; 20 21 for (v = 0, i = 0; i < len; i++) v += str[i]; 22 23 srand(v); 24 for (bp = buf, i = 0; i < MHASHLEN / 2; i++) 25 bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256)); 26 27 printf("%s\n", buf); 28 29 return EXIT_SUCCESS; 30} 31 32int 33hash() 34{ 35 char str[256]; 36 size_t len; 37 38 if (!fgets(str, sizeof(str), stdin)) 39 return EXIT_FAILURE; 40 41 return mhash(str, strlen(str) - 1); 42} 43 44int 45revhash(const char *hashstr) 46{ 47 char c, hexbuf[3] = { 0 }, *end, buf[256]; 48 int i, k, v, maxlen, sum, hash[256], sublen, aftersum; 49 50 if (strlen(hashstr) % 2 != 0) 51 goto invalid; 52 maxlen = strlen(hashstr) / 2; 53 54 /* convert hex to int array */ 55 for (i = 0; i < maxlen; i++) { 56 memcpy(hexbuf, hashstr + 2 * i, 2); 57 hash[i] = strtol(hexbuf, &end, 16); 58 if (end && *end) goto invalid; 59 } 60 61 /* bruteforce srand seed */ 62 for (i = 0; i < MAXITER; i++) { 63 srand(i); 64 65 /* reverse chars for given sum */ 66 for (sum = i, k = 0; k < maxlen && sum > 0; k++) { 67 buf[k] = (char) hash[k] ^ (rand() % 256); 68 if (buf[k] < 0) break; 69 sum -= buf[k]; 70 } 71 72 /* repeat if too short */ 73 if (k && sum == 0) { 74 sublen = k; 75 for (k = sublen; k < maxlen; k++) { 76 buf[k] = (char) hash[k] ^ (rand() % 256); 77 if (buf[k] < 0 || buf[k] != buf[k % sublen]) break; 78 } 79 } else { 80 sublen = maxlen; 81 } 82 83 if (k < maxlen) continue; 84 85 /* output first part we know */ 86 printf("%.*s", sublen, buf); 87 88 /* add rest of chars */ 89 while (sum > 0) { 90 c = MIN(127, sum); 91 printf("%c", c); 92 sum -= c; 93 buf[k++] = c; 94 } 95 96 printf("\n"); 97 98 if (getenv("OUTPUT_HASH")) 99 mhash(buf, k); 100 101 return EXIT_SUCCESS; 102 } 103 104 return EXIT_FAILURE; 105 106invalid: 107 fprintf(stderr, "Invalid hash string!\n"); 108 return EXIT_FAILURE; 109} 110 111int 112main(int argc, const char **argv) 113{ 114 if (argc < 2) { 115 fprintf(stderr, "USAGE: revhash <hash>\n"); 116 return EXIT_FAILURE; 117 } 118 119 if (!strcmp(argv[1], "hash")) 120 return hash(); 121 else 122 return revhash(argv[1]); 123}