/* FFFTPのパスワード保存・読み出し処理 ver.1.96dより */
/*----- パスワードを暗号化する ------------------------------------------------
*
* Parameter
* char *Str : パスワード
* kchar *Buf : 暗号化したパスワードを格納するバッファ
*
* Return Value
* なし
*----------------------------------------------------------------------------*/
static void EncodePassword(char *Str, char *Buf)
{
unsigned char *Get;
unsigned char *Put;
int Rnd;
int Ch;
srand((unsigned)time(NULL));
Get = (unsigned char *)Str;
Put = (unsigned char *)Buf;
while(*Get != NUL)
{
Rnd = rand() % 3;
Ch = ((int)*Get++) << Rnd;
Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8);
*Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF);
*Put++ = 0x40 | ((Ch >> 4) & 0xF);
if((*(Put-2) & 0x1) != 0)
*Put++ = (rand() % 62) + 0x40;
}
*Put = NUL;
return;
}
/*----- パスワードの暗号化を解く ----------------------------------------------
*
* Parameter
* char *Str : 暗号化したパスワード
* kchar *Buf : パスワードを格納するバッファ
*
* Return Value
* なし
*----------------------------------------------------------------------------*/
static void DecodePassword(char *Str, char *Buf)
{
unsigned char *Get;
unsigned char *Put;
int Rnd;
int Ch;
Get = (unsigned char *)Str;
Put = (unsigned char *)Buf;
while(*Get != NUL)
{
Rnd = ((unsigned int)*Get >> 4) & 0x3;
Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4);
Ch <<= 8;
if((*Get & 0x1) != 0)
Get++;
Get += 2;
Ch >>= Rnd;
Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF);
*Put++ = Ch;
}
*Put = NUL;
return;
}