|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel.Services.Encryption
|
|
|
|
|
{
|
|
|
|
|
public class FastObfuscator
|
|
|
|
|
{
|
|
|
|
|
private readonly byte[] _salt;
|
|
|
|
|
private int _index = -1;
|
|
|
|
|
|
|
|
|
|
private byte GetInitial() => (_salt == null || _salt.Length == 0) ? (byte)177 : _salt[Interlocked.Increment(ref _index) % _salt.Length];
|
|
|
|
|
|
|
|
|
|
public FastObfuscator(string key)
|
|
|
|
|
{
|
|
|
|
|
_salt = Encoding.UTF8.GetBytes(key).Where(b => b > 0).ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void HashData(byte[] data)
|
|
|
|
|
{
|
|
|
|
|
if (data.Length == 0) return;
|
|
|
|
|
int i = 1;
|
|
|
|
|
data[0] ^= GetInitial();
|
|
|
|
|
for (; i < (data.Length - 8); i += 8)
|
|
|
|
|
{
|
|
|
|
|
data[i + 0] ^= data[i - 1];
|
|
|
|
|
data[i + 1] ^= data[i + 0];
|
|
|
|
|
data[i + 2] ^= data[i + 1];
|
|
|
|
|
data[i + 3] ^= data[i + 2];
|
|
|
|
|
data[i + 4] ^= data[i + 3];
|
|
|
|
|
data[i + 5] ^= data[i + 4];
|
|
|
|
|
data[i + 6] ^= data[i + 5];
|
|
|
|
|
data[i + 7] ^= data[i + 6];
|
|
|
|
|
}
|
|
|
|
|
for (; i < data.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
data[i] ^= data[i - 1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void DeHashData(byte[] data)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = data.Length - 1; i > 9; i -= 8)
|
|
|
|
|
{
|
|
|
|
|
data[i - 0] ^= data[i - 1];
|
|
|
|
|
data[i - 1] ^= data[i - 2];
|
|
|
|
|
data[i - 2] ^= data[i - 3];
|
|
|
|
|
data[i - 3] ^= data[i - 4];
|
|
|
|
|
data[i - 4] ^= data[i - 5];
|
|
|
|
|
data[i - 5] ^= data[i - 6];
|
|
|
|
|
data[i - 6] ^= data[i - 7];
|
|
|
|
|
data[i - 7] ^= data[i - 8];
|
|
|
|
|
}
|
|
|
|
|
for (; i >= 1; i--)
|
|
|
|
|
{
|
|
|
|
|
data[i] ^= data[i - 1];
|
|
|
|
|
}
|
|
|
|
|
data[0] ^= GetInitial();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|