язык шифра Виженера

Я пытаюсь сделать шифр Виженера на языке C. Предполагается, что ввод должен состоять только из букв алфавита (a->z).

В настоящее время моя проблема заключается в том, что на выходе выводятся только 4 символа и выводятся странные символы вне алфавита. Я создал операторы if, чтобы предотвратить это, но, похоже, они не работают. Любой совет?

#include <stdio.h>


int main(){
    int i=0;
//Vigenere Cipher-- keyword is "apple"
//a = 1  value shift
//p = 16 value shift
//p = 16 value shift
//l = 17 value shift
//e = 5  value shift
 //cleaning out string array
 char guy[100];

printf("Enter the plain text: ");
fgets(guy, 100, stdin);//takes user's input

while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string

    if ((i%5==0) || i==0){ //checks to see which character it is in the string, for instance the numbers 0,5,10,15,20 should all be added by 1
    guy[i] = guy[i]+1;
    if (guy[i]>'z' && guy[i]<'A'){
            guy[i]-25;
    }
    if (guy[i]>'Z' && guy[i]>'A'){
        guy[i]-25;
    }
    }

    if (((i-1)%5==0) || i==1){ //all numbers that are second in the key word 'apple', such as 1,6,11,16
        guy[i]=guy[i]+16;
        if (guy[i]>'z' && guy[i]<'A'){
            guy[i]-25;
        }
        if (guy[i]>'Z' && guy[i]>'A'){
            guy[i]-25;
        }
    }
    if (((i-2)%5==0) || i==2){// all numbers that are third to the key word 'apple' , such as 2,7,12,17,22
        guy[i]=guy[i]+16;
        if (guy[i]>'z'&& guy[i]<'A'){
            guy[i]-25;
        }
        if (guy[i]>'Z'&& guy[i]>'A'){
            guy[i]-25;
        }
    }
    if(((i-3)%5==0) || i==3){// all numbers that are fourth to the key word 'apple', such as 3,8,13,18
        guy[i]=guy[i]+17;
        if (guy[i]>'z'&&guy[i]<'A'){//takes care of z
            guy[i]-25;
    }
        if (guy[i]>'Z' && guy[i]>'A'){//takes care of Z
            guy[i]-25;
        }
    }
    if(((i-4)%5==0) || i==4){// all numbers that are fifth in the key word 'apple', such as 4,9,14,19
        guy[i]=guy[i]+5;
        if (guy[i]>'z'&& guy[i]<'A'){
            guy[i]-25;
        }
        if (guy[i]>'Z' && guy[i]>'A'){
            guy[i]-25;
        }
    }
    else {
    i++;
    }
    }
printf("Encrypted text is: %s\n",guy);
}

person John Miller    schedule 30.11.2016    source источник
comment
Вам действительно нужно написать функцию char encrypt_char(char plain_text, char key), а затем вызвать ее с помощью guy[i] = encrypt_char(guy[i], "apple"[i%5]);. Кроме того, if (guy[i]>'Z'&& guy[i]>'A') совпадает с if (guy[i]>'Z'). Вы также должны научиться использовать отладчик, чтобы вы могли пройти и посмотреть, что происходит, а также подумать о том, как должны быть зашифрованы ПРОБЕЛ или цифра и т. д., если вообще должны быть зашифрованы.   -  person Ken Y-N    schedule 30.11.2016


Ответы (2)


У вас есть функция encrypt_char(), которая выполняет шифрование за вас.

void encrypt_char(char *character, unsigned int offset)
{
    if('a' <= *character && 'z' >= *character)
    {
        *character = ((*character + offset - 'a') % 26) + 'a';
    } 
    else if('A' <= *character && 'Z' >= *character)
    {
        *character = ((*character + offset - 'A') % 26) + 'A';
    }
}

Назовите его своим значением смещения.

if (i%5==0){
    encrypt_char(&(guy[i]), 1);
} else if ((i-1)%5==0){
     encrypt_char(&(guy[i]), 16);
} else...
person MayurK    schedule 30.11.2016
comment
|| i==0 и т. д., конечно, не нужны, так как 0%5 == 0 и т. д. - person Ken Y-N; 30.11.2016
comment
Да! Я просто скопировал код из вопроса. Удаление его. - person MayurK; 30.11.2016

Вместо того, чтобы отдавать всю игру, вот некоторый код (непроверенный!), основанный на моем комментарии:

char encrypt_char(char plain_text, char key)
{
    char offset = tolower(key) - 'a' + 1;
    if (islower(plain_text))
        return (plain_text - 'a' + 1 + offset) % 26 + 'a';
    else if (isupper(plain_text))
        return (plain_text - 'A' + 1 + offset) % 26 + 'A';
    else
        return plain_text;
}

Это может быть ошибкой где-то по пути, так что получайте удовольствие от отладки!

person Ken Y-N    schedule 30.11.2016
comment
Вычисление смещения выглядит неправильно (Или это неправильно в вопросе!). «p» должно быть 16, а «l» должно быть 17 в соответствии с вопросом. Я думаю, что должна быть таблица поиска. - person MayurK; 30.11.2016
comment
Я упоминал выше, что он вызывается с encrypt_char(guy[i], "apple"[i%5]). - person Ken Y-N; 30.11.2016
comment
Я это понимаю. Я говорю, что ключ не является индексом символа в наборе алфавита. Если правильно понять вашу логику, значения смещения для {a,p,p,l,e} равны {1, 16, 16, 12, 5}, что неверно. Должно быть {1, 16, 16, 17, 5}. Надеюсь, у меня есть смысл! - person MayurK; 30.11.2016
comment
@MayurK Я подозреваю, что 17 является ошибкой, поскольку указано, что apple, а не appqe является ключом ... - person Ken Y-N; 30.11.2016