示例#1
0
        private MyBitArray ExtentKey(MyBitArray sourceKey)
        {
            MyBitArray key = new MyBitArray(64);

            int index   = 0;
            int counter = 0;

            for (int i = 0; i < 64; i++)
            {
                if ((i + 1) % 8 == 0)
                {
                    if (counter % 2 == 0)
                    {
                        key[i] = true;
                    }
                    counter = 0;
                    continue;
                }
                counter = (sourceKey[index]) ? counter + 1 : counter;
                key[i]  = sourceKey[index];
                index++;
            }

            return(key);
        }
示例#2
0
 public MyBitArray(MyBitArray array)
 {
     bits = new bool[array.Length];
     for (int i = 0; i < array.Length; i++)
     {
         bits[i] = array[i];
     }
 }
示例#3
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);
        }
示例#4
0
        private void buttonEncrypt_Click(object sender, EventArgs e)
        {
            textBoxRes.Clear();

            List <MyBitArray> encryptedData = new List <MyBitArray>(textBoxSource.Text.Length / 4);


            MyBitArray  key;
            List <byte> bKey = new List <byte>(7);

            bKey.AddRange(enc.GetBytes(textBoxKey.Text));
            byte[] Bkey = new byte[7];

            for (int i = 0; i < bKey.Count && i < 7; i++)
            {
                Bkey[i] = bKey[i];
            }

            key = new MyBitArray(Bkey);

            string tempKeyOut = string.Empty;

            for (int i = 0; i < bKey.Count; i++)
            {
                tempKeyOut += bKey[i];
            }
            textBoxRes.Text += "ключ шифрования в байтах: " + tempKeyOut + Environment.NewLine;

            key = ExtentKey(key);

            List <MyBitArray> data = SplitData(textBoxSource.Text);

            // шифрование
            foreach (var element in data)
            {
                encryptedData.Add(Encrypt(element, key));
            }


            // вывод
            StringBuilder sb  = new StringBuilder();
            StringBuilder sb2 = new StringBuilder();

            for (int i = 0; i < encryptedData.Count; i++)
            {
                byte[] text     = encryptedData[i].GetBytesArray();
                char[] textChar = enc.GetChars(text);
                for (int j = 0; j < text.Length; j++)
                {
                    sb.Append(text[j] + " ");
                }
                sb2.Append(textChar);
            }
            textBoxRes.Text += sb + Environment.NewLine;
            textBoxRes.Text += sb2 + Environment.NewLine;
        }
示例#5
0
        private MyBitArray ExtendHalf(MyBitArray half)
        {
            MyBitArray res = new MyBitArray(48);

            for (int i = 0; i < 48; i++)
            {
                res[i] = half[E[i]];
            }
            return(res);
        }
示例#6
0
        private MyBitArray FinalPermutation(MyBitArray sourceData)
        {
            MyBitArray encryptedData = new MyBitArray(64);

            for (int i = 0; i < 64; i++)
            {
                encryptedData[i] = sourceData[finalPermutation[i]];
            }
            return(encryptedData);
        }
示例#7
0
        private MyBitArray PPermutation(MyBitArray B_32)
        {
            MyBitArray pPermutation = new MyBitArray(32);

            // Перестановка P
            for (int i = 0; i < 32; i++)
            {
                pPermutation[i] = B_32[P[i]];
            }
            return(pPermutation);
        }
示例#8
0
        private void buttonDecrypt_Click(object sender, EventArgs e)
        {
            textBoxRes.Text = "";

            string[]    subs  = textBoxSource.Text.Split(' ');
            List <byte> dataB = new List <byte>(subs.Length);

            for (int i = 0; i < subs.Length; i++)
            {
                dataB.Add(Byte.Parse(subs[i]));
            }

            List <MyBitArray> decryptedData = new List <MyBitArray>(textBoxSource.Text.Length / 4);
            MyBitArray        key;
            List <byte>       bKey = new List <byte>(7);

            bKey.AddRange(enc.GetBytes(textBoxKey.Text));
            byte[] Bkey = new byte[7];

            for (int i = 0; i < bKey.Count && i < 7; i++)
            {
                Bkey[i] = bKey[i];
            }

            key = new MyBitArray(Bkey);

            key = ExtentKey(key);

            List <MyBitArray> data = new List <MyBitArray>(dataB.Count / 8);

            for (int i = 0; i < dataB.Count; i += 8)
            {
                data.Add(new MyBitArray(new byte[] { dataB[i], dataB[i + 1], dataB[i + 2], dataB[i + 3], dataB[i + 4], dataB[i + 5], dataB[i + 6], dataB[i + 7] }));
            }

            foreach (var element in data)
            {
                decryptedData.Add(Decrypt(element, key));
            }

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < decryptedData.Count; i++)
            {
                byte[] text = decryptedData[i].GetBytesArray();

                List <char> arr = new List <char>(enc.GetChars(text));
                arr.RemoveAll(new Predicate <char>(c => c.Equals('\0')));

                sb.Append(arr.ToArray());
            }
            textBoxRes.Text += sb + Environment.NewLine;
        }
示例#9
0
        public MyBitArray Decrypt(MyBitArray sourceData, MyBitArray key)
        {
            if (sourceData.Length != 64)
            {
                throw new Exception("Размер блока не 64 бита");
            }

            // начальная перестановка
            sourceData = InitialPermutation(sourceData);

            // 16 циклов сети Фейстеля
            for (int numberOfCycle = 15; numberOfCycle >= 0; numberOfCycle--)
            {
                sourceData = BackCycleFeistel(sourceData, key, numberOfCycle);
            }

            // финальная перестановка
            sourceData = FinalPermutation(sourceData);

            return(sourceData);
        }
示例#10
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);
        }