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); }
public MyBitArray(MyBitArray array) { bits = new bool[array.Length]; for (int i = 0; i < array.Length; i++) { bits[i] = array[i]; } }
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); }
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; }
private MyBitArray ExtendHalf(MyBitArray half) { MyBitArray res = new MyBitArray(48); for (int i = 0; i < 48; i++) { res[i] = half[E[i]]; } return(res); }
private MyBitArray FinalPermutation(MyBitArray sourceData) { MyBitArray encryptedData = new MyBitArray(64); for (int i = 0; i < 64; i++) { encryptedData[i] = sourceData[finalPermutation[i]]; } return(encryptedData); }
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); }
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; }
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); }
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); }