code70.htm
Сверхсложный шифр
Шеф разведки, где работают 7 агентов, для шифрования сверхважного сообщения придумал несложный шифр:
Первые пять букв латинского алфавита a,b,c,d,e заменяются друг на друга по кругу, т.е. a заменяется на b, b заменяется на c, c заменяется на d, d заменяется на e, e заменяется на a.
Аналогичное проделывается со следующими семью буквами - f, g, h, i, j, k, l.
Аналогичное проделывается со следующими пятью буквами - m n, o, p, q.
Аналогичное проделывается со следующими семью буквами - r, s, t, u, v, w, x
Оставшиеся две буквы y и z заменяются друг на друга.
Чтобы этот простой шифр превратился в очень сложный, шеф приказал зашифровать сверхважное сообщение агенту 001 (пользуясь этим шифром). Затем то, что получилось, зашифровал агент 002 и так далее, до агента 007.
Затем опять агент 001 и дак далее, 10 раз.
В итоге исходное сообщение шифровалось 70 раз !
Помогите шпиону расшифровать исходное сообщение.
Будем решать задачу при помощи суперкомпилятора.
Опишем однократное шифрование и организуем 70-кратное шифрование, получаем программу
*$MST_FROM_ENTRY; *$EXECUTABLE Add; $EXTRN Add; $ENTRY A { e.string = <B (0) (70) (<Shifr >) (e.string)>; } Shifr { = 'abcdea' 'fghijklf' 'mnopqm' 'rstuvwxr' 'yzy'; } B { (e.n) (e.n) (e.c) (e.string) = e.string; (e.n) (e.m) (e.c) (e.string) = <B (<Add (e.n) 1>) (e.m) (e.c) (<Codir (e.c) (e.string)>)>; } Codir { (e.c) ( ) = ; (e.c) (s.a e.string) = <Search s.a (e.c)> <Codir (e.c) (e.string)>; } Search { s.a (s.a s.b e.1) = s.b; s.a (s.c s.b e.1) = <Search s.a (s.b e.1)>; s.a (s.x) = s.a; } |
Суперкомпилируем эту программу, в которой компизиция 70 шифрований. Суперкомпилятор работает 29 минут и строит остаточную программу -
* InputFormat: <A e.41 > $ENTRY A { e.41 = e.41 ; } |
Все правильно, указанная процедура приводит к тождественному шифрованию. Результат суперкомпиляции идеален с любой точки зрения.
В заключение отметим, что первый раз тождественный шифр получается только на 70 шифровании.