Esempio n. 1
0
        public static byte[] DecryptBlock(uint[] v, uint[] k)
        {
            if (v == null || k == null)
            {
                return(null);
            }
            if (k.Length < 4)
            {
                return(null);
            }

            uint n = (uint)v.Length;

            if (n == 0)
            {
                return(null);
            }
            if (n <= 1)
            {
                return new byte[1] {
                           0
                }
            }
            ;                                     // algorithm doesn't work for n<2 so fudge by adding a null

            uint q = (uint)(6 + 52 / n);

            n--;
            uint z = v[n], y = v[0];
            uint mx, e, sum = q * DELTA;
            uint p = 0;

            while (sum != 0)
            {
                e = sum >> 2 & 3;

                for (p = n; p > 0; p--)
                {
                    z  = v[p - 1];
                    mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                    y  = v[p] -= mx;
                }

                z  = v[n];
                mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                y  = v[0] -= mx;

                sum -= DELTA;
            }

            return(StrConvert.LongsToStr(v));
        }
Esempio n. 2
0
        public static byte[] EncryptBlock(uint[] v, uint[] k)
        {
            if (v == null || k == null)
            {
                return(null);
            }
            if (k.Length < 4)
            {
                return(null);
            }

            int n = v.Length;

            if (n == 0)
            {
                return(null);
            }
            if (n <= 1)
            {
                return new byte[1] {
                           0
                }
            }
            ;                                     // algorithm doesn't work for n<2 so fudge by adding a null

            uint q = (uint)(6 + 52 / n);

            n--;
            uint z = v[n], y = v[0];
            uint mx, e, sum = 0;

            while (q-- > 0)
            {  // 6 + 52/n operations gives between 6 & 32 mixes on each word
                sum += DELTA;

                e = sum >> 2 & 3;

                for (int p = 0; p < n; p++)
                {
                    y  = v[p + 1];
                    mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                    z  = v[p] += mx;
                }
                y  = v[0];
                mx = (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z);
                z  = v[n] += mx;
            }

            return(StrConvert.LongsToStr(v));
        }