Шифр с круговым сдвигом - PullRequest
0 голосов
/ 24 февраля 2019

Я написал шифр с циклическим сдвигом для ключа от -1 миллиарда до +1 миллиарда для шифрования сообщений максимум из 200 символов, включая от 0 до 9, от a до z и от A до Z.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char input[215], key[11], msg[201], output[201], ch;
    int i, j, k, shiftkeychar, shiftkeynum;

    printf("Input: ");
    gets(input);

    for (i = 0; input[i] != ':'; i++)
        key[i] = input[i];
    key[i] = '\0';

    i++;

    k = 0;
    for (j = i; input[j] != '\0'; j++) {
        msg[k] = input[j];
        k++;
    }
    msg[k] = '\0';

    printf("\nmessage: %s\n", msg);
    printf("key: %s\n", key);

    shiftkeychar = atoi(key) % 26;
    shiftkeynum = atoi(key) % 10;

    printf("shiftkey for characters: %d\n", shiftkeychar);
    printf("shiftkey for numbers: %d\n", shiftkeynum);

    strcpy(output, msg);

    for (i = 0; output[i] != '\0'; i++) {
        ch = output[i];

        if (ch >= 'A' && ch <= 'Z') {
            ch = ch + shiftkeychar;

            if (ch > 'Z') {
                ch = ch - 'Z' + 'A' - 1;
            }
            else if (ch < 'A') {
                ch = ch + 'Z' - 'A' + 1;
            }
        }

        else if (ch >= 'a' && ch <= 'z') {
            ch = ch + shiftkeychar;

            if (ch > 'z') {
                ch = ch - 'z' + 'a' - 1;
            }
            else if (ch < 'a') {
                ch = ch + 'z' - 'a' + 1;
            }
        }

        else if (ch >= '0' && ch <= '9') {
            ch = ch + shiftkeynum;

            if (ch > '9') {
                ch = ch - '9' + '0' - 1;
            }
            else if (ch < '0') {
                ch = ch + '9' - '0' + 1;
            }
        }
        output[i] = ch;
        //printf("output[%d]: %c", i, ch);
    }

    printf("Output: %s", output);

    return 0;
}

Этот циркуляршифр сдвига хорошо работает для заглавных букв и цифр.Однако для строчных букв, например, если сообщение имеет значение «xyz», а ключ больше 5 (то есть 6,7, ... 25), генерируется произвольный вывод.Формат ввода: «ключ: сообщение».вывод: «зашифрованное сообщение».

1 Ответ

0 голосов
/ 24 февраля 2019

Ваш персонаж ch является символом, который в C может быть или не быть подписан.На вашем компьютере он, кажется, подписан, что означает, что вы можете хранить значения от -128 до 127. Буквы в нижнем регистре занимают коды ASCII от 97 до 122. Когда вы говорите:

ch = ch + shiftkeychar;

Вы можете переполнить char со знаком для букв в конце алфавита.Технически, это неопределенное поведение ;на практике вы, вероятно, получите отрицательные значения, которые позже приведут к появлению странных символов.

Чтобы решить вашу проблему, сделайте ch int.

...