80 lines
1.4 KiB
C++
80 lines
1.4 KiB
C++
extern uint CRCTab[256];
|
|
|
|
void CryptData::SetKey13(const char *Password)
|
|
{
|
|
Key13[0]=Key13[1]=Key13[2]=0;
|
|
for (size_t I=0;Password[I]!=0;I++)
|
|
{
|
|
byte P=Password[I];
|
|
Key13[0]+=P;
|
|
Key13[1]^=P;
|
|
Key13[2]+=P;
|
|
Key13[2]=(byte)rotls(Key13[2],1,8);
|
|
}
|
|
}
|
|
|
|
|
|
void CryptData::SetKey15(const char *Password)
|
|
{
|
|
InitCRC32(CRCTab);
|
|
uint PswCRC=CRC32(0xffffffff,Password,strlen(Password));
|
|
Key15[0]=PswCRC&0xffff;
|
|
Key15[1]=(PswCRC>>16)&0xffff;
|
|
Key15[2]=Key15[3]=0;
|
|
for (size_t I=0;Password[I]!=0;I++)
|
|
{
|
|
byte P=Password[I];
|
|
Key15[2]^=P^CRCTab[P];
|
|
Key15[3]+=P+(CRCTab[P]>>16);
|
|
}
|
|
}
|
|
|
|
|
|
void CryptData::SetAV15Encryption()
|
|
{
|
|
InitCRC32(CRCTab);
|
|
Method=CRYPT_RAR15;
|
|
Key15[0]=0x4765;
|
|
Key15[1]=0x9021;
|
|
Key15[2]=0x7382;
|
|
Key15[3]=0x5215;
|
|
}
|
|
|
|
|
|
void CryptData::SetCmt13Encryption()
|
|
{
|
|
Method=CRYPT_RAR13;
|
|
Key13[0]=0;
|
|
Key13[1]=7;
|
|
Key13[2]=77;
|
|
}
|
|
|
|
|
|
void CryptData::Decrypt13(byte *Data,size_t Count)
|
|
{
|
|
while (Count--)
|
|
{
|
|
Key13[1]+=Key13[2];
|
|
Key13[0]+=Key13[1];
|
|
*Data-=Key13[0];
|
|
Data++;
|
|
}
|
|
}
|
|
|
|
|
|
void CryptData::Crypt15(byte *Data,size_t Count)
|
|
{
|
|
while (Count--)
|
|
{
|
|
Key15[0]+=0x1234;
|
|
Key15[1]^=CRCTab[(Key15[0] & 0x1fe)>>1];
|
|
Key15[2]-=CRCTab[(Key15[0] & 0x1fe)>>1]>>16;
|
|
Key15[0]^=Key15[2];
|
|
Key15[3]=rotrs(Key15[3]&0xffff,1,16)^Key15[1];
|
|
Key15[3]=rotrs(Key15[3]&0xffff,1,16);
|
|
Key15[0]^=Key15[3];
|
|
*Data^=(byte)(Key15[0]>>8);
|
|
Data++;
|
|
}
|
|
}
|