Created
February 1, 2020 06:11
-
-
Save benhall-7/6b7a5bd7d6ebb8d1fe49b6b02248542b to your computer and use it in GitHub Desktop.
hash_crc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string.h> | |
unsigned long HASH_TABLE[] = { | |
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, | |
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, | |
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, | |
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, | |
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, | |
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, | |
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, | |
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, | |
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, | |
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, | |
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, | |
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, | |
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, | |
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, | |
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, | |
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, | |
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, | |
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, | |
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, | |
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, | |
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, | |
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, | |
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, | |
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, | |
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, | |
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, | |
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, | |
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, | |
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, | |
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, | |
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, | |
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d | |
}; | |
unsigned long crc32(char *word) | |
{ | |
unsigned long hash = 0xffffffff; | |
char c; | |
for (int i = 0; (c = word[i]) != 0; i++) { | |
hash = (hash >> 8) ^ HASH_TABLE[(c ^ hash) & 0xff]; | |
} | |
return ~hash; | |
} | |
unsigned long crc32_append_char(unsigned long crc, char c) | |
{ | |
unsigned long hash = ~crc; | |
hash = (hash >> 8) ^ HASH_TABLE[(c ^ hash) & 0xff]; | |
return ~hash; | |
} | |
unsigned long crc32_append_word(unsigned long crc, char *word) | |
{ | |
unsigned long hash = ~crc; | |
char c; | |
for (int i = 0; (c = word[i]) != 0; i++) { | |
hash = (hash >> 8) ^ HASH_TABLE[(c ^ hash) & 0xff]; | |
} | |
return ~hash; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include "crc.c" | |
#define ALPHABET "abcdefghijklmnopqrstuvwxyz_" | |
#define ALPHABET_NUM_PARTIAL "abcdefghijklmnopqrstuvwxyz_0123" | |
#define ALPHABET_NUM "abcdefghijklmnopqrstuvwxyz_0123456789" | |
//full alphabet: "abcdefghijklmnopqrstuvwxyz_" | |
static char * word_buf; | |
static char * alph_buf = ALPHABET; | |
static char * start_buf = ""; | |
static char * end_buf = ""; | |
static unsigned long long hash40; | |
static int recurse(unsigned long hash); | |
static int main_len; | |
static unsigned long main_hash; | |
static int start_len; | |
static int end_len; | |
static int alpha_len; | |
static int level; | |
static int end_level; | |
int main(int argc, char *argv[]) | |
{ | |
if (argc <= 1) { | |
printf("Missing args. See -h for details\n"); | |
return 1; | |
} | |
//parse args | |
for (int i = 1; i < argc; i++) { | |
if (!strcmp(argv[i], "-a")) { | |
++i; | |
if (!strcmp(argv[i], "$ALPHABET")) { | |
alph_buf = ALPHABET; | |
} else if (!strcmp(argv[i], "$ALPHABET_NUM")) { | |
alph_buf = ALPHABET_NUM; | |
} else if (!strcmp(argv[i], "$ALPHABET_NUM_PARTIAL")) { | |
alph_buf = ALPHABET_NUM_PARTIAL; | |
} else { | |
alph_buf = calloc(strlen(argv[i]) + 1, 1); | |
if (alph_buf == NULL) { | |
printf("Failed to allocate buffer for alphabet\n"); | |
return 1; | |
} | |
strcpy(alph_buf, argv[i]); | |
} | |
printf("Alphabet = %s\n", alph_buf); | |
} else if (!strcmp(argv[i], "-s")) { | |
++i; | |
start_buf = calloc((start_len = strlen(argv[i])) + 1, 1); | |
if (start_buf == NULL) { | |
printf("Failed to allocate buffer for start word\n"); | |
return 1; | |
} | |
strcpy(start_buf, argv[i]); | |
printf("Start word = %s\n", start_buf); | |
} else if (!strcmp(argv[i], "-e")) { | |
++i; | |
end_buf = calloc((end_len = strlen(argv[i])) + 1, 1); | |
if (end_buf == NULL) { | |
printf("Failed to allocate buffer for start word\n"); | |
return 1; | |
} | |
strcpy(end_buf, argv[i]); | |
printf("End word = %s\n", end_buf); | |
} else if (!strcmp(argv[i], "-h")) { | |
printf("~ hash_crc; hash40 cracker ~\n"); | |
printf("args: [hash] (optional:) -a <alphabet> -s <start word> -e <end word>\n"); | |
} else { | |
hash40 = strtoll(argv[i], NULL, 0); | |
main_len = hash40 >> 32; | |
main_hash = hash40 & 0xffffffff; | |
word_buf = calloc(main_len + 1, 1); | |
} | |
} | |
if (word_buf == NULL) { | |
printf("Failed to allocate buffer for hash\n"); | |
return 1; | |
} | |
alpha_len = strlen(alph_buf); | |
level = start_len; | |
end_level = main_len - end_len; | |
if (level > end_level) { | |
return 1; | |
} | |
for (int i = 0; i < start_len; i++) { | |
word_buf[i] = start_buf[i]; | |
} | |
for (int i = 0; i < end_len; i++) { | |
word_buf[i + end_level] = end_buf[i]; | |
} | |
recurse(crc32(start_buf)); | |
return 0; | |
} | |
int recurse(unsigned long hash) | |
{ | |
if (level < end_level) { | |
for (int i = 0; i < alpha_len; i++) { | |
char c = alph_buf[i]; | |
word_buf[level++] = c; | |
recurse(crc32_append_char(hash, c)); | |
--level; | |
} | |
} | |
else if (crc32_append_word(hash, end_buf) == main_hash) { | |
printf("MATCH: %s\n", word_buf); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment