⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Basic test of Vigenere s Algorithm
💻 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 + -