Ох!.. Ну честное слово, на этот раз не было у меня намерения подзадоривать людей, втягивать их в дальнейшую дискуссию. Я собирался сделать именно то, что сделал -- самым искренним образом поблагодарить людей за участие, а самому покраснеть, удалиться и уже издали наблюдать, как тема стареет, уходит на вторую страницу, на третью, забывается понемножку... Но ведь и отмалчиваться неловко, если серьезные и занятые люди проявляют к тебе внимание, делают содержательные замечания.
VAL, может, я опять чего-то не понимаю, а уж в том, что не предъявил иллюстраций, виноват давно, вы меня не зря упрекали. Но у меня нет единственной транспозиции в качестве множителя. Такого не бывает. Условия более узкие: один множитель -- та самая подстановка, которую вы называете большим циклом (и меня научите правильной терминологии, теперь этого недолго ждать), а другой множитель -- подстановка, в точности похожая на ту, которая получается, если билетики с номерами от 0 до 255 тянуть из шапки. Она и получена похожим способом, и всегда другая -- она параметризуется таймером, такой строкой, где обозначено текущее время по полному формату -- год, месяц, число, час, минуты, секунды, сотые доли секунд. А поскольку таймер машины тикает только 18 раз в секунду, а программа за такое время успевает обработать десяток-другой файлов, в строку таймера вместо старшего байта года, который меняется редко, раз в 256 лет, подставляется счетчик файлов. Словом, это то, что по-английски называется NONCE -- однократно используемое число. Подстановка (перестановка) этим числом модицифируется или параметризуется -- а простыми словами говоря, она умножается на строку таймера. Но ведь надо еще подобрать способ умножения такой, чтобы произведение снова было подстановкой (перестановкой) всех 256 различных байтов, чтобы каждый байт произведения зависел от каждого байта множителя -- строки таймера. Это умножение длинной строки на короткую, а еще чаще бывает нужен какой-то способ умножать короткую строку на длинную -- что-то вроде свертки или хэш-функции. При этом какая-то хорошая алгебра, вроде группы, получиться не может, умножаются разнотипные объекты, строки различной длины. И на этом круг замыкается: какую-то алгебру с нужными свойствами построить можно, но в ней главным компонентом опять-таки оказывается умножение подстановок, причем не всяких, а специального вида -- как раз того, который мы рассматриваем: одна подстановка произвольная, вроде как случайная, которую из шапки вытянули, а другая -- какая-то степень того самого большого цикла. Других множителей в наличии нет, а эти используются многократно, хотя и в разном порядке. После настойчивых разъяснений ИСН, который заставил-таки меня убедиться, что образующих всего две, никак не больше, я крепко задумался и понял, что можно подобрать и кое-что еще. Эти самые степени большого цикла можно получить на машине просто сложением -- к каждому байту строки прибавляется какое-то число по модулю 256. Если вместо ADD использовать XOR -- поразрядное сложение по модулю 2, получаются подстановки, которые принадлежат к такой же коротенькой циклической подгруппе, но уже другой. И в пару к подстановке из этого набора опять какой-то случайный множитель -- выходит уже четыре образующих вместо двух, хоть какое-то разнообразие. Мне надо еще подумать об этом. Я же кустарь -- руками сделать еще туда-сюда, а вот понять, что вышло -- это сложнее, я математике никогда не учился (и уже не научусь, стар я для этого).
Еще раз моя искренняя признательность за помощь.
С уважением, Лев Магазаник
|