Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: