Проблема использования по модулю с отрицательными числами в программе расшифровки - PullRequest
2 голосов
/ 17 июня 2011

Я довольно плохо знаком с C и недавно работал над созданием простой программы шифрования / дешифрования. Мне удалось получить хорошее шифрование, но я столкнулся с проблемой расшифровки.

Соответствующий код выглядит следующим образом:

Шифрование (где asciinum - это значение ascii для буквы, а k - ключ "vigenere", на который необходимо сместить).

//shifts lowercase letters by key
    if (asciinum >= 97 && asciinum <= 123)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 97) + k;
        asciinum = (asciinum % 26) + 97;
        letterc = (char) asciinum;
        //printf("%c\n", letterc);
        cipher[j] = letterc;
        p++;
    }

    //shifts uppercase letters by key
    if (asciinum >= 65 && asciinum <= 91)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 65) + k;
        asciinum = (asciinum % 26) + 65;
        letterc = (char) asciinum;
        cipher[j] = letterc;
        p++;
    }

Я хочу использовать аналогичную модель для расшифровки (используя тот же ключ), но метод по модулю, который я использовал, чтобы обернуть вокруг 26 символов, не работает при отрицательном значении asciinum, как было бы в случае вычитания ак 5 от (то есть 0).

Попытка расшифровки ...

    //shifts uppercase letters by key
    if (asciinum >= 65 && asciinum <= 91)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 65) - k;
        asciinum = (asciinum % 26) + 65;
        letterc = (char) asciinum;
        cipher[j] = letterc;
        p++;
    }

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

В пре-C99 C поведение % для отрицательных чисел определяется реализацией.В C99 и далее он определен, но не делает то, что вы хотите.

Самый простой выход - сделать:

((asciinum + 26) % 26)

Предполагая, что asciinum никогда не может быть ниже -26.

3 голосов
/ 17 июня 2011

Вместо использования asciinum % 26, используйте (asciinum + 26) % 26, это даст вам возможность использовать модуль для положительных чисел за счет дополнительного сложения каждый раз в течение цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...