12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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++;
- }
- }
|