/* Given a set of consecutive characters, find a hash expression that would produce the desired symbols. Result: ('A' * 105 ^ 99) * 3 % 53 = '\n' ('B' * 105 ^ 99) * 3 % 53 = '"' ('C' * 105 ^ 99) * 3 % 53 = ' ' ('D' * 105 ^ 99) * 3 % 53 = '/' */ #include /* Hash function. */ static int Hash(char input, int p, int q, int r, int s) { return (input * p ^ q) * r % s; } static void TryKeySet(const char *keys) { int p, q, r, s, v, coverage; const char *k; for(p = 1; p < 1000; p++) { for(q = 1; q < 1000; q++) { for(r = 1; r < 1000; r++) { for(s = 48; s < 1000; s++) { if( Hash(keys[0], p, q, r, s) != '\n' ) continue; if( Hash(keys[1], p, q, r, s) != '"' ) continue; coverage = 0; v = Hash(keys[2], p, q, r, s); coverage |= v == ' ' ? 1 : (v == '/' ? 2 : 0); v = Hash(keys[3], p, q, r, s); coverage |= v == ' ' ? 1 : (v == '/' ? 2 : 0); if( coverage == 3 ) { printf("keys = %s, p = %d, q = %d, r = %d, s = %d:", keys, p, q, r, s); for(k = keys; *k; k++) printf("\t%d->%d", *k, Hash(*k, p, q, r, s)); putchar('\n'); } } } } } } int main(void) { TryKeySet("ABCD"); return 0; }