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 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); }