예제 #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));
        }