public char[] Decode(char[] message) { BitArrayBlock encodedMessage = new BitArrayBlock( new BitArray(new bool[0]) ); message = _fillCharArrayToSize(message); for (int i = 0; i < message.Length; i += 8) { char[] messageSlice = _getCharArraySlice(message, i, 8); BitArray messageBlock = _convertToBitArray(messageSlice); BitArrayBlock encodedBlock = new BitArrayBlock( _decodeBlock(messageBlock) ); encodedMessage = new BitArrayBlock( encodedMessage.CombineIntoBitArray(encodedBlock) ); } bool[] bits = new bool[message.Length * 8]; encodedMessage.GetBits().CopyTo(bits, 0); return(_convertToCharArray(encodedMessage)); }
public BitArray _decodeBlock(BitArray block) { BitArrayBlock wholeBlock = new BitArrayBlock(block); BitArrayBlock leftBlock = wholeBlock.GetLeftHalf(); BitArrayBlock rightBlock = wholeBlock.GetRightHalf(); for (int i = 0; i < 32; i++) { BitArrayBlock rightBlockCopy = rightBlock.Clone(); BitArrayBlock subkey = _getSubKey(31 - i); rightBlock = rightBlock.Xor(subkey); int[] numbers = _convertTo4BitInts(rightBlock.GetBits()); _functionF.ApplySBlocks(numbers); rightBlock = _convertToBits(numbers); rightBlock.CircularLeftShift(11); rightBlock = rightBlock.Xor(leftBlock); leftBlock = rightBlockCopy; } rightBlock.ExchangeBits(leftBlock); return(leftBlock.CombineIntoBitArray(rightBlock)); }