C: Как добавить символ к символам, и когда максимальный символ будет достигнут, он вернется к «а»? - PullRequest
0 голосов
/ 19 февраля 2019

Я создаю простую программу шифрования.Я добавляю символы к символам для создания нового символа.

На данный момент новый символ 'char' часто представляется как '?'.

Я предполагал, что переменная char имеетМаксимальная сумма и после ее передачи она возвращается к 0.

Предполагаемая логика:

если char a == 1 && char z == 255, то 256 должны == a.

Это не так.


Этот фрагмент добавляет символ к символу.Он часто выводит что-то вроде:

for (int i = 0; i < half; ++i) {
    halfM1[i] = halfM1[i] + halfP1[i];
    halfM2[i] = halfM2[i] + halfP2[(half + i)];
}

printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);

Возвращает:

a???

3d??

Этот фрагмент удаляет добавленный символ, и строки возвращаются в нормальное состояние.

for (int i = 0; i < half; ++i) {
    halfM1[i] = halfM1[i] - halfP1[i];
    halfM2[i] = halfM2[i] - halfP2[(half + i)];
}

printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);

возвращает:

messagepart1
messagepart2

Код технически работает, но я хотел бы, чтобы шифрование было в символах.

Если вопрос о том, почему «половина» везде.Сообщение и ключ разделены пополам, поэтому первая половина и вторая половина сообщения имеют отдельное шифрование.

1 Ответ

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

Прежде всего, для обычного char не существует такого понятия, как «обтекание».Обычный char является типом со знаком в x86, и целые числа со знаком не имеют переноса.Вместо этого переполнение приводит к неопределенному поведению .Кроме того, диапазон char s может составлять -128 ... 127 или даже что-то

. Для криптографических целей вы хотите использовать беззнаковые символы или, что еще лучше, rawоктеты с uint8_t (<stdint.h>).

Вторая проблема заключается в том, что вы печатаете с %s.Один из возможных 256 полученных символов - \0.Если это попадет в результирующую строку, это приведет к преждевременному завершению строки.Вместо использования %s вы должны вывести его с fwrite(halfM1, buffer_size, 1, stdout).Конечно, проблема в том, что на выходе все еще есть какой-то бинарный мусор.Для этого многие программы шифрования Unix записывают в файл или имеют возможность вывести ASCII-защищенный файл .Простое резервирование ASCII будет выводиться как hex вместо двоичного.

Третье - это операция, которая намного лучше, чем сложение / вычитание для криптографиицели: XOR , или halfM1[i] = halfM1[i] ^ halfP1[i]; - красота которого заключается в том, что он является его собственным обратным!

...