Example #1
0
        private MyBitArray GenerateKey(MyBitArray sourceKey, int iter)
        {
            MyBitArray key                   = new MyBitArray(48);
            MyBitArray permutatedKey         = new MyBitArray(56);
            MyBitArray permutatedKeyC        = new MyBitArray(28);
            MyBitArray permutatedKeyD        = new MyBitArray(28);
            MyBitArray permutatedKeyCShifted = new MyBitArray(28);
            MyBitArray permutatedKeyDShifted = new MyBitArray(28);


            for (int i = 0; i < 28; i++)
            {
                permutatedKeyC[i] = sourceKey[C[i]];
                permutatedKeyD[i] = sourceKey[D[i]];
            }

            int        iterShift = 0;
            MyBitArray t         = new MyBitArray(56);

            for (int i = 0; i < 28; i++)
            {
                t[i]      = permutatedKeyC[i];
                t[i + 28] = permutatedKeyD[i];
            }
            byte[] te = t.GetBytesArray();

            for (int i = 0; i <= iter; i++)
            {
                iterShift += shift[i];
            }

            for (int i = 0; i < 28; i++)
            {
                permutatedKeyCShifted[(i - iterShift + 28) % 28] = permutatedKeyC[i];
                permutatedKeyDShifted[(i - iterShift + 28) % 28] = permutatedKeyD[i];
            }

            for (int i = 0; i < 28; i++)
            {
                t[i]      = permutatedKeyCShifted[i];
                t[i + 28] = permutatedKeyDShifted[i];
            }
            te = t.GetBytesArray();

            for (int i = 0; i < 28; i++)
            {
                permutatedKey[i]      = permutatedKeyCShifted[i];
                permutatedKey[28 + i] = permutatedKeyDShifted[i];
            }

            for (int i = 0; i < 48; i++)
            {
                key[i] = permutatedKey[K[i]];
            }

            return(key);
        }
Example #2
0
        private MyBitArray BackCycleFeistel(MyBitArray sourceData, MyBitArray key, int numberOfCycle)
        {
            MyBitArray encryptedData = new MyBitArray(64);

            MyBitArray R = new MyBitArray(32);
            MyBitArray L = new MyBitArray(32);
            MyBitArray lExpanded;
            MyBitArray k;

            MyBitArray[] B = new MyBitArray[8];
            MyBitArray   B_32;
            MyBitArray   pPermutation;


            // разделение на 2 блока
            for (int i = 0; i < 32; i++)
            {
                L[i] = sourceData[i];
                R[i] = sourceData[32 + i];
            }

            // расширение правой части
            lExpanded = ExtendHalf(L);


            // 48-битный ключ
            k = GenerateKey(key, numberOfCycle);

            // разбитие расширеной правой части на 8 блоков по 6 бит
            byte[]     kek   = new byte[8];
            MyBitArray Xored = new MyBitArray(48);

            for (int i = 0; i < 48; i++)
            {
                Xored[i] = lExpanded[i] ^ k[i];
            }

            for (int i = 0; i < 8; i++)
            {
                B[i] = new MyBitArray(6);
                for (int j = 0; j < 6; j++)
                {
                    B[i][j] = Xored[(i * 6) + j];
                }
            }


            // получение B` из таблици Значение функции  f(R[i-1], k[i]) (32 бит)
            int B_before_P = 0;

            for (int i = 0; i < 8; i++)
            {
                byte[] a;
                byte[] b;

                MyBitArray temp = new MyBitArray(new bool[] { B[i][0], B[i][5] });
                a    = temp.GetBytesArray();
                temp = new MyBitArray(new bool[] { B[i][1], B[i][2], B[i][3], B[i][4] });
                b    = temp.GetBytesArray();

                B_before_P = B_before_P | (S[i][a[0], b[0]] << (32 - ((i + 1) * 4)));
            }

            B_32 = new MyBitArray(new int[] { B_before_P });

            pPermutation = PPermutation(B_32);

            for (int i = 0; i < 32; i++)
            {
                encryptedData[32 + i] = L[i];
                encryptedData[i]      = R[i] ^ pPermutation[i];
            }


            return(encryptedData);
        }