Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C# by goose ( 15 years ago )
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace Xhuffle
{
public static class DataCrypter
{
public static byte[] Encrypt(byte[] data, byte[] key, int rounds)
{
if (key.Length != 64)
throw new Exception("Key must be 512 bits.");
byte[,] box = GenerateBox(key);
byte[] final = new byte[data.Length];
Array.Copy(data, final, data.Length);
byte[] seed = { Derive(box, box[0,0], 0), Derive(box, box[0,7], 1),
Derive(box, box[7,0], 2), Derive(box, box[7,7], 3) };
XhuffleGenerator rand = new XhuffleGenerator(BitConverter.ToInt32(seed, 0));
int[] a = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
int[] b = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
int[] c = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
for(int i = 0; i < rounds; i++)
{
for(int j = 0; j < data.Length; j++)
{
final[j] = (byte)(final[j].RotR(j) ^ Derive(box, i, j));
}
BitArray bits = new BitArray(final);
for(int k = 0; k < bits.Length; k++)
{
if (a[i * bits.Length + k] != b[i * bits.Length + k] && c[i * bits.Length + k] != a[i * bits.Length + k])
{
bits[a[i * bits.Length + k]] ^= bits[b[i * bits.Length + k]];
bits[c[i * bits.Length + k]] ^= bits[a[i * bits.Length + k]];
}
}
bits.CopyTo(final, 0);
}
return final;
}
public static byte[] Decrypt(byte[] data, byte[] key, int rounds)
{
if (key.Length != 64)
throw new Exception("Key must be 512 bits.");
byte[,] box = GenerateBox(key);
byte[] final = new byte[data.Length];
Array.Copy(data, final, data.Length);
byte[] seed = { Derive(box, box[0,0], 0), Derive(box, box[0,7], 1),
Derive(box, box[7,0], 2), Derive(box, box[7,7], 3) };
XhuffleGenerator rand = new XhuffleGenerator(BitConverter.ToInt32(seed, 0));
int[] a = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
int[] b = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
int[] c = rand.NextSet(data.Length * rounds * 8, data.Length * 8);
Array.Reverse(a);
Array.Reverse(b);
Array.Reverse(c);
for(int i = 0; i < rounds; i++)
{
BitArray bits = new BitArray(final);
for(int k = 0; k < bits.Length; k++)
{
if (a[i * bits.Length + k] != b[i * bits.Length + k] && c[i * bits.Length + k] != a[i * bits.Length + k])
{
bits[c[i * bits.Length + k]] ^= bits[a[i * bits.Length + k]];
bits[a[i * bits.Length + k]] ^= bits[b[i * bits.Length + k]];
}
}
bits.CopyTo(final, 0);
for(int j = 0; j < data.Length; j++)
{
final[j] = ((byte)(final[j] ^ Derive(box, i, j))).RotL(j);
}
}
return final;
}
private static byte Derive(byte[,] box, int level, int index)
{
unchecked
{
byte a = (byte)((level.RotL(2) ^ index) >> 24);
byte b = (byte)((index.RotR(2) ^ level) >> 24);
byte c = Io3(a, b);
byte d = Io4(a, b, index.RotR(level));
return (byte)((box[a % 8, b % 8] ^ box[Math.Abs(~b % 8), Math.Abs(~a % 8)] & 0xaa * 19) & (box[b % 8, a % 8] ^ box[Math.Abs(b.RotL(2) % 8), Math.Abs(a.RotR(3) % 8)] & 0x55 * 11));
}
}
private static byte[,] GenerateBox(byte[] key)
{
byte[] b = new byte[64];
byte[,] box = new byte[8,8];
for(int i = 0; i < key.Length; i++)
{
unchecked
{
b[i] = (byte)((key[i].RotR(1) << 1) ^ (key[key[i] % 64].RotL(1) >> 1) * 1001784996287 + 19 ^ Io2(key[64 - i - 1]));
}
}
byte[] seed = { b[0], b[7], b[55], b[63] };
XhuffleGenerator rand = new XhuffleGenerator(BitConverter.ToInt32(seed, 0));
BitArray bits = new BitArray(b);
for(int i = 0; i < b.Length; i++)
{
int a = rand.Next(0, bits.Length);
int q = rand.Next(0, bits.Length);
bits[a] ^= bits[q];
}
bits.CopyTo(b, 0);
for(int i = 0; i < b.Length; i++)
{
box[i % 8, i / 8] = Io2(b[i]);
}
return box;
}
private static byte Io2(byte data)
{
byte p = (byte)(data.RotL(1) ^ data.RotR(1));
byte q = data.RotR(p ^ data.RotR(3) - 1);
return unchecked((byte)((3855 * (p ^ q)) * 0x55 ^ (p * q)));
}
private static byte Io3(byte a, byte b)
{
unchecked
{
byte p = a.RotL(a + 3);
byte q = b.RotR(p ^ (a % 0x80));
byte r = (byte)((a & b) ^ (p & q));
return (byte)((2565 ^ (q ^ r + 0xAA)) ^ (r | p) * r & p ^ Io2(q));
}
}
private static byte Io4(byte a, byte b, int c)
{
unchecked
{
byte aa = (byte)(Io2(a) << 1);
byte bb = (byte)(Io2(b) >> 1);
byte ab = (byte)(aa ^ bb);
byte abc = (byte)(Io2(ab) * 5567 + 43);
return (byte)(abc ^ 0x5a + 11 & 0xa5 ^ ab);
}
}
}
public class XhuffleGenerator
{
int n;
int stage;
int mask = 0x5a5a5a5a;
public XhuffleGenerator(int seed)
{
n = seed ^ mask;
stage = 0;
}
public int[] NextSet(int count, int limit)
{
int[] nums = new int[count];
for(int i = 0; i < count; i++)
{
unchecked
{
int temp = stage;
temp += n.RotR(stage);
temp = temp.RotR(4) & mask;
temp ^= stage >> 1;
temp ^= stage >> 31;
temp ^= stage << 30;
temp ^= stage << 29;
temp = temp.RotR(4) & mask;
temp ^= stage >> 28;
temp ^= stage >> 27;
temp ^= stage << 26;
temp ^= stage << 25;
temp = temp.RotR(4) & mask;
temp ^= stage >> 24;
temp ^= stage >> 23;
temp ^= stage << 22;
temp ^= stage << 21;
temp = temp.RotR(4) & mask;
temp ^= stage >> 20;
temp ^= stage >> 19;
temp ^= stage << 18;
temp ^= stage << 17;
temp = temp.RotR(4) & mask;
temp ^= stage >> 16;
temp ^= stage >> 15;
temp ^= stage << 14;
temp ^= stage << 13;
temp = temp.RotR(4) & mask;
temp ^= stage >> 12;
temp ^= stage >> 11;
temp ^= stage << 10;
temp ^= stage << 9;
temp = temp.RotR(4) & mask;
temp ^= stage >> 8;
temp ^= stage >> 7;
temp ^= stage << 6;
temp ^= stage << 5;
temp = temp.RotR(4) & mask;
temp ^= stage >> 4;
temp ^= stage >> 3;
temp ^= stage << 2;
temp ^= stage << 1;
stage = temp * 12345 + 1;
}
nums[i] = n = Math.Abs(stage % limit);
}
return nums;
}
public int Next(int min, int max)
{
return this.NextSet(1, max - min)[0] + min;
}
}
}
Revise this Paste