Поясню: в устройство нужен по возможности криптостойкий RND-генератор (не генератор гаммы). В качестве случайных salt-значений доступны временные отсчеты различных системных событий (прерываний и т.д.).
Использовать hash-функцию очень не хочется, слишком много вычислений.
RC4 в принципе подходит, но для модификации его таблиц желательны "отбеленные" данные, а голые timestamps не подходят. Поэтому я решил сделать быстрое и "правильное" отбеливание. После проверки выхода алгоритма отбеливания встал вопрос - а нужен ли RC4 ?
Вот этот отбеливатель/генератор и нужно заценить:
Идея:
M - разрядность машинного слова, N - небольшое натуральное число (8 <= N <= 256);
Организуем M «параллельных» регистров сдвига, длинной N, с обратной связью, так чтобы биты в одной позиции регистров образовывали машинное слово.
В качестве нелинейной функции обратной связи используем сложение по модулю M циклически сдвинутого на 3 слова, образованного одним из отводов генераторов, и обычной комбинацией (сложение по модулю 2) слов остальных "обычной" обратной связи. Параллельные регистры сдвига реализуем на кольцевом буфере размера N.
Добавление исходных salt-значений происходит независимо от выборки отбеленных. Добавление - по событию, выборка - при необходимости, одновременно со сдвигом регистров. Добавление salt-значение реализуется
"кольцевым" сложением (сложением с последующим добавлением собственного переноса) к элементам кольцевого буфера, перебираемых по кругу.
// псевдо код с++
unsinged poo[lN]; // кольцевой буфер
usigned head, tail; // при старте == 0
void push_salt(unsigned salt)
{
unsigned value = pool[head] + salt;
pool[head] = value + (value < salt); // кольцевое сложение с переносом
head = (head + 1) % N;
}
unsigned pop_salt()
{
// y ~~ F(X**N, X**23 + X**17);
unsigned result = rotate(pool[tail], 3);
result += pool[tail + 17] ^ pool[tail + 23];
pool[tail] = result + 1;
tail = (tail + 1) % N;
return result;
}
---
Сейчас за основу взят полином (N, 23, 17, 0), можно взять хороший/неприводимый например (63, 1, 0), но я думаю что для такой обратной связи все равно. Точнее говоря, я не могу вывести критерии выбора "лучшего" полинома. Может кто-нибудь плавает в GF лучше рыбы, или есть знакомые ?
|