| namespace third_party_unrar { |
| |
| 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++; |
| } |
| } |
| |
| } // namespace third_party_unrar |