Esempio n. 1
0
        public byte[] Decrypt(byte[] startupInput, byte[] keyInput, int w, int r, int b)
        {
            var key = GetKey(keyInput, b);

            for (int i = 0; i < keyInput.Length; i++)
            {
                keyInput[i] = 0;
            }

            var helper = new RC5Helper(w, r, key);
            var input  = GetEncryptingResultModel(startupInput, helper.BlockSize);
            var result = new byte[input.EncryptedData.Length];
            var IV     = DecryptInitializeVector(input.IV, key, w, r);

            for (int i = 0; i < input.EncryptedData.Length; i += helper.BlockSize)
            {
                var currentBlock = new byte[helper.BlockSize];
                Array.Copy(input.EncryptedData, i, currentBlock, 0, helper.BlockSize);

                var decryptedBlock = DecryptBlock(currentBlock, helper);
                decryptedBlock = XOR(IV, decryptedBlock, helper.W);
                Array.Copy(decryptedBlock, 0, result, i, helper.BlockSize);

                IV = currentBlock;
            }

            return(RemoveAppending(result));
        }
Esempio n. 2
0
        public EncryptingResultModel Encrypt(byte[] input, byte[] keyInput, int w, int r, int b)
        {
            var key = GetKey(keyInput, b);

            for (int i = 0; i < keyInput.Length; i++)
            {
                keyInput[i] = 0;
            }

            var helper = new RC5Helper(w, r, key);

            input = GetFullInput(input, helper.BlockSize);

            var IV         = GetInitializeVector(helper.BlockSize);
            var resultData = new byte[input.Length];
            var result     = new EncryptingResultModel {
                IV = EncryptInitializeVector(IV, key, w, r)
            };

            for (int i = 0; i < input.Length; i += helper.BlockSize)
            {
                var currentBlock = new byte[helper.BlockSize];
                Array.Copy(input, i, currentBlock, 0, helper.BlockSize);

                currentBlock = XOR(IV, currentBlock, helper.W);
                IV           = EncryptBlock(currentBlock, helper);

                Array.Copy(IV, 0, resultData, i, helper.BlockSize);
            }
            result.EncryptedData = resultData;

            return(result);
        }
Esempio n. 3
0
        private byte[] DecryptInitializeVector(byte[] input, byte[] key, int w, int r)
        {
            var helper = new RC5Helper(w, r, key);
            var result = new byte[input.Length];

            for (int i = 0; i < input.Length; i += helper.BlockSize)
            {
                var currentBlock = new byte[helper.BlockSize];
                Array.Copy(input, i, currentBlock, 0, helper.BlockSize);
                currentBlock = DecryptBlock(currentBlock, helper);
                Array.Copy(currentBlock, 0, result, i, helper.BlockSize);
            }

            return(result);
        }
Esempio n. 4
0
        private byte[] EncryptBlock(byte[] block, RC5Helper helper)
        {
            var A = GetBlockPart(block, true, helper.W);
            var B = GetBlockPart(block, false, helper.W);

            A += helper.S[0];
            B += helper.S[1];

            for (int i = 1; i <= helper.R; i++)
            {
                A = helper.RotateLeft((A ^ B), (int)B, helper.W * 8) + helper.S[2 * i];
                B = helper.RotateLeft((B ^ A), (int)A, helper.W * 8) + helper.S[2 * i + 1];
            }

            var result = new byte[2 * helper.W];
            var partA  = BitConverter.GetBytes(A);
            var partB  = BitConverter.GetBytes(B);

            Array.Copy(partA, 0, result, 0, helper.W);
            Array.Copy(partB, 0, result, helper.W, helper.W);

            return(result);
        }
Esempio n. 5
0
        private byte[] DecryptBlock(byte[] block, RC5Helper helper)
        {
            var A = GetBlockPart(block, true, helper.W);
            var B = GetBlockPart(block, false, helper.W);


            for (int i = helper.R; i > 0; i--)
            {
                B = helper.RotateRight(B - helper.S[2 * i + 1], (int)A, helper.W * 8) ^ A;
                A = helper.RotateRight(A - helper.S[2 * i], (int)B, helper.W * 8) ^ B;
            }

            A -= helper.S[0];
            B -= helper.S[1];

            var result = new byte[2 * helper.W];
            var partA  = BitConverter.GetBytes(A);
            var partB  = BitConverter.GetBytes(B);

            Array.Copy(partA, 0, result, 0, helper.W);
            Array.Copy(partB, 0, result, helper.W, helper.W);

            return(result);
        }