home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * TITEL : Crypt *
- * *
- * DATEI : crypt.c Hauptprogramm *
- * VERSION : 1.0 *
- * AUTOR : Joachim Eckart *
- * DATUM : 11/86 *
- ********************************************************************/
-
- #include <stdio.h>
- #include "crypt.h"
-
- /*** Fehlermeldungen ***/
- char *err[]= {
- "Usage: crypt quelle [ziel] key ", /* 0 */
- "Oeffnen Eingabedatei nicht moeglich !", /* 1 */
- "Oeffnen Ausgabedatei nicht moeglich !", /* 2 */
- "Fehler beim Schreiben in Ausgabedatei !", /* 3 */
- "Fehler beim Lesen aus Eingabedatei !", /* 4 */
- "Speichermangel !", /* 5 */
- "Datei maximal 32KB !" /* 6 */
- };
-
- /*** Globalvariablen ***/
- char *buffer,*buf_ptr; /* Zeiger auf Einlesepuffer */
- char key[MAXKEYL]; /* Schluessel */
- char infile[64],outfile[64]; /* Pfadname Ein/Ausgabedatei */
- int nread,count; /* Puffergroesse */
- int keylen; /* Laenge des Schluessels */
-
- /*** Main ***/
- main(argc,argv)
- int argc; /* Anzahl beim Aufruf uebergebener */
- /* Argumente */
- char *argv[]; /* Vektor mit Zeigern auf Argumente */
-
- {
- int c;
- cls();
- crs_off();
- pos(29,8);rev_on();put_s("DECRYPT ----- ENCRYPT");rev_off();
- pos(14,10);put_s("ASCII oder Binaerdatei wird ent- oder verschluesselt.");
- pos(17,12);put_s("Ein- und Ausgabedatei duerfen identisch sein !");
- pos(25,14);put_s("!! Dateigroesse maximal 32KB !!");
-
- switch(argc)
- {
- case 1:
- case 2:
- usage(err[0]);
- break;
- case 3:
- keylen = strlen(argv[2]); /* Zeiger auf Schluessel */
- strcpy(key,argv[2]); /* Schluessel belegen */
- strcpy(infile,argv[1]);
- strcpy(outfile,"SCREEN");
- show_file();
- open_in(); /* Eingabedatei oeffnen */
- crypt(); /* Bufferinhalt verschl. */
- cls();
- while((c = getc_buf()) != EOF) putc(c,stdout); /* CRT */
- buf_ptr = buffer; /* wieder auf buffer zeigen */
- break;
-
- case 4: /* Zieldatei explizit angegeben */
- keylen = strlen(argv[3]); /* Zeiger auf Schluessel */
- strcpy(key,argv[3]); /* Schluessel belegen */
- strcpy(infile,argv[1]);
- strcpy(outfile,argv[2]);
- show_file();
- open_in(); /* Eingabedatei oeffnen */
- crypt(); /* Bufferinhalt verschl. */
- output();
- break;
- default:
- usage(err[0]);
- } /* end switch(argc) */
-
- rev_on();
- pos(57,24);
- put_s("READY -- PRESS ANY KEY");
- rev_off();
- get_hidden();
- repair_scr(); /* falls bei binaerer Ausgabe auf Screen ........ */
- free(buffer); /* Speicher freigeben */
- }
-
- usage(message) /* Fehlermeldung und Abbruch */
- register char *message;
- {
- pos(0,24);rev_on();
- put_s(message);
- rev_off();
- get_hidden();
- repair_scr();
- exit();
- }
-
- show_file() /* Dateiinfo anzeigen */
- {
- rev_on();
- pos(1,1);put_s("EINGABE :");
- pos(40,1);put_s("AUSGABE :");
- rev_off();
- pos(1,2);put_s(infile);
- pos(40,2);put_s(outfile);
- }
-
- int getc_buf() /* naechstes Zeichen aus Eingabe */
- {
- if (nread--) return( (int)(*buf_ptr++));
- else return(EOF);
- }
- #define LAST (*(buf_ptr - 1))
- crypt() /*** crypt ***/
- {
- int i;
- for(i=0;i<keylen;i++) key[i] ^= 0x7f; /* kein reiner alpha-key */
- i = 1;
- while (getc_buf() != EOF)
- {
- LAST ^= (int)key[i-1]; /* exklusiv oder */
- i = (i % keylen) +1; /* zyklisch naechstes Zeichen */
- }
- buf_ptr = buffer;
- nread = count;
- }
- extern long lseek();
- open_in() /* Lesen Eingabedatei in Puffer */
- {
- int fildes;
- long size;
- if ( (fildes = open(infile,PMODE)) == -1) usage(err[1]);
- if ( (size = lseek(fildes,0L,2)) == -1 || size > MAXSIZE)
- { close(fildes); usage(err[6]); }
- if(lseek(fildes,0L,0) == -1) usage(err[4]);
- if ( (buffer = malloc(MAXSIZE)) == (char *)0) usage(err[5]);
- buf_ptr = buffer;
- if ( (nread=read(fildes,buffer,(unsigned)size)) == -1) usage(err[4]);
- count = nread;
- close(fildes);
- }
-
- output() /*** Buffer in Datei schreiben ***/
- {
- int fildes;
- if((fildes = creat(outfile,PMODE)) == -1)
- /* unter EOS an sich nur creat(outfile) - es geht aber auch so */
- usage(err[2]); /* Oeffnen geklappt ? */
- if((nread = write(fildes,buffer,count)) != count)
- { close(fildes);
- usage(err[3]); } /* zu wenig Zeichen ? */
- close(fildes);
- }