#include #include #include #include #define alpha(x) (tolower((x))-'a'+1) /* * Example: * $ ./vigenere "hi from somewhere" somekey e * zw jbsk gaqoafwfq * $ ./vigenere "zw jbsk gaqoafwfq" somekey d * hi from somewhere * * This code might be bugged.. I just coded it for fun a quite long time ago. */ char *square[] = { "AABCDEFGHIJKLMNOPQRSTUVWXYZ", "AABCDEFGHIJKLMNOPQRSTUVWXYZ", "BBCDEFGHIJKLMNOPQRSTUVWXYZA", "CCDEFGHIJKLMNOPQRSTUVWXYZAB", "DDEFGHIJKLMNOPQRSTUVWXYZABC", "EEFGHIJKLMNOPQRSTUVWXYZABCD", "FFGHIJKLMNOPQRSTUVWXYZABCDE", "GGHIJKLMNOPQRSTUVWXYZABCDEF", "HHIJKLMNOPQRSTUVWXYZABCDEFG", "IIJKLMNOPQRSTUVWXYZABCDEFGH", "JJKLMNOPQRSTUVWXYZABCDEFGHI", "KKLMNOPQRSTUVWXYZABCDEFGHIJ", "LLMNOPQRSTUVWXYZABCDEFGHIJK", "MMNOPQRSTUVWXYZABCDEFGHIJKL", "NNOPQRSTUVWXYZABCDEFGHIJKLM", "OOPQRSTUVWXYZABCDEFGHIJKLMN", "PPQRSTUVWXYZABCDEFGHIJKLMNO", "QQRSTUVWXYZABCDEFGHIJKLMNOP", "RRSTUVWXYZABCDEFGHIJKLMNOPQ", "SSTUVWXYZABCDEFGHIJKLMNOPQR", "TTUVWXYZABCDEFGHIJKLMNOPQRS", "UUVWXYZABCDEFGHIJKLMNOPQRST", "VVWXYZABCDEFGHIJKLMNOPQRSTU", "WWXYZABCDEFGHIJKLMNOPQRSTUV", "XXYZABCDEFGHIJKLMNOPQRSTUVW", "YYZABCDEFGHIJKLMNOPQRSTUVWX", "ZZABCDEFGHIJKLMNOPQRSTUVWXY", }; int main(int ac, char **av) { if (ac < 4) { fprintf(stderr, "Usage: %s txt key enc|dec\n", av[0]); return 0; } char *txt, *key, *what; txt = av[1]; key = av[2]; what = av[3]; unsigned int keylen, textlen, i, kcount; keylen = strlen(key); textlen = strlen(txt); char done[50]; memset(done,0,50); for (i = 0, kcount = 0; i < textlen; i++, kcount++) { if (kcount == keylen) kcount = 0; if (!isalpha(txt[i])) { done[i] = txt[i]; continue; } if (*what == 'e') done[i] = tolower(square[alpha(key[kcount])][alpha(txt[i])]); else done[i] = tolower(square[0][(int)(strchr(square[alpha(key[kcount])],toupper(txt[i]))-square[alpha(key[kcount])])]); } printf("%s\n",done); return 0; }