// обратный ход (3.8)-1
prev = 0;
для i от k до 1
{
next = сигнатура(prev, ai);
ai = f
-1(prev, ai);
prev = next;
}
// прямой ход (3.7)-1
prev = 0;
для i от 1 до k
{
next = сигнатура(prev, ai);
ai = f
-1(prev, ai);
prev = next;
}
// обратный ход (3.6)-1
prev = 0;
для i от k до 1
{
ai = f
-1(prev, ai);
prev = сигнатура(prev, ai);
}
// прямой ход (3.5)-1
prev = 0;
для i от 1 до k
{
ai = f
-1(prev, ai);
prev = сигнатура(prev, ai);
}
Одной из ранних идей преобразований подобного рода была такая: текст разбивается на две половинки, вычисляется сигнатура первой половины и с помощью этой сигнатуры преобразуется вторая половина, затем наоборот. Каждая из этих половинок опять разбивается на две, и преобразование повторяется рекурсивно, пока длина половинки не станет меньше одного бита (или байта). Время такого преобразования – порядка двоичного логарифма от длины последовательности.
Следует отметить, что для каждого из четырёх базовых преобразований можно использовать различные функции преобразования и полиномы для расчёта сигнатур, что может повысить криптостойкость.
Как можно было заметить, преобразование осуществляется без какого-либо привлечения ключа, и имеет место однозначное соответствие исходной и преобразованной последовательности. Изменив вид функции на f(сигнатураi, gi, ai), где g – псевдослучайная последовательность, сгенерированная на основе ключа (или сам ключ, но это снизит криптостойкость), получим зависимость преобразованной последовательности от ключа. Для каждого из преобразований можно использовать различные участки гаммы. Причём из вышеописанного следует то, что малейшее изменение ключа приведёт к глобальному изменению всей преобразованной последовательности.