BLOWFISH的算法看不懂呀
static void Blowfish_Init(_BLOWFISH_CTX *ctx, const unsigned char *key, unsigned int keyLen)
{
static const unsigned long dummy=0;
unsigned int i;
unsigned long *p,*s;
ASSERT(keyLen>=4);
ASSERT(keyLen<=56);//448 bit max!
if (keyLen<4) { //SOS!
key=(const unsigned char*)&dummy;//Change the address of dummy to char
keyLen=4;
};
if (keyLen>56) { //SOS!
keyLen=56;
};
{
p=ctx->P;
const unsigned long *p0=ORIG_P;
unsigned int j=0;
if (ISLONGALIGN(key)&&ISLONGALIGN(keyLen)) {
unsigned long *pulkey=(unsigned long*)key;
unsigned long *pulmaxkey=(unsigned long*)(key+keyLen);
for (i=0;i<(16+2);i++) {
*p++ = *p0++ ^ SWAP(*pulkey++);
if (pulkey>=pulmaxkey) pulkey=(unsigned long*)key;
};
}
else {
unsigned long data=0;
for (i=0;i<(16+2);i++) {
unsigned int k;
for (k=0;k<4;k++) {
SETBYTE(data,3-k,key[j]);if (++j >= keyLen) j = 0;
};
*p++ = *p0++ ^ data;
};
};
};
memcpy(ctx->S,ORIG_S,sizeof(ORIG_S));
{
这里我就不懂了,对datal,datar加密的话,不就是从0开始加密吗?难道前面的白算了吗?
unsigned long datal, datar;
datal=0;datar=0;
p=ctx->P;
for (i=0;i<((16+2)/2);i++) {
Blowfish_Encrypt(ctx, &datal, &datar);
*p++ = datal;
*p++ = datar;
};
s=ctx->S;
for (i=0;i<((4*256)/2);i++) {
Blowfish_Encrypt(ctx, &datal, &datar);
*s++ = datal;
*s++ = datar;
};
};
}