📄 main.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "utilities2.h"#include "utilities.h"#define ENCODING 0#define DECODING 1#define MIN 3#define MAX 7#define N 10char *caesar (char *p,char k,int sizeOfP,int codingMode);char *vigenere (char *p,char *k,int sizeOfP,int codingMode);char bruteCaesar(char* code);char freqAnalysis(char *code);int* distances (char* code);int main(){
char *code = getText("code2.txt");
int *dists=distances(code);
int i=0;
// for (i=0;i<150;i++){printf("\n[%i]: %i",i,dists[i]);}
int * N_sorted_dists = sortArray( dists,strlen(code)+2 ,N); // 2.
// *dists mit 0en initialisieren
/*ggT der N abstaende aus N_sorted_dists berechnen*/
int ggT = 0;
int hggT = 2;
printf("\n\n %i -- \n",N_sorted_dists[2]);
ggT = euklid(N_sorted_dists[1],N_sorted_dists[0]);
while(hggT < N){
printf("\nx: %i",N_sorted_dists[hggT]);
printf("--%i\n",ggT);
ggT = euklid(N_sorted_dists[hggT],ggT);
hggT++; }
/*Haeufigkeitsanalyse bzgl. ggT (muss nicht als Fkt. implementiert sein. Kann auch in main() gemacht werden*/ char key[ggT];
char help[strlen(code)];
int j, k;
for(i = 0; i < ggT; i++) {
k = 0;
j = i;
while (j <= strlen(code)) {
help[k] = code[j];
k++;
j += ggT;
}
help[k] = '\0';
key[i] = freqAnalysis(help);
}
key[ggT]='\0';
printf("\n\nKey: %s\n",key);/*Decodierung mit dem gefunden Schlüssel und abschließendes Abspeichern*/ char *decoded = vigenere(code,key,strlen(code)+1,DECODING);
puts("Entschluesselt:\n"); printf("\n%s",decoded); //writeText(decoded,"plaintext.txt");/*Saubermachen*/ free(N_sorted_dists); free(decoded); free(code); return 0;}int* distances (char* code){ /*Hier gehts los*/
int i = MIN, j = 0, k=0, abstand = 0;
char *sub, *pos=NULL;
int *hauf;
hauf = (int*) calloc(strlen(code)+2,sizeof(int));
sub = (char*) malloc(MAX*sizeof(char));
while(i < MAX){
for ( j = 0; j < strlen(code); j++){
for(k=0;k<i;k++)
sub[k] = code[j+k];
sub[k] = '\0';
pos = strstr(code+j+1,sub);
if(pos!=NULL){
abstand = pos - (code+j);
hauf[abstand]++;
printf("- %i -- hauf: %i\n" , abstand, hauf[abstand]);
}
}
i++;
}
free(sub);
return hauf;
}/*Die vier Funktionen aus dem Betreuten Programmieren*/char *caesar (char *p,char k,int sizeOfP,int codingMode){ char *c = (char*)malloc(sizeOfP*sizeof(char)); k=k-'A'; int i=0; if(codingMode==ENCODING) { while (*(p+i)!='\0') { if((*(p+i))+k>'Z') *(c+i) = ((*(p+i))+k)-('Z'+1) + 'A'; else *(c+i) = (*(p+i))+k; i++; } } else if(codingMode==DECODING) { while (*(p+i)!='\0') { if((*(p+i))-k<'A') *(c+i) = 'Z' - ('A'-((*(p+i))-k)-1); //*(c+i) = 'Z' - ('A'-(*(p+i)-(*(k+j)-'A'))-1); else *(c+i) = (*(p+i))-k; i++; } } else return NULL; (*(c+i))='\0'; return c;}char *vigenere (char *p,char *k,int sizeOfP,int codingMode){ char *c = (char*)malloc(sizeOfP*sizeof(char)); int i=0,j=0; if(codingMode==ENCODING) { while (*(p+i)!='\0') { if((*(p+i))+((*(k+j))-'A')>'Z') *(c+i) = ((*(p+i))+((*(k+j))-'A'))-('Z'+1) + 'A'; else *(c+i) = (*(p+i))+((*(k+j))-'A'); i++; if((*(k+j+1))!='\0') j=j+1; else j=0; } } else if(codingMode==DECODING) { while (*(p+i)!='\0') { if((*(p+i))-((*(k+j))-'A')<'A') *(c+i) = 'Z' - ('A'-(*(p+i)-(*(k+j)-'A'))-1); else *(c+i) = (*(p+i))-((*(k+j))-'A'); i++; if((*(k+j+1))!='\0') j=j+1; else j=0; } } else return NULL; (*(c+i))='\0'; return c;}char bruteCaesar(char* code){ int isGood=0; char k=64; char *p; int i; while(isGood==0) { k++; if(k>'Z') return 0; p=caesar(code,k,strlen(code)+1,DECODING); printf("\n"); for(i=0;i<20;i++) printf("%c",p[i]); printf("\nSchlüssel: %c",k); printf("\nWenn der Schlüssel passt mit 1 bestätigen oder 0 ablehnen: "); scanf("%i",&isGood); } return k;}char freqAnalysis(char *code){ int counter[26]; int i,max=0,maxind=0; for(i=0;i<26;i++) counter[i]=0; while(*(code+i)!='\0') { counter[*(code+i)-65]++; i++; } for(i=0;i<26;i++) { if(counter[i]>max) { max=counter[i]; maxind=i; } } return (char)65+((26+(maxind-4))%26);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -