MS9. Шифрование символов

Задача
Зашифруйте текст из входного потока, заменяя каждый символ результатом сложения по модулю два его кода и кода предыдущего символа текста. Первый символ шифровать не нужно.

Входные данные
Последовательность символов.

Выходные данные
Зашифрованная последовательность символов, напечатанная через пробел.

Тесты

входные данные выходные данные
the five boxing wizards jump quickly.

t 292 306 165 236 312 341 320 165 228 320 351 330 325 316 167 270 329 349 316 325 314 330 179 244 340 335 333 176 258 347 327 303 313 323 350 213
pack my box with five dozen liquor jugs

p 274 295 313 171 250 351 185 228 320 351 184 270 329 337 324 168 236 312 341 320 165 232 322 355 324 321 174 248 318 331 347 339 339 178 244 340 323 333
.!+= ;::—_//»‘ @#%

. 112 119 165 125 150 175 174 148 135 235 189 141 115 112 103 96 160 134 109

Код программы

Решение задачи
Объявляем 2 символьные переменные. Считываем первый символ и выводим его. Остальные символы будут считываться в цикле, пока не произойдет переход на следующую строку.По мере ввода запоминаем старый символ во 2 переменной и выводим посредством простого уравнения [latex] \left |2\cdot a + b\right | [/latex].

Ссылки

MS10. Зашифровка текста

Задача

Зашифруйте текст из входного потока, заменяя каждый символ результатом сложения по модулю два его кода и кода предыдущего зашифрованного символа. Первый символ шифруется инверсией бит.

Входные данные

Символьная последовательность.

Выходные данные

Зашифрованная символьная последовательность.

Тесты

Входные данные Выходные данные
Where is the table? a8 c0 a5 d7 b2 92 fb 88 a8 dc b4 d1 f1 85 e4 86 ea 8f b0
What a nice day! a8 c0 a1 d5 f5 94 b4 da b3 d0 b5 95 f1 90 e9 c8

Код программы

Решение

Выделяем участки памяти для символьных переменных, считываем первый символ и его инвертируем, затем выводим в шестнадцатеричной системе счисления с пробелом.
Используем цикл «while»: пока считываются данные в переменную x2, XORим предыдущий и новый символы, выводим новый символ и запоминаем новый зашифрованный символ, который становится предыдущим.

Ссылки

Условие задачи
Решение задачи на сайте Ideone.com

MS15. Зашифровка и расшифровка текста

Для решения задания MS15 необходимо, чтобы предыдущее уже было сделанным, однако на момент публикации оно таковым не является, потому данная запись содержит и его решение тоже.

Условие задачи MS14.
Зашифруйте текст из входного потока заменяя каждый символ по формуле [latex]c=at+b \mod 256[/latex], где [latex]t[/latex] — символ открытого текста, [latex]c[/latex] — символ зашифрованного текста, [latex]a[/latex], [latex]b[/latex] — произвольные ключи (параметры) шифрования.

Входные данные:
Два ключа через пробел и, через ещё один пробел, текст.

Выходные данные:
Зашифрованный текст.

Тесты.

