v0.80.30
This commit is contained in:
54
AssetStudio/Crypto/XORShift128.cs
Normal file
54
AssetStudio/Crypto/XORShift128.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Buffers.Binary;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
public static class XORShift128
|
||||
{
|
||||
public static bool Init = false;
|
||||
public static uint x = 0, y = 0, z = 0, w = 0, initseed = 0;
|
||||
|
||||
const long SEED = 0x61C8864E7A143579;
|
||||
const uint MT19937 = 0x6C078965;
|
||||
|
||||
public static void InitSeed(uint seed)
|
||||
{
|
||||
initseed = seed;
|
||||
x = seed;
|
||||
y = MT19937 * x + 1;
|
||||
z = MT19937 * y + 1;
|
||||
w = MT19937 * z + 1;
|
||||
Init = true;
|
||||
}
|
||||
|
||||
public static uint XORShift()
|
||||
{
|
||||
uint t = x ^ (x << 11);
|
||||
x = y; y = z; z = w;
|
||||
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
|
||||
}
|
||||
|
||||
public static uint NextUInt32()
|
||||
{
|
||||
return XORShift();
|
||||
}
|
||||
|
||||
public static int NextDecryptInt() => BinaryPrimitives.ReadInt32LittleEndian(NextDecrypt(4));
|
||||
public static uint NextDecryptUInt() => BinaryPrimitives.ReadUInt32LittleEndian(NextDecrypt(4));
|
||||
|
||||
public static long NextDecryptLong() => BinaryPrimitives.ReadInt64LittleEndian(NextDecrypt(8));
|
||||
|
||||
public static byte[] NextDecrypt(int size)
|
||||
{
|
||||
var valueBytes = new byte[size];
|
||||
var key = size * initseed - SEED;
|
||||
var keyBytes = BitConverter.GetBytes(key);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
var val = NextUInt32();
|
||||
valueBytes[i] = keyBytes[val % 8];
|
||||
}
|
||||
return valueBytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user