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 Dateiif(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 83wenn 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