Цезарь Шифр ​​в C Шифрование и дешифрование, слишком высокие значения ASCII - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над кодом шифрования / дешифрования для C. Хотя у меня есть код, который достаточно хорошо шифрует и дешифрует, все же есть некоторые ошибки. Я хочу, чтобы ввод пользователя был между '!' (ASCII-значение 32) и '~' (ASCII-значение 126). Однако, когда пользователь вводит символ, такой как '~', с довольно высоким смещением / значением ключа, вывод находится в расширенном диапазоне символов ASCII. Есть ли способ, которым я могу заставить вывод не находиться в расширенном диапазоне символов и по-прежнему правильно расшифровывать / шифровать?

Я перепутался с изменением значений для "шифра", но это тоже не помогло много.

Ниже мой код

    void Encryption(char* OriginalText, int offset) {
    int i = 0;
    int cipher;
    char encrypt;
    printf("Encrypted string: \n");
    while (OriginalText[i] != '\0') {
        if (OriginalText[i] == ' ') {
            encrypt = ' ';
            printf("%c", encrypt);
            i = i + 1;
        }

        cipher = ((int)OriginalText[i] + (offset % 26) % -26);
        encrypt = (char)(cipher);
        printf("%c", encrypt);

        i = i + 1;
    }
    printf("\n");
}

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вы должны сначала преобразовать вашего персонажа в индекс от нуля до размера алфавита (исключая), то есть от 0 до 25 для AB C. Только тогда делайте модульное сложение / вычитание. Наконец, вернемся обратно. Лучший способ сделать это - просто выполнить character - 'a' (в случае строчных букв, конечно). Не выполняйте модульные операции над значениями ASCII.

0 голосов
/ 18 апреля 2020

Оператор «%» имеет более высокий приоритет, чем «+». Следовательно, он применяется сначала к результату выражения offset % 26, а затем добавляется к OriginalText[i].

. Чтобы исправить это, необходимо добавить еще пару скобок в присваивании шифру:

cipher = (((int)OriginalText[i] + (offset % 26)) % -26);

Более того, когда вы имеете дело с символами ASCII, просто для того, чтобы обойти безопасность и предотвратить надоедливые и нежелательные ошибки, вы должны рассматривать ваш ввод / вывод как неподписанный символ, следовательно:

unsigned char cipher;
unsigned char encrypt;
...
cipher = ((OriginalText[i] + (offset % 26)) % 26);
encrypt = cipher;
...