/* * enigma.c * * Written by kafi, octo, tokkee * aka. * Carl-Friedrich Luebeck * Florian Forster * Sebastian Harl */ #include #include #include #include int r_position; char rotor1[] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; char rotor1_e[] = " -- to be initialized -- "; char rotor1_d[] = " -- to be initialized -- "; char rotor2[] = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; char rotor2_e[] = " -- to be initialized -- "; char rotor2_d[] = " -- to be initialized -- "; char rotor3[] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; char rotor3_e[] = " -- to be initialized -- "; char rotor3_d[] = " -- to be initialized -- "; /* (AY) (BR) (CU) (DH) (EQ) (FS) (GL) (IP) (JX) (KN) (MO) (TZ) (VW) */ char reflector[] = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; void init (void) { char plain; char cypher; r_position = 0; /* TODO */ for (plain = 'A'; plain <= 'Z'; plain++) { cypher = rotor1[plain - 'A']; rotor1_e[plain - 'A'] = cypher - plain; rotor1_d[cypher - 'A'] = plain - cypher; cypher = rotor2[plain - 'A']; rotor2_e[plain - 'A'] = cypher - plain; rotor2_d[cypher - 'A'] = plain - cypher; cypher = rotor3[plain - 'A']; rotor3_e[plain - 'A'] = cypher - plain; rotor3_d[cypher - 'A'] = plain - cypher; } /* for */ printf ("########################\n" "# Our great enigma!!1! #\n" "########################\n"); } /* init */ int encrypt (int plain) { int tmp; int rotor1_p = r_position % 26; int rotor2_p = (r_position / 26) % 26; int rotor3_p = (r_position / 676); /* 676 == 26^2 */ /* fprintf (stderr, "rotor1_p = %i; rotor2_p = %i; rotor3_p = %i;\n", rotor1_p, rotor2_p, rotor3_p); */ tmp = plain - 'A'; tmp = (26 + tmp + rotor1_e[(tmp + rotor1_p) % 26]) % 26; tmp = (26 + tmp + rotor2_e[(tmp + rotor2_p) % 26]) % 26; tmp = (26 + tmp + rotor3_e[(tmp + rotor3_p) % 26]) % 26; tmp = reflector[tmp]; tmp -= 'A'; tmp = (26 + tmp + rotor3_d[(tmp + rotor3_p) % 26]) % 26; tmp = (26 + tmp + rotor2_d[(tmp + rotor2_p) % 26]) % 26; tmp = (26 + tmp + rotor1_d[(tmp + rotor1_p) % 26]) % 26; r_position = (r_position + 1) % 17576; /* 17576 == 26^3 */ /* fprintf (stderr, "r_position = %i;\n", r_position); */ return ('A' + tmp); } /* encrypt */ int main(int argc, char **argv) { int key; if ((argc != 2) && (argc != 4)) { printf ("Usage: %s ( | )\n", argv[0]); return 1; } init (); if (argc == 2) { r_position = atoi (argv[1]) % 17576; /* 17576 == 26^3 */ } else { r_position = atoi (argv[1]) % 26; r_position += (atoi (argv[2]) % 26) * 26; r_position += (atoi (argv[3]) % 26) * 676; } printf ("r_position = %i;\n", r_position); while ((key = getc (stdin)) != EOF) { if ((key >= 'a') && (key <= 'z')) key += 'A' - 'a'; if ((key < 'A') || (key > 'Z')) continue; putc (encrypt (key), stdout); } putc ('\n', stdout); return 0; } /* main */