einfaches Codierprog. in C



  • Hallo zusammen - ich habe da ein kleines Problem mit einem C-Codierungs-Prog.

    das Programm soll eine .txt Datei einlesen - einen Schlüssel abfragen - und dann eine codierte Datei ausgeben.

    Jedoch codiert das Programm nicht so wie es sollte, werden z.B. in die original Datei nur eine Lange Zeichenkette an a's (oder sonst was) eingegeben, codiert es diese immer nur mit dem gleichen Zeichen.

    Vielen Dank, wenn einer eine Idee hat -

    Gruss Christoph

    hier mal der CODE:

    //Chiffrieren

    # include <stdio.h>
    # include <stdlib.h>

    int main(void)
    {
    char datnam [20]; //Annahme: max 20 Zeichen
    char neuedatei[20];
    FILE *dat; //Zeiger-Deklartion "dat" mit Pointer
    FILE *dat2; //Zeiger-Deklartion "dat2" mit Pointer
    unsigned char text,schluessel[81]; //oder unsigned
    int s,z,erg,code;

    printf("\nChiffrier-Programm:");
    printf("\n\nBitte zu chiffrierende Datei eingeben: ");
    gets(datnam); //Eingabe der ursp. Datei
    dat = fopen (datnam,"rb"); //öffnet Datei - liefert Pointer auf Datei ("rb" -> read + write BINARY)

    if (dat == NULL) //Existenzprüfung (logische Operation)
    {
    printf("Die Datei ist nicht vorhanden");
    getchar();
    exit(1);} //"return" alternativ
    printf("\nBitte Schluessel eingeben: ");
    gets(schluessel);

    if (strlen (schluessel) >= 5 )
    {
    // printf("%d\n", strlen (schluessel));
    printf("\nPasswort zulaessig");
    }
    else
    {
    printf("\nPasswort zu kurz - mind. 5 Zeichen eingeben");
    getchar();
    exit(0);
    }

    printf("\n\nBitte geben sie die zu erstellende Datei ein: \n");
    gets(neuedatei);

    for (z=0; z>81; z++)
    {

    if (schluessel [z]== 0 ) //Abbruch Prüfung
    break;
    }

    dat2 = fopen (neuedatei,"wb"); //"wb" -> "write plus read binary"

    if (dat2 == 0) //prüft (richtige) Eingabe
    {
    printf("Datei kann nicht erstellt werden");
    getchar();
    exit(1);
    }

    s = 1;

    for (text=fgetc(dat);!feof(dat);text=fgetc(dat)) //- Codiert: einzel. Zeichen als int-Wert;
    //- end-of-file -
    //- einz. Zeichen (int) wir 'text' zugewiesen
    {
    erg =(int)text;
    code =(int)schluessel[s];
    fputc(erg + code, dat2); //schreibt jeweils ein Zeichen die Datei

    if(erg == '\n') //bei Zelenumbruch -> '0'/'s==z' keine Verschlüsselung
    s=0;
    else if (s==z)
    s=0;
    else
    s++;

    }

    fclose (dat); //Abschluss: schlißt Dateien
    fclose (dat2);
    printf ("\n\nDatei %s wurde in %s chiffriert",datnam,neuedatei);
    getchar();
    //return;
    exit(1);
    }



  • wieso willst du binär lesen und schreiben, wenn du dann doch zeilenweise liest?

    dein verfahren nennt sich übrigens vigenere. du hast es allerdings auf 256 zeichen ausgeweitet.
    traditionell wird es nur auf die 26 buchstaben angewandt.
    bei größeren texten (schlüssellänge * 1000 zeichen) natürlicher sprache (also deutsch, englisch, ...) ist vigenere leicht knackbar.

    /* rewritten by Christoph Rackwitz */
    
    #include <stdio.h>
    #include <string.h>
    
    #define NAMELEN 300
    #define KEYLEN 80
    #define MINKEYLEN 5
    
    void rtrim(char *s);
    
    int main()
    {
    	char quelldatei[NAMELEN], zieldatei[NAMELEN];
    	FILE *quelle, *ziel;
    	char c, schluessel[KEYLEN];
    	int i, schluessellen = 0;
    
    	printf("Chiffrierprogramm\n");
    
    	printf("Bitte Quelldatei angeben: ");
    	fgets(quelldatei, NAMELEN, stdin);
    	rtrim(quelldatei);
    
    	printf("Bitte Zieldatei eingeben: ");
    	fgets(zieldatei, NAMELEN, stdin);
    	rtrim(zieldatei);
    
    	if ((quelle = fopen(quelldatei, "rb")) == 0)
    	{
    		printf("Fehler beim Oeffnen der Quelldatei");
    		return 1;
    	}
    
    	if ((ziel = fopen(zieldatei, "wb")) == 0)
    	{
    		fclose(quelle);
    		printf("Fehler beim Oeffnen der Zieldatei");
    		return 1;
    	}
    
    	for(;;)
    	{
    		printf("Bitte Schluessel eingeben: ");
    		fgets(schluessel, KEYLEN, stdin);
    		rtrim(schluessel);
    		if (strlen(schluessel) >= MINKEYLEN)
    			break;
    		else
    			printf("Schluessel zu kurz!\n");
    	}
    
    	i = 0;
    	schluessellen = strlen(schluessel);
    	while (!feof(quelle)&!ferror(ziel))
    	{
    		c = fgetc(quelle);
    		if (!(c^EOF)) break;
    
    		/* "verschluesseln" */
    		c += schluessel[i++%schluessellen];
    
    		fputc(c, ziel);
    	}
    
    	fclose(ziel);
    	fclose(quelle);
    
    	printf("\nDatei %s wurde als %s verschluesselt", quelldatei, zieldatei);
    
    	return 0;
    }
    
    void rtrim(char *s)
    {
    	while(*s)(*s=(*s==0x0D||*s==0x0A)?0:*s),++s;
    }
    


  • ...erstmal danke für das Programm - jedoch verschlüsselt es ein Zeichen immer gleich - wenn man z.B. eine .txt Datei codiert, die nur aus vielen "a`s" besteht, kodiert das Programm immer gleich - das dürfte doch nicht zu sicher sein oder?

    Gruss Christoph



  • for(z=0; z>81; z++)
    {
      if(schluessel[z]==0) //Abbruch Prüfung 
        break; 
    }
    

    dein fehler ist, daß du versehentlich z>81 anstelle von z<81 geschrieben hast! damit ist z immer 0.

    du kannst aber auch, wie es c.rackwitz in seinem code-vorschlag gemacht hat, strlen(schlüssel) verwenden. es lohnt sich, die stdlib-funktionen zu lernen. die machen deinen code übersichtlicher und sparen eine dir eine menge arbeit.



  • chriese schrieb:

    ...erstmal danke für das Programm - jedoch verschlüsselt es ein Zeichen immer gleich - wenn man z.B. eine .txt Datei codiert, die nur aus vielen "a`s" besteht, kodiert das Programm immer gleich - das dürfte doch nicht zu sicher sein oder?

    Gruss Christoph

    nein, wirds nicht.
    gibs zu, du hast es nicht ausprobiert.
    ich hab es grad ausprobiert und es geht wie gewünscht.
    input als hex: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
    schlüssel: @ABCDE (hex 40 41 42 43 44)
    output als hex: 80 81 82 83 84 85 80 81 82 83 84 85 80 81 82 83

    wenn du was in meinem code nicht verstehst, frag doch einfach, bevor du es als "fehler" ansiehst.



  • sorry programm war richtig - ICH habe nur den Fehler gemacht und habe nach dem kompilieren auch gleich "ausführen" gestartet - dann funkt. einige Programme nicht richtig (habe den Bloodshed DEV C++)- als wenn man Sie unter DOS laufen läßt!!! werde aber mal ein paar "getchar ()" einbauen - oder gibt es da bessere Alternativen?

    Nochmals sorry!

    Gruss Chriese



  • Wie wärs, wenn du das Programm von der Konsole aus startest?
    Es ist immerhin ein Konsolenprogramm und dann hat da ein getchar() zum Verzögern nichts drin zu suchen.

    ich sehs grad: crosspost!! http://www.buha.info/board/showthread.php?t=49222


Anmelden zum Antworten