/* * Captain Midnight decoder badge simulator (first version) * * Don't forget to 18 20 13 3 8 26 14 24 20 14 23 1 16 17 13 3 5 * * mab@crypto.com - 11/17/2000 * * Usage: badge {E|D} key * where E is encrypt mode and D is decrypt mode * and key is a number from 1-26 representing the number * setting for the letter "A" on the dial. * Encryption mode expects ascii on stdin; decryption mode * expects one ciphertext number or nonnumeric char per line. */ #include #include static char ROTOR[]="AXNQEGMKFWZHIOBLTDSRCJVUPY"; main(argc, argv) int argc; char **argv; { char mode; int c; int key; char linein[1024]; int i; if (argc != 3) { fprintf(stderr,"usage: badge e/d key\n"); exit (1); } mode = *(argv[1]); key = atoi(argv[2]); if (isupper(mode)) mode=tolower(mode); if (((mode!='e') && (mode!='d')) || (key < 1) || (key > 26)) { fprintf(stderr,"Usage: badge e/d key\n"); exit (1); } --key; if (mode=='e') while ((c=getchar()) != EOF) { if (isalpha(c)) { if (islower(c)) c=toupper(c); printf("%d\n",badge_encrypt(key,c)); } else if (c=='\n') printf("\n"); else if (isdigit(c) || (c == '\\')) printf("\\%c\n",c); else printf("%c\n",c); } else while (fgets(linein,sizeof(linein),stdin) != NULL) { i=atoi(linein); if ((i>0) && (i<27)) printf("%c",badge_decrypt(key,i)); else if (linein[0] == '\\') printf("%c",linein[1]); else printf("%c",linein[0]); } } badge_encrypt(key,c) int key; int c; { return ((rotorpos(c) + key)%26 + 1); } badge_decrypt(key,i) int key; int i; { return ROTOR[abs((i-1) + (26-key)) % 26]; } rotorpos(c) int c; { int i; for (i=0; i<26; i++) if (ROTOR[i]==c) return i; return -1; }