/****************************************************************************/ /* Simulacion del cifrado con el cilindro de Jefferson */ /* */ /* Jaime Suarez <mcripto@bigfoot.com> 2003 */ /* en http://elparaiso.mat.uned.es */ /* */ /* Gracias a Andrés J. Díaz que me advirtió de un par de fallos */ /* en el programa. Jun 2004 */ /****************************************************************************/ #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NRUEDAS 10 #define NLETRAS 26 #define MAXFICH 200 #define MODPOS(x,m) ( (x)%(m)>=0 ? ((x)%(m)) : ((x)%(m)+(m)) ) char cil[NRUEDAS][NLETRAS]={ "amnbvcxzpoiuytrewqlkjhgfds", "azqsxwdcefvrgbthnyjmukilop", "aqpkmijnulohbygvtfcrdxeszw", "aisompfnbzcxvqdwgehrjtkylu", "aeqswmpkbijvuhcygnxlotfzrd", "anothwukvbemxpydrglqicjzfs", "adtqkbnurszgmhepioflycwvxj", "amzclyxqndtjofhipvswuekrbg", "aegwokdvciqpfbnslutyjhzrmx", "aylgwenqujxsbdcrmokthzfipv" }; int main() { int ch,op,rueda,desp,lugar; FILE *fi,*fo; char noment[MAXFICH],nomsal[MAXFICH]; printf("Cifrar(c) o descifrar(d) "); op=tolower(getchar()); getchar(); while(op!='c' && op!='d') { printf("Pulsa c para cifrar o d para descifrar. "); op=tolower(getchar()); getchar(); } printf("Nombre del fichero de entrada: "); fgets(noment,MAXFICH,stdin); noment[strlen(noment)-1]='\0'; printf("Nombre del fichero de salida : "); fgets(nomsal,MAXFICH,stdin); nomsal[strlen(nomsal)-1]='\0'; if ((fi=fopen(noment,"r"))==NULL) { printf("Error de lectura abriendo %s\n",noment); exit(1); } if ((fo=fopen(nomsal,"w"))==NULL) { printf("Error de escritura abriendo %s\n",nomsal); exit(1); } rueda=0; if (op=='c') desp=2; else desp=-2; while ((ch=tolower(fgetc(fi))) != EOF) { if (isalpha(ch)) { lugar = index(cil[rueda],ch) - cil[rueda]; ch = cil[rueda][MODPOS(lugar+desp,NLETRAS)]; } fputc(ch,fo); rueda = (rueda+1)%NRUEDAS; } fclose(fi); fclose(fo); return 0; }