Beispiel #1
0
 uint[] DeriveKey()
 {
     uint[] dst = new uint[0x10], src = new uint[0x10];
     for (int i = 0; i < 0x10; i++)
     {
         dst[i] = v;
         src[i] = x;
         z      = (x >> 5) | (x << 27);
         x      = (c >> 3) | (c << 29);
         c      = (v >> 7) | (v << 25);
         v      = (z >> 11) | (z << 21);
     }
     return(deriver.DeriveKey(dst, src));
 }
Beispiel #2
0
 uint[] DeriveKey()
 {
     uint[] dst = new uint[0x10], src = new uint[0x10];
     for (int i = 0; i < 0x10; i++)
     {
         dst[i] = mut4;
         src[i] = mut2;
         mut1   = (mut2 >> 5) | (mut2 << 27);
         mut2   = (mut3 >> 3) | (mut3 << 29);
         mut3   = (mut4 >> 7) | (mut4 << 25);
         mut4   = (mut1 >> 11) | (mut1 << 21);
     }
     return(deriver.DeriveKey(dst, src));
 }
Beispiel #3
0
 uint[] DeriveKey()
 {
     uint[] dst = new uint[0x10], src = new uint[0x10];
     for (int i = 0; i < 0x10; i++)
     {
         dst[i] = v;
         src[i] = x;
         z      = (x >> 7) | (x << 25);
         x      = (c >> 2) | (c << 30);
         c      = (v >> 6) | (v << 24);
         v      = (z >> 12) | (z << 23);
     }
     return(deriver.DeriveKey(dst, src));
 }
Beispiel #4
0
        public byte[] Encrypt(ICompressionService compress, byte[] data, uint seed, Action <double> progressFunc)
        {
            data = (byte[])data.Clone();
            var   dst   = new uint[0x10];
            var   src   = new uint[0x10];
            ulong state = seed;

            for (var i = 0; i < 0x10; i++)
            {
                state  = (state * state) % 0x143fc089;
                src[i] = (uint)state;
                dst[i] = (uint)((state * state) % 0x444d56fb);
            }
            var key = Deriver.DeriveKey(dst, src);

            var z = (uint)(state % 0x8a5cb7);

            for (var i = 0; i < data.Length; i++)
            {
                data[i] ^= (byte)state;
                if ((i & 0xff) == 0)
                {
                    state = (state * state) % 0x8a5cb7;
                }
            }
            data = compress.Compress(data, progressFunc);
            Array.Resize(ref data, (data.Length + 3) & ~3);

            var encryptedData = new byte[data.Length];
            var keyIndex      = 0;

            for (var i = 0; i < data.Length; i += 4)
            {
                var datum     = (uint)(data[i + 0] | (data[i + 1] << 8) | (data[i + 2] << 16) | (data[i + 3] << 24));
                var encrypted = datum ^ key[keyIndex & 0xf];
                key[keyIndex & 0xf]  = (key[keyIndex & 0xf] ^ datum) + 0x3ddb2819;
                encryptedData[i + 0] = (byte)(encrypted >> 0);
                encryptedData[i + 1] = (byte)(encrypted >> 8);
                encryptedData[i + 2] = (byte)(encrypted >> 16);
                encryptedData[i + 3] = (byte)(encrypted >> 24);
                keyIndex++;
            }

            return(encryptedData);
        }