mirror of
https://github.com/crskycode/GARbro.git
synced 2024-12-24 03:44:13 +08:00
(WARC): another decryptor.
This commit is contained in:
parent
4bfad9536c
commit
c38c84a422
@ -797,16 +797,7 @@ namespace GameRes.Formats.ShiinaRio
|
|||||||
return;
|
return;
|
||||||
if ((flags & 0x202) == 0x202)
|
if ((flags & 0x202) == 0x202)
|
||||||
{
|
{
|
||||||
int sum = 0;
|
int sum = RotateBytesRight (data, index, 0x100);
|
||||||
int bit = 0;
|
|
||||||
for (int i = 0; i < 0x100; ++i)
|
|
||||||
{
|
|
||||||
byte v = data[index+i];
|
|
||||||
sum += v >> 1;
|
|
||||||
data[index+i] = (byte)(v >> 1 | bit);
|
|
||||||
bit = v << 7;
|
|
||||||
}
|
|
||||||
data[index] |= (byte)bit;
|
|
||||||
data[index + 0x104] ^= (byte)sum;
|
data[index + 0x104] ^= (byte)sum;
|
||||||
data[index + 0x105] ^= (byte)(sum >> 8);
|
data[index + 0x105] ^= (byte)(sum >> 8);
|
||||||
}
|
}
|
||||||
@ -818,20 +809,69 @@ namespace GameRes.Formats.ShiinaRio
|
|||||||
return;
|
return;
|
||||||
if ((flags & 0x102) == 0x102)
|
if ((flags & 0x102) == 0x102)
|
||||||
{
|
{
|
||||||
int sum = 0;
|
int sum = RotateBytesLeft (data, index, 0x100);
|
||||||
int bit = 0;
|
|
||||||
for (int i = 0xFF; i >= 0; --i)
|
|
||||||
{
|
|
||||||
byte v = data[index+i];
|
|
||||||
sum += v & 0x7F;
|
|
||||||
data[index+i] = (byte)(v << 1 | bit);
|
|
||||||
bit = v >> 7;
|
|
||||||
}
|
|
||||||
data[index + 0xFF] |= (byte)bit;
|
|
||||||
data[index + 0x104] ^= (byte)sum;
|
data[index + 0x104] ^= (byte)sum;
|
||||||
data[index + 0x105] ^= (byte)(sum >> 8);
|
data[index + 0x105] ^= (byte)(sum >> 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal int RotateBytesRight (byte[] data, int index, int length)
|
||||||
|
{
|
||||||
|
int sum = 0;
|
||||||
|
int bit = 0;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
byte v = data[index+i];
|
||||||
|
sum += v >> 1;
|
||||||
|
data[index+i] = (byte)(v >> 1 | bit);
|
||||||
|
bit = v << 7;
|
||||||
|
}
|
||||||
|
data[index] |= (byte)bit;
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal int RotateBytesLeft (byte[] data, int index, int length)
|
||||||
|
{
|
||||||
|
int sum = 0;
|
||||||
|
int bit = 0;
|
||||||
|
for (int i = length-1; i >= 0; --i)
|
||||||
|
{
|
||||||
|
byte v = data[index+i];
|
||||||
|
sum += v & 0x7F;
|
||||||
|
data[index+i] = (byte)(v << 1 | bit);
|
||||||
|
bit = v >> 7;
|
||||||
|
}
|
||||||
|
data[index + length-1] |= (byte)bit;
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class NyaruCrypt : MajimeCrypt, IDecryptExtra
|
||||||
|
{
|
||||||
|
new public void Decrypt (byte[] data, int index, uint length, uint flags)
|
||||||
|
{
|
||||||
|
if (length < 0x200)
|
||||||
|
return;
|
||||||
|
if ((flags & 0x204) == 0x204)
|
||||||
|
{
|
||||||
|
int sum = RotateBytesRight (data, index, 0x100);
|
||||||
|
data[index + 0x100] ^= (byte)sum;
|
||||||
|
data[index + 0x101] ^= (byte)(sum >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new public void Encrypt (byte[] data, int index, uint length, uint flags)
|
||||||
|
{
|
||||||
|
if (length < 0x200)
|
||||||
|
return;
|
||||||
|
if ((flags & 0x104) == 0x104)
|
||||||
|
{
|
||||||
|
int sum = RotateBytesLeft (data, index, 0x100);
|
||||||
|
data[index + 0x100] ^= (byte)sum;
|
||||||
|
data[index + 0x101] ^= (byte)(sum >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user