Входные данные Выходные данные
[latex]a[/latex] [latex]b[/latex] Исходный текст Зашифрованный текст
1 f n Kittens P▲D*ж.ж.м(B,@.
2 4 j Hello, world! ◙☼ю¶z▬z▬ў▬z○ъ♠ц↑ў▬т↨z▬║¶▲•
3 ? . 0123456789 ■♂=♀|♀╗♀·♀9♪x♪╖♪ў♪5♫

Код программы.

Условие задачи MS15.
Найдите способ и напишите программу расшифровки текста зашифрованного в предыдущем задании по известным [latex]a[/latex] и [latex]b[/latex].

Входные данные:
Два ключа через пробел и, через ещё один пробел, зашифрованный текст.

Выходные данные:
Расшифрованный текст.

Тесты.

Входные данные Выходные данные
[latex]a[/latex] [latex]b[/latex] Зашифрованный текст Расшифрованный текст
1 f n P▲D*ж.ж.м(B,@. Kittens
2 4 j ◙☼ю¶z▬z▬ў▬z○ъ♠ц↑ў▬т↨z▬║¶▲• Hello, world!
3 ? . ■♂=♀|♀╗♀·♀9♪x♪╖♪ў♪5♫ 0123456789

Код программы.

Решение.
Основной трудностью при решении задачи является тот момент, что при шифровке символов строго по формуле, указанной в условии MS14, а именно [latex]c=at+b \mod 256[/latex], символы зашифрованного текста могут расшифровываться неоднозначно. К примеру, при [latex]a=8[/latex] и [latex]b=1[/latex] после зашифровки символов [latex]@[/latex] и [latex]`[/latex] в обоих случаях получим символ с кодом [latex]1[/latex]. Это часто лишает расшифрованный текст какого-либо смысла. Так происходит, поскольку в переменных типа [latex]unsigned[/latex] [latex]char[/latex] могут храниться элементы с кодом от [latex]0[/latex] до [latex]255[/latex], и при попытке присвоить переменной большее значение совершается своеобразный «круг». Так, если ей присвоить значение [latex]257[/latex], при выводе получим символ с кодом [latex]1[/latex]. Сначала в ходе работы обеих программ вводятся два ключа, а лишние пробелы читаются в одну из переменных для хранения символов. Программа для зашифровки принимает символ, зашифровывает его по указанной формуле, и выводит, а сразу за ним — элемент с кодом, который высчитывается по другой формуле: [latex]c=(at+b) / 256[/latex]. Этот код совпадает с числом совершённых «кругов». Программа для расшифровки же на каждом цикле принимает эти два символа, и выводит символ исходного текста, код которого вычисляется округлением до целых значения выражения [latex]\frac { c1-b+256\cdot c2 }{ a } [/latex], где [latex]c1[/latex] — первый символ, а [latex]c2[/latex] — второй.

Условия задач.
Код MS14 на ideone.com
Код MS15 на ideone.com

MS17. Самосинхронизирующийся скремблер

Задача

Рассматривая входной поток как последовательность бит, зашифруйте его при помощи восьмибитового самосинхронизирующегося скремблера. Начальное значение и обратные связи скремблера должны быть заданы в программе значениями двух переменных типа unsigned char. Как расшифровать полученный код.

Примечание: разобьём данную нам задачу на две подзадачи. В первой будет рассмотрено скремблирование входных данных, а во второй будет проведено дескремблирование исходных данных первой подзадачи.

Подзадача 1

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

Входные данные

Некая символьная последовательность.

Выходные данные

Зашифрованная символьная последовательность.

Тесты

Входные данные Выходные данные
Dogs eat meat. ea 27 33 77 25 11 66 75 5 3b e0 89 6b fa
Scramble it! fc 5a 80 ef 75 43 1e 92 9b 46 57 6
Base, base, it’s cheeseburger 1. Can you hear me? ec 49 a0 c9 72 75 43 13 55 66 28 80 e7 ed 1b d5 af 3f ad 19 e2 ba 78 93 db 18 f0 9c 2c c0 fe 33 21 75 40 2c c0 b2 f2 ad 58 bb 68 81 ed 1c ba 78 cb

Код программы

Решение задачи

Для зашифровки будем использовать стандартный алгоритм скремблирования. Скремблером будет переменная key, которая изначально равна [latex]5[/latex]. Выбирать из скремблера будем нулевой и четвёртый биты. Входные данные будут поступать в переменную input, после чего на них и на скремблере будет применяться функция scram.
Так как входные данные имеют формат unsigned char, считывание не прекратится никогда вплоть до принудительной остановки программы, ведь любые входные данные могут быть восприняты как символы. Для предотвращения этого, необходим символ, который будет служить «сигналом» для остановки программы. В нашем случае, это будет символ перехода на следующую строку.
Основная проблема задачи заключается в выводе зашифрованных данных, так как в результате скремблирования некоторые символы могут оказаться не отображаемыми. Дабы избежать подобной ситуации, зашифрованные данные будем выводить в шестнадцатеричном числовом формате.

Подзадача 2

Расшифровать входные данные из предыдущей подзадачи.

Входные данные

Некие зашифрованные данные, записанные в виде последовательности чисел шестнадцатеричного формата.

Выходные данные

Расшифрованные данные.

Тесты

Входные данные Выходные данные
ea 27 33 77 25 11 66 75 5 3b e0 89 6b fa Dogs eat meat.
fc 5a 80 ef 75 43 1e 92 9b 46 57 6 Scramble it!
ec 49 a0 c9 72 75 43 13 55 66 28 80 e7 ed 1b d5 af 3f ad 19 e2 ba 78 93 db 18 f0 9c 2c c0 fe 33 21 75 40 2c c0 b2 f2 ad 58 bb 68 81 ed 1c ba 78 cb Base, base, it’s cheeseburger 1. Can you hear me?

Код программы

Решение задачи

Для расшифровки будем применять обратный алгоритм к использованному в предыдущей задаче. Значение необходимого для расшифровки дескремблера нам известно из предыдущей задачи (а именно — [latex]5[/latex]), поэтому его мы и используем.
Входные данные будут считываться методом cin, где параметр hex будет указывать на то, что данные поданы в шестнадцатеричном формате. После считывания на входных данных будет применяться алгоритм дескремблирования, и итоговые данные будут выведены на экран.

Ссылки