Vigenere дает неверный результат - PullRequest
0 голосов
/ 05 ноября 2019

Задача состоит в том, чтобы при запуске программы дать ключевой аргумент, который я сохранил как string k, затем пользователь вводит текст, и программа выводит этот введенный текст в соответствии с ключевым словом. A = 0, B = 1, поэтому, если ключевое слово ABABA, а текст hello, будет выведено hflmo.

Если я запусту программу, указав argv[1] как "abc", то обычный текст pt как"привет", я должен получить "hfnlp", но вместо этого я получаю "hnflv", почему последняя буква не шифруется правильно?

    string k = argv[1];
    int l = strlen(argv[1]);
    printf("plaintext: ");
    string pt = get_string("");
    printf("ciphertext: ");
    for (int i = 0, shift = 0; i < strlen(pt); i++)
    {    
        if (!isalpha(pt[i]))
        {
            printf("%c", pt[i]);
        }
        else
        {
            if (isupper(pt[i]))
            {
                if (isupper(k[shift]))
                {
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 65)) %26) + 65);
                    shift++;
                }
                else
                {
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 97)) %26) + 65);
                    shift++;
                }
            }
            else if (islower(pt[i]))
            {
                if (isupper(k[shift]))
                {
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 65)) %26) + 97);
                    shift++;
                }
                else
                {
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 97)) %26) + 97);
                    shift++;
                }
            }
        }    
    }                               
    printf("\n");
    return 0;
}    

1 Ответ

2 голосов
/ 05 ноября 2019

В строках

if (isupper(k[shift]))

отсутствует вычисление по модулю. Правильная версия:

if (isupper(k[shift % l]))

Возможно, будет понятнее, если вы поместите этот расчет в какое-то центральное место в for -цикле:

shift %= l;
...