Cesar Verschlüsselung - Problem
-
Hallo,
Also ich habe ein Programm geschrieben das einzelen chars(Lowercase Alphabet) mittels eines Schlüssels K(a,b) ver- und wieder entschlüsseln kann.
Doch ich habe das problem dass chars >= 'x' nicht richtig ver- oder entschlüsselt werden.. :(, entweder es ist nur eine Dummheit von mir oder kA.
Wäre nett wenn sich jmd. das anschauen könnte:
ps.
chiffrement == verschlüsseln
dechiffrement == entschlüsselenDie Source und testdateien sind hier: http://www.homepages.lu/ggengoux/cesar.rar
fin.txt wird verschlüsselt zu fout.txt und fout.txt wird wiederum in fout2.txt entschlüsselt
Danke im Voraus!!
Mfg Pascal**
bijection.c**#include <stdio.h> int char_to_Z26(char c, int* res) { if(c >= 'a' && c <= 'z') { *res=(((int)c)-97); return 0; } *res=c; return 1; } int Z26_to_char(int a, int* res) { if(a > -1 && a < 26) { *res=((char)(a+97)); return 0; } *res=a; return 1; } int chiffrement_affine_Z26(int a, int b, int x, int *res) { if(x > -1 && x < 26) { *res = (a * x + b) % 26; return 0; }else *res = x; return 1; } int inv_mod_Z26(int a) { int i; for (i=1;i<26;i++) { if (((a*i)%26)==1) { return i; } } return -1; } int dechiffrement_affine_Z26(int inv_a, int b, int y, int *res) { if(y > -1 && y < 26) { *res = (inv_mod_Z26(inv_a)*(y-b)) % 26; return 0; }else *res = y; return 1; } int chiffrement_fichier_Z26(int a, int b, const char *filein, const char *fileout) { FILE *fin=fopen(filein,"r"); FILE *fout=fopen(fileout,"w"); int c,r,r1; if(fin!=NULL) { if(fout!=NULL) { while((c=fgetc(fin))!=EOF && !feof(fin)) { if(c != EOF) { char_to_Z26(c,&r1); chiffrement_affine_Z26(a,b,r1,&r); fputc((char)r,fout); } } fclose(fin); fclose(fout); return 0; }else { fprintf(stderr,"Cannot open file %s",fileout); } }else { fprintf(stderr,"Cannot open file %s",filein); } return 1; } int dechiffrement_fichier_Z26(int a, int b, const char *filein, const char *fileout) { FILE *fin=fopen(filein,"r"); FILE *fout=fopen(fileout,"w"); int c,r,r1; if(fin!=NULL) { if(fout!=NULL) { while((c=fgetc(fin))!=EOF) { if(c!=EOF) { dechiffrement_affine_Z26(a,b,c,&r1); Z26_to_char(r1,&r); fputc((char)r,fout); } } fclose(fin); fclose(fout); return 0; }else { fprintf(stderr,"Cannot open file %s",fileout); } }else { fprintf(stderr,"Cannot open file %s",filein); } return 1; }
**
main.c**#include <stdio.h> #include "bijection.h" #include <string.h> int main() { chiffrement_fichier_Z26(1,3,"fin.txt","fout.txt"); dechiffrement_fichier_Z26(1,3,"fout.txt","fout2.txt"); return 0; }
-
*res = a*x+b%26;
Da kann es sein, daß du die Klammern vergessen hast - % hat eine höhere Priorität als +, wird also nur auf b angewendet. (richtig ist vermutlich
*res=(a*x+b)%26;
)(btw solltest du noch sicherstellen, daß a kein Teiler von 26 ist, sonst kannst du deinen Text nicht mehr dechiffrieren)
-
Oh ja, das hab ich übersehen. Wo vorhin noch ASCII von kleiner wie 97 waren sin jetzt ýþÿ ASCII 253,254,255
also wird:
Hello World! abcdefghijklmnopqrstuvwxyz
zu:
Hello World! abcdefghijklmnopqrstuvwýþÿkomisch
-
Lass das Programm mal durch den Debugger laufen und schau dir an, ob dort alle Berechnungen richtig ablaufen.
(oder du lässt für den Anfang den Parameter a weg - dann vereinfacht sich die Verschlüsselung zu
*res=(x+b)%26;
und die Entschlüsselung zu*res=(x-b)%26;
)Ich vermute mal, daß bei der Berechnung der inversen Division irgendetwas schiefgelaufen ist - aber da ich nicht überblicke, was dort passiert, kann ich das nicht überprüfen.