#include #include #include #define BINARY_SIZE 64 #define OUT_BINARY_SIZE (1 + BINARY_SIZE) #define PLAINTEXT_LENGTH 127 #define KEYS_PER_CRYPT 80 #define KEYS_TO_TRY 10000000 #define HASH "a3e8882db900b2665c5fc925bd1ce97d28fe38788f78507c83015c05ead4acad6392ffc3e8b09a469a9769ed682d58cc790be36f64a2ec26d23dcd17dc2f9185" static void crypt_all(unsigned char (*out)[OUT_BINARY_SIZE], char (*in)[PLAINTEXT_LENGTH + 1], int count) { int i; #pragma omp for nowait //#pragma omp for for (i = 0; i < count; i++) { SHA512_CTX ctx; SHA512_Init(&ctx); SHA512_Update(&ctx, in[i], strlen(in[i])); SHA512_Final(&out[i][1], &ctx); #pragma omp flush(out) out[i][0]++; } //#pragma omp barrier } static int cmp_all(unsigned char (*computed)[OUT_BINARY_SIZE], unsigned char *loaded, int count, unsigned char rev) { int i, retval = 0; //#pragma omp barrier #pragma omp for for (i = 0; i < count; i++) { // for (i = count - 1; i >= 0; i--) { volatile unsigned char *crev = &computed[i][0]; while (*crev != rev) { //#pragma omp barrier } if (!memcmp(&computed[i][1], loaded, BINARY_SIZE)) #pragma omp critical retval = 1; } return retval; } static int cmp_one(unsigned char *computed, unsigned char *loaded) { return !memcmp(&computed[1], loaded, BINARY_SIZE); } static void process(unsigned char (*out)[OUT_BINARY_SIZE], char (*in)[PLAINTEXT_LENGTH + 1], int count, unsigned char *loaded) { static unsigned char rev = 0; rev++; #pragma omp parallel { crypt_all(out, in, count); if (cmp_all(out, loaded, count, rev)) { int i; #pragma omp critical for (i = 0; i < count; i++) if (cmp_one(out[i], loaded)) printf("%s\n", in[i]); } } } int main(void) { const char *loaded_s = HASH; unsigned char loaded[BINARY_SIZE]; unsigned char crypt_out[KEYS_PER_CRYPT][OUT_BINARY_SIZE]; char saved_key[KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1]; int i, j; for (i = j = 0; j < BINARY_SIZE; i += 2, j++) { const char *d = "0123456789abcdef"; loaded[j] = ((strchr(d, loaded_s[i]) - d) << 4) | (strchr(d, loaded_s[i + 1]) - d); } memset(crypt_out, 0, sizeof(crypt_out)); for (i = j = 0; i < KEYS_TO_TRY; i++) { char *p = saved_key[j++]; sprintf(p, "%d", i); if (j >= KEYS_PER_CRYPT || i == KEYS_TO_TRY - 1) { process(crypt_out, saved_key, j, loaded); j = 0; } } return 0; }