pobieranie klucza ,znakow w petli for (petla w petli)

0

przeksztalcam kod dla szyfru Vigenere'a ale jest problem z pobraniem kolejnej litery (klucza) w petli for przy szyfrowaniu.. Znaki sa dobrze pobierane a litera(klucz) tylko pierwsza jest ok..

#include <stdio.h>
#include <string.h>
int main()
{

    int i;
    char z, t, k;
    char znak[5];
    char key[5];

    FILE* f = fopen("key.txt", "r");
    k = getc(f);
    for (t = 0; (t < 5) && (feof(f) == 0) && (k != '\n'); t++) {
        key[t] = k;
        k = getc(f);
    }
    fclose(f);

    FILE* r = fopen("plain.txt", "r"); //czyta z pliku tekst jawny
    z = getc(r);
    for (i = 0; (i < 5) && (feof(r) == 0) && (z != '\n'); i++) {
        znak[i] = z;
        z = getc(r);
    }
    fclose(r);

    for (i = 0; i < 5; i++) { //zamiana tekstu jawnego na kody ascii
        printf("%d\n", znak[i]);
    }

    printf("Klucz: ");
    for (t = 0; t < 5; t++) { //zmiana tekstu=klucza na kody ascii
        printf("\n");
        printf("%d\n", key[t]);
    }
    //szyfrowanie
    for (i = 0; i < 5; i++) {
        for (t = 0; t < 5; t++) {

            if ((znak[i] >= 97) && (znak[i] <= 122)) {
                znak[i] -= 97;
                key[t] -= 97;
                znak[i] += key[t];
                znak[i] = znak[i] % 26;
                znak[i] += 97;
            }
            else if ((znak[i] >= 48) && (znak[i] <= 57)) {
                znak[i] -= 48;
                key[t] -= 48;
                znak[i] += key[t];
                znak[i] = (znak[i] % 10);
                znak[i] += 48;
            }
        }
    }

    FILE* out;
    out = fopen("crypto.txt", "w+t");
    for (i = 0; i < 5; i++) {
        z = znak[i];
        printf(" \n ");
        printf("znaki: %c\n", z);
        fprintf(out, "%c", z);
    }

    fclose(out);

    return 0;
} 
7

Hej, wrzuciłam sobie ten kod i trochę poobrabiałam estetycznie, jeszcze tą funkcję trzeba by trochę ogarnąć, te magic number.

  1. Generalnie wywaliłam pętlę w pętli, bo nie widziałam celowości. Widzę, że na ten moment masz tekst i klucz równej długości a nawet jeśli będziesz w przyszłości mieć różnej, to też będzie jedna pętla.
  2. Na ten moment dopuszczasz, żeby wśród tekstu były znaki a-z i liczby 0-9, nie wiem jak kwestia klucza, ale założyłam, że klucz tak samo i to obsłużyłam, czyli odejmowanie tej różnicy (czyli np. text 'p' key '3'), ale tu nie wiem jak chciałaś.

Kodzik:

#include <stdio.h>

char* readValuesFromFile(int size, char *fileName){
    char* values = new char[size];
    FILE* r = fopen(fileName, "r");
    char z = getc(r);
    for (int i = 0; (i < size) && (feof(r) == 0) && (z != '\n'); i++) {
        values[i] = z;
        z = getc(r);
    }
    fclose(r);
    return values;
}

void printValues(int size, char* text){
    for (int i = 0; i < size; i++) {
        printf("%c\n", text[i]);
    }
}

int toSubstract(char character){
    int toSubstract;
    if(character >= 'a' && character <= 'z'){
        toSubstract = 'a';
    } else if ((character >= '0') && (character <= '9')){
        toSubstract = '0';
    }
    return toSubstract;
}

void encrypt(char* text, char* key, int size){
    for (int i = 0; i < size; i++) {
        if ((text[i] >= 'a') && (text[i] <= 'z')) {
            text[i] -= 'a';
            text[i] += key[i] - toSubstract(key[i]);
            text[i] = text[i] % 26;
            text[i] += 'a';
        }
        else if ((text[i] >= 48) && (text[i] <= 57)) {
            text[i] -= 48;
            text[i] += key[i]- toSubstract(key[i]);
            text[i] = (text[i] % 10);
            text[i] += 48;
        }
    }
}

void saveEncryptedText(char* text, int size){
    FILE* out;
    out = fopen("crypto.txt", "w+t");
    printf("Szyfrujemy:\n");
    for (int i = 0; i < size; i++) {
        printf("%c\n", text[i]);
        fprintf(out, "%c", text[i]);
    }
    fclose(out);
}

int main()
{
    int size = 5;
    char* key = readValuesFromFile(size, "key.txt");
    char* text = readValuesFromFile(size, "plain.txt");

    printf("Tekst:\n");
    printValues(size, text);

    printf("Klucz:\n");
    printValues(size, key);

    encrypt(text, key, size);
    saveEncryptedText(text, size);

    return 0;
}
0

Dodam swój kod żebyś miał w czym wybierać, chociaż ucz się od koleżanki rozbijania kodu na funkcje itd.

#include <stdio.h>

int main()
{
    char znak[5];
    char key[5];
    char k;
    FILE* file;
// odczyt klucza z pliku:
    file = fopen("key.txt", "r");
    k = getc(file);
    for (int i = 0; (i < 5) && (feof(file) == 0) && (k != '\n'); i++)
    {
        key[i] = k;
        k = getc(file);
    }
    fclose(file);
// odczyt tekstu do zaszyfrowania z pliku:
    file = fopen("plain.txt", "r");
    k = getc(file);
    for (int i = 0; (i < 5) && (feof(file) == 0) && (k != '\n'); i++)
    {
        znak[i] = k;
        k = getc(file);
    }
    fclose(file);
// szyfrowanie:
	int sub = 0, mod = 0;
    for (int i = 0; i < 5; i++)
    {
		if ((znak[i] >= 97) && (znak[i] <= 122))
		{
			sub = 97;
			mod = 26;
		}
		else if ((znak[i] >= 65) && znak[i] <= 90)
        {
            sub = 65;
            mod = 26;
        }
		else if ((znak[i] >= 48) && (znak[i] <= 57))
		{
			sub = 48;
			mod = 10;
		}

		znak[i] -= sub;
        key[i] -= sub;
        znak[i] += key[i];
        znak[i] = znak[i] % mod;
        znak[i] += sub;
    }
// zapisywanie do pliku:
    file = fopen("crypto.txt", "w+t");
    for (int i = 0; i < 5; i++)
    {
        printf(" \n ");
        printf("znaki: %c\n", znak[i]);
        fprintf(file, "%c", znak[i]);
    }
    fclose(file);

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1