Exemple #1
0
        private static void Enc(ref uint ll, uint r, BlowfishData key, int pi)
        {
            ll ^= key.P[pi];

            var t = key.S[0 + ((r >> 24) & 0xFFU)];

            t += key.S[256 + ((r >> 16) & 0xFFU)];
            t ^= key.S[512 + ((r >> 8) & 0xFFU)];
            t += key.S[768 + (r & 0xFFU)];

            ll ^= t;
        }
Exemple #2
0
        public static void Decrypt(uint[] data, int offset, BlowfishData key)
        {
            var l = data[offset];
            var r = data[offset + 1];

            l ^= key.P[BfRounds + 1];

            Enc(ref r, l, key, 4);
            Enc(ref l, r, key, 3);
            Enc(ref r, l, key, 2);
            Enc(ref l, r, key, 1);

            r ^= key.P[0];

            data[offset + 1] = l & 0xFFFFFFFFU;
            data[offset]     = r & 0xFFFFFFFFU;
        }
Exemple #3
0
        public static void SetKey(byte[] data, BlowfishData key)
        {
            byte       d   = 0;
            const byte end = 8;

            uint[] im = { 0U, 0U };

            Array.Copy(BfInit.P, key.P, BfInit.P.Length);
            Array.Copy(BfInit.S, key.S, BfInit.S.Length);

            for (var i = 0; i < 6; ++i)
            {
                uint ri = data[d++];

                if (d >= end)
                {
                    d = 0;
                }

                ri <<= 8;
                ri  |= data[d++];

                if (d >= end)
                {
                    d = 0;
                }

                ri <<= 8;
                ri  |= data[d++];

                if (d >= end)
                {
                    d = 0;
                }

                ri <<= 8;
                ri  |= data[d++];

                if (d >= end)
                {
                    d = 0;
                }

                key.P[i] ^= ri;
            }

            im[0] = 0;
            im[1] = 0;

            for (var ii = 0; ii < 6; ii += 2)
            {
                Encrypt(im, 0, key);

                key.P[ii]     = im[0];
                key.P[ii + 1] = im[1];
            }

            for (var k = 0; k < 1024; k += 2)
            {
                Encrypt(im, 0, key);

                key.S[k]     = im[0];
                key.S[k + 1] = im[1];
            }
        }