Сравни функцию F и макросы BF_ENC(LL,R,S,P)
Если быть более точным - обрати внимание на момент:
Эрик:
#define BF_M 0x3fc
#define BF_0 22L
#define BF_1 14L
#define BF_2 6L
#define BF_3 2L /* left shift */
...
LL^=P; \
LL^= (((*(BF_LONG *)((unsigned char *)&(S[ 0])+((R>>BF_0)&BF_M))+ \
*(BF_LONG *)((unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \
*(BF_LONG *)((unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \
*(BF_LONG *)((unsigned char *)&(S[768])+((R<<BF_3)&BF_M)));
---
Пауль:
static unsigned long F(BLOWFISH_CTX *ctx, unsigned long x) {
unsigned short a, b, c, d;
unsigned long y;
d = (unsigned short)(x & 0xFF);
x >>= 8;
c = (unsigned short)(x & 0xFF);
x >>= 8;
b = (unsigned short)(x & 0xFF);
x >>= 8;
a = (unsigned short)(x & 0xFF);
y = ctx->S[0][a] + ctx->S[1][b];
y = y ^ ctx->S[2][c];
y = y + ctx->S[3][d];
return y;
}
---
Особое внимание обрати на сдвиги. побайтно и... 22,14,6,-2 бита. Это похожие, но по сути разные алгоритмы.
Поэтому-то я и повторяю — уточни каким именно алгоритмом получено значение, которого ты пытаешься добиться.
Хотя может я и загнался.
Blowfish, версия Eric Young для FreeBsd
|