Числовая магия при шифровании

Валерий Болотов
 Начала: http://old.msun.ru/Vector/Klub-IGRA/Vigenere-Square.htm
     Любое деяние человека подчинено числам.
     Не случайно из древности до нас дошло выражение: «Миром правят числа и их соотношения»
     Загадка древнего счёта времени, оказывается, скрывается в строении божественного Пантеона.
     Древние утверждали, что Бог работает по математике.  Древние астрологи разделили звездное небо на 36 созвездий. Созвездия, в свою очередь, были представлены различными амулетами, называемыми Sigila Solis, или Печать Солнца. Такие амулеты носили Жрецы, и в каждом из амулетов содержался числовой ряд от 1 до 36. Они просто назвали каждого из 36 богов деканами, потому что каждый управлял 10 градусами зодиакального круга и не дольше 10 из 365 дней в году.
7 планет, или 7 верховных астрологических драконов управляли 36 деканами. Это было естественно и неизбежно, поскольку суммарное число чисел от 1 до 36     Это 666, и это число (названное Большим Числом Солнца), должно было  быть отнесено к богу Солнца, как к космическому В этом скрыто объяснение "Солнечных Печатей", использовавшихся до времени Христа в качестве амулетов, защищающих от любого зла, которое могло исходить от 36.
    Площадь Сатора - это четырехкратный палиндром, и некоторые люди приписывают ему магические свойства, считая его одной из самых широких магических формул на Западе. Палиндромы считались невосприимчивыми к подделке дьявола, которые смущались повторением букв и, следовательно, их популярностью в магическом использовании. Тот же принцип, наряду с вышеупомянутым «Paternoster cross», также присутствует в греческом волшебном палиндроме: что означает «Ты наш отец». Согласно сообщениям, площадь использовалась в народной магии для различных целей, в том числе для тушения пожаров (заклинание «ПОЛУЧИТЬ ОГНЕТУ БЕЗ ВОДЫ»), устраняя приступы и лихорадки, чтобы защитить крупный рогатый скот от колдовство, и от усталости во время путешествия. Иногда утверждается, что он должен быть написан на определенном материале или же с определенным типом чернил для достижения его магического эффекта.
      В нашей системе  Вектор любое побуквенное выражение и словесное можно зашифровать и дешифровать числами с подчислами. Однако раньше этим не пользовались. Множество магических приемов шифровки и дешифровки основаны на простых числах.
      Наиболее этому отвечает шифр графа Гронсфельда, который представляет собой модификацию шифра Цезаря числовым ключом. Для этого под буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. Шифротекст получают примерно, как в шифре Цезаря, но отсчитывают по алфавиту не третью букву, а выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.
      Эврика! Шифрование «Слова» -> Шифрование -> «Числа» -> расшифровка «Слова» через 999-арканный код. (27х27 - 3-значных чисел)  возможно в системе  Вектор

     Создали текстовый файл:
     1) <Криптос Вайно-999.txt>:
     Аналитика игры использует герменевтику Герменевтику высказываний фактов событий, сюжетов Геменевтика это дешифровка расшифровка Любая расшифровка восстанавливает события состоящие из буквальности и из ее смысла. Восстанавливать смысл по буквальности это в математике называется решением обратных задач
которое направлено на ответ на вопрос Что делать чтобы Обратные задачи характеризуется некорректностью они могут и не иметь решений или решений может быть много а незначительные изменения исходных
условий или поступление новой информации могут привести к существенному изменению результата решения Уже давным-давно  в эпоху эллинизма и в Средние века, чтение Библии или Гомера стало герменевтическим

    2) Выполнили Команду: Вектор -> Дайдж –>Сортировка
    3) Получили файл отсортированных слов по 99-арканной свертке.

    Полученные в арканной свертке (в нескольких случаях) два три слова, перенесли на не задействованные свободные свертки
 
    <Криптос Вайно-999.dict>
    DICT: аркан=999 код=0
    111
    а
    112
    эллинизма
    113
    в
    114
    Обратных
    …
    995
    Обратные
 
    Шифровка делаем например всего текста (помещаем в одну строку):
Дайдж –> Свертка 2 -> Задаем файл -> <Криптос Вайно-999.dict>
     Далее заходим в диалог и выполняем команду аркан (2-я строка 3 столбец - 999).
     Результат закодированные слова получаем в во 2-строке в нижней части диалогового окна.
      Полученный код числа с подчислами упростим вручную – убираем в числах с подчислами все одинаковые “.1”
      Получаем кодирование 3-значными числами:
189 562 122 141 136 142 742 887 882 134 437 129 135 638 135
183 911 117 246 146 121 246 232 184 653 255 146 437 113 123
118 987 114 593 881 119 237 628 237 755 396 741 652 995 714
185 197 374 631 121 242 637 868 366 868 618 529 619 111 171
115 596 366 131 615 126 631 991.1 124 163 116 125 413 148 113
667 112 121 113 854 463 748 711 366 722 625 198
 
       Декодирование:  Дайдж –>Слова -> Файл -> <Криптос Вайно-999.dict>
 диалоговое окно, вводим выше числовой код  и выполняем команду ОК!
       в нижней строке получаем расшифровку (текст в одну строку):
       Аналитика игры использует герменевтику Герменевтику
высказываний фактов событий сюжетов Геменевтика это
дешифровка расшифровка Любая расшифровка восстанавливает
события состоящие из буквальности и из ее Восстанавливать
смысл по буквальности это в математике называется решением обратных
задач которое направлено на ответ на вопрос Что делать чтобы
Обратные задачи характеризуется некорректностью они могут и не иметь решений
или решений может быть много а незначительные изменения или поступление
новой информации могут привести к существенному изменению результата
давным-давно в эпоху эллинизма и в Средние века чтение Библии
или Гомера стало герменевтическим.
 
      Резюме. Текст получили словами, который не сравним с трудностями побуквенной шифровки. Запас слов 999-арканной свертке предостаточный 27х27 слов.
      Далее  займемсясо студентами реализацией шифра Гронсфельда непосредственно в системе Вектора  на vbs и js/
       В интернете собрал алгоритмы - три варианта на трех разных языках языка.

Python

A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * 2  # алфавит
 2 def f(text, k, op):
 3     k *= len(text) // len(k) + 1
 4     text = text.upper()
 5     return ''.join([A[A.index(j) + int(k[i]) * op] for i, j in enumerate(text)])
 6 def encrypt(message, key):
 7     return f(message, key, 1)
 8 def decrypt(ciphertext, key):
 9     return f(ciphertext, key, -1)
10 print(encrypt('GRONSFELD', '2015'))  # шифрование
11 print(decrypt('IRPSUFFQF', '2015'))  # расшифровывание

//Этот код работает в консоли браузера, если его скопировать и вставить туда.
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //Строка алфавита

//Одна функция из двух отсюда: https://codepen.io/the405/pen/ZOxwrr
function Gronsfeld(m, key, mode, a) {
//Шифр Гронсфельда - шифрование/дешифрование
// m - сообщение или шифртекст;
// key - ключ,
// a - строка с алфавитом
// mode - режим. "encrypt" (по умолчанию), "decrypt" - для дешифрования.
var result = ""; //пустая строка результата, для заполнения.
for (var i = 0; i < m.length; ++i) {//для каждой буквы сообщения/шифротекста
if(typeof a !== 'undefined'){ //если указан алфавит - шифруем/дешифруем этим коротким кодом
var ki = parseInt(key[( (i>=key.length) ? i % key.length : i)]); //подгоняем ключ
ki = (mode === 'decrypt') ? -ki : ki; //-k[i] при дешифровании
//шифрование: ( m[i] + k[i] ), дешифрование: ( m[i] - k[i] ) = ( m[i] + (-k[i]) )
result += a[ ( ( a.indexOf( m[i] ) + ki ) ) ];
}else{ //если алфавит не указан, попробуем шифрование/дешифрование - по коду символов
var c = m[i].charCodeAt(0); //код i-того символа текста/шифртекста
var counter = ( (i>=key.length) ? i% key.length : i );
if((typeof mode === 'undefined') || mode==='encrypt'){
if (c >= 97 && (parseInt(c) + parseInt(key[counter])) > 122) { // строчные
result += String.fromCharCode(
parseInt(96) + parseInt((parseInt(c) + parseInt(key[counter]) - parseInt(122)))
);
} else if (c <= 90 && (parseInt(c) + parseInt(key[counter])) > 90) { // прописные
result += String.fromCharCode(
parseInt(64) + parseInt((parseInt(c) + parseInt(key[counter]) - parseInt(90)))
);
} else { //иначе - сдвиг символа
result += String.fromCharCode(parseInt(c) + parseInt(key[counter]));
}
}else if( mode === 'decrypt' ){
if (c >= 65 && c <= 90) { // прописные
if ((parseInt(c) - parseInt(key[counter])) < 65) {
result += String.fromCharCode(
parseInt(91) - parseInt((parseInt(65) - (parseInt(c) - parseInt(key[counter]))))
);
}
else {
result += String.fromCharCode(parseInt(c) - parseInt(key[counter]));
}
} else if (c >= 97 && c <= 122) { // строчные
if ((parseInt(c) - parseInt(key[counter])) < 97) {
result += String.fromCharCode(
parseInt(123) - parseInt((parseInt(97) - (parseInt(c) - parseInt(key[counter]))))
);
}
else {
result += String.fromCharCode(parseInt(c) - parseInt(key[counter]));
}
}else { //иначе - просто символ
result += String.fromCharCode(c);
}
}
}
}
return result; //возврат строки шифротекста/текста.
}

  Пример  реализации:
Пусть дан исходный текст: M = «GRONSFELD»
и ключ: K = «2015»
Ключ
Длина клера — 9 символов, значит и длина ключа также должна равнятся 9 символам.
K = «201520152»
Шифрование
• M1 = «G».
• y = 6 (y — номер столбца)
• K1 = 2
• С1 = T2 6 = «I»
C += «I» (C = «I»)
• M2 = «R».
• y = 17
• K2 = 0
• С2 = T0 17 = «R»
C += «R» (C = «IR»)
. . . . . . . . .
• M9 = «D»
• y = 3
• K9 = 2
• С9 = T2 3 = «F»
C += «F» (C = «IRPSUFFQF»)
Шифротекст (C) — «IRPSUFFQF»
Дешифрование
• C1 = «I».
• x = K1 = 2
• y = 6 (y — индекс встречи Cn на x строке)
• M += «G» (M = «G»)
• C2 = «R»
• x = K2 = 0
• y = 17
• M += «R» (M = «GR»)
. . . . . . . . .
• C9 = «F»
• x = K9 = 2
• y = 3
• M += «D» (M = «GRONSFELD»)
Дешифрованный текст (M) — «GRONSFELD»