ASCII выходит за пределы алфавита после шифрования на языке С++

Для шифрования текста я использую таблицу ASCII, например мой текст для шифрования это "Hello world" в таблице ASCII это будет: 72 101 108 108 111 32 119 111 114 108 100

Все эти значения я шифрую алгоритмом шифрования (в моём случае это SAFER K-64) и на выходе после шифрования я получу значения 250 244 42 81 74 176 140 13 143 226 188 119 25 4 224 44, и вот в чём беда, я получаю значения за пределами нужных диапазонов значений ASCII, а мне бы очень хотелось чтобы шифротекст состоял только из английского алфавита (нижнего и верхнего регистра, а также желательно чтобы были, цифры и спецсимволы). То есть чтобы шифротекст был в диапазонах 32-57 (спецсимволы и цифры), 65-90 (верх.регистр), 97-122 (ниж. регистр)

Потому что если мы переведём все полученные после шифрования числа (250 244 42 81 74 176 140 13 143 226 188 119 25 4 224 44) в буквы то получим следующее úô*QJ° и т.д... Я же хочу получить после шифрования лишь символы которые находятся в вышеописанных диапазонах, подскажите пожалуйста, это возможно сделать, если да — то как, какой алгоритм вычислений нужно провести чтобы всё высчитывалось так как мне нужно? Или лучше сделать шифрование не через таблицу ASCII, а через массив нужных мне символов?


Ответы (1 шт):

Автор решения: Outtruder

Все стандартные симметричные шифры работают с восьмибитным алфавитом на входе и на выходе. Если вам необходимо остаться в рамках более узкого алфавита (например, для английских букв, цифр, пробела и точки хватает 6 бит), то вам необходимо на входе произвести сжатие, а на выходе - расширение. Для каждого разрешённого в вашем входном алфавите символа ставите в соответствие число от 0 до 63 (6 бит) и записываете эти биты последовательно (там, где на входе было четыре ваших 6-битных символа, на выходе будет 3 8-битных байта). Эти байты шифруете, а над результатом выполняете обратную операцию: берёте из потока по 6 бит и выдаёте соответствующий (по вашей таблице) символ.

→ Ссылка