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; } }
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; } }