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üsselen

    Die 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.


Anmelden zum Antworten