Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
void MakeCryptPassword(LPCSTR Src,BYTE Dest[FTP_PWD_LEN])
{
BYTE *CurDest;
clock_t Random = clock();
BYTE XorMask;
int Done;
//Log(( "MakeCryptPassword: [%s]",Src ));
memset(Dest,0,sizeof(Dest));
if(!Src || !Src[0])
return;
for(int I=0; I < (int)sizeof(Dest); I++)
{
CurDest = Dest;
CurDest[0] = (BYTE)((Random+I)|0x80);
CurDest[1] = (BYTE)((Random>>8)|0x80);
strcpy(((char*)CurDest)+2,Src);
XorMask = (CurDest[0]^CurDest[1])|80;
CurDest += 2;
Done = TRUE;
while(*CurDest)
{
*CurDest^=XorMask;
if(*CurDest == 0)
{
Done=FALSE;
break;
}
CurDest++;
}
if(Done) break;
}
//Log(( "MakeCryptPassword: %02X %02X %02X %02X %02X %02X",Dest[0],Dest[1],Dest[2],Dest[3],Dest[4],Dest[5] ));
}
void DecryptPassword(BYTE Src[FTP_PWD_LEN],char *_Dest)
{
BYTE XorMask = (Src[0]^Src[1]) | 80;
int n;
char *Dest = _Dest;
//Log(( "DecryptPassword: %02X %02X %02X %02X %02X %02X",Src[0],Src[1],Src[2],Src[3],Src[4],Src[5] ));
if(Src[0] && Src[1] && Src[2])
for(n = 2; n < FTP_PWD_LEN; n++,Dest++)
{
*Dest = Src[n] ^ XorMask;
if(*Dest == 0 ||
*Dest == XorMask)
break;
}
*Dest = 0;
//Log(( "DecryptPassword: [%s]",_Dest ));
}
Подниму тему. Понадобилось вспомнить пароль, который я ввёл год назад в Far NetBox. Как оказалось, шифрование там ещё хуже - тупо побайтовый ксор с фиксированной константой. Ну, и ещё чуток мусора добавляется вокруг, но его отлично визуально видно.
Вот тут всё понятно: https://github.com/FarGroup/Far-NetBox/blob/d64ef80a04a239d8d0b9c0277620c13533991c95/src/core/WinSCPSecurity.cpp#L62-L88 (внимание! индексация массовов - в паскаль-стиле, начиная с единички).
std::string FarNetBoxDecrypt(std::string pass)
{
auto decryptChar = [](std::string& pass)
{
static const std::string hex = "0123456789ABCDEF";
if (pass.length() < 2) return '\0';
char res = (hex.find(pass[0]) << 4) + (hex.find(pass[1]) << 0);
res ^= 0x5C;
pass = pass.substr(2);
return res;
};
std::string res;
while (pass.length() >= 2)
res += decryptChar(pass);
return res;
}
Как я перестал хранить FTP-пароли в FAR'e