Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        public void ExchangeBits(BitArrayBlock block)
        {
            BitArray blockBits = block._block;

            block._block = this._block;
            this._block  = blockBits;
        }
Пример #4
0
        public BitArray Encode(BitArray left, BitArray right)
        {
            BitArrayBlock encodedBlock = new BitArrayBlock(
                _encodeBlock(left)
                );

            return(encodedBlock.GetBits());
        }
Пример #5
0
        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));
        }
Пример #6
0
        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);
        }
Пример #7
0
 public BitArrayBlock Xor(BitArrayBlock block2)
 {
     return(new BitArrayBlock(
                this._block.Xor(block2._block)));
 }