Сейчас я спешу, но хочу поделиться с вами некоторыми идеями (которые, если нужно, я подробно изложу в ближайшие дни):
- конкатенацию можно рассматривать как $х||у = хк+у$ куда $к=2^{|у|}$
- так $f(x||y) = f(xk+y)$
- если мы предположим $f$ умножение для генератора EC $G$ (общая настройка privkey/pubkey EC) мы получаем:
$f(x) = Gx$
$f(y) = Gy$
$f(x||y) = G(xk+y) = G(xk) + Gy = G(x+x+...+x) + Gy = (Gx + Gx + ... + Gx) + Gy = кГх + Гр$
- последний отрывок дает вам $г$ (отношение, символически равное конкатенации, но теперь действующее на точки EC)
$f(x) = Gx$ конечно, это не хэш, но он необратим (это проблема с общим дискретным логарифмом), и с приведенными выше определениями кажется (если я не ошибаюсь) аддитивным, как вы просили
РЕДАКТИРОВАТЬ: ОБОБЩЕНИЕ
Как осторожно заметил @poncho, предыдущие идеи работают только тогда, когда все $у$ имеют фиксированный заранее известный размер, потому что это гарантирует, что $к$ постоянна и может использоваться в $г$ (который не имеет "прямой видимости" $у$ рассчитать его размер). Умный обходной путь, предложенный @poncho, состоит в том, чтобы позволить $f$ передать его входной размер на «следующий этап». Таким образом, предыдущие определения обобщаются следующим образом:
- $х||у = хк+у$ куда $к=2^{|у|}$ в зависимости от размера $у$ является
- $f(x) = (Gx, |x|) = (X, |x|)$
- $f(x||y) = f(xk+y) = (kX+Y,|x|+|y|) = (2^{|y|}X+Y,|x|+|y|) $
- $g((X,s_x),(Y,s_y)) = (2^{s_y}X+Y, s_x+s_y)$
Еще $ф$ это не гашиш, но, как было сказано ранее, он добавляется к вашему вкусу и необратим (первый устойчивый к прообразу в терминологии хэшей).