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)); }
public void ExchangeBits(BitArrayBlock block) { BitArray blockBits = block._block; block._block = this._block; this._block = blockBits; }
public BitArray Encode(BitArray left, BitArray right) { BitArrayBlock encodedBlock = new BitArrayBlock( _encodeBlock(left) ); return(encodedBlock.GetBits()); }
public BitArray CombineIntoBitArray(BitArrayBlock rightHalf) { bool[] array = new bool[_block.Length + rightHalf._block.Length]; rightHalf._block.CopyTo(array, 0); this._block.CopyTo(array, rightHalf._block.Length); return(new BitArray(array)); }
public char[] _convertToCharArray(BitArrayBlock block) { BitArray bitArray = block.GetBits(); char[] chars = new char[bitArray.Length / 8]; for (int i = bitArray.Length - 1; i > 0; i -= 8) { int numericValue = 0; for (int j = 0; j < 8; j++) { if (bitArray[i - j]) { numericValue += (int)Math.Pow(2, 7 - j); } } chars[(bitArray.Length - i) / 8] = (char)numericValue; } return(chars); }
public BitArrayBlock Xor(BitArrayBlock block2) { return(new BitArrayBlock( this._block.Xor(block2._block))); }