Example #1
0
        public void Decrypt(BinaryReader input, string keyPhrase, BinaryWriter output)
        {
            var block = new byte[2 * U];
            var key   = GenerateKey(keyPhrase);
            var s     = CreateSArray(key);

            for (int i = 0; i < B; i++)
            {
                key[i] = 0;
            }

            input.Read(block);
            var vector = Rc5Common.Decrypt(block, s);

            while (input.Read(block) > 0)
            {
                var partlyDecrypted = Rc5Common.Decrypt(block, s);
                var decrypted       = partlyDecrypted.Zip(vector, (fst, snd) => (byte)(fst ^ snd)).ToArray();
                output.Write(input.BaseStream.Length != input.BaseStream.Position ?
                             decrypted :
                             decrypted.Take(2 * U - decrypted.Last()).ToArray());
                Array.Copy(block, vector, 2 * U);
            }

            for (int i = 0; i < SArraySize; i++)
            {
                s[i] = 0;
            }
        }
Example #2
0
        public void Encrypt(BinaryReader input, string keyPhrase, BinaryWriter output)
        {
            var enumerable = new Rc5BinaryEnumerable(input);
            var vector     = GenerateVector();
            var key        = GenerateKey(keyPhrase);
            var s          = CreateSArray(key);

            for (int i = 0; i < B; i++)
            {
                key[i] = 0;
            }

            var vectorEncrypted = Rc5Common.Encrypt(vector, s);

            output.Write(vectorEncrypted);

            foreach (var block in enumerable)
            {
                var forEncryption = block.Zip(vector, (fst, snd) => (byte)(fst ^ snd)).ToArray();
                var encrypted     = Rc5Common.Encrypt(forEncryption, s);
                output.Write(encrypted);
                vector = encrypted;
            }

            for (int i = 0; i < SArraySize; i++)
            {
                s[i] = 0;
            }
        }