public BlockAlgorithmKeyWrapTransform(SymmetricAlgorithm symmetricAlgorithm, Salt salt, KeyWrapDirection keyWrapDirection) { if (symmetricAlgorithm == null) { throw new ArgumentNullException("symmetricAlgorithm"); } if (salt == null) { throw new ArgumentNullException("salt"); } if (salt.Length != 0 && salt.Length < symmetricAlgorithm.Key().Length) { throw new InternalErrorException("Salt is too short. It must be at least as long as the algorithm key, or empty for no salt."); } _algorithm = symmetricAlgorithm; byte[] saltedKey = _algorithm.Key(); saltedKey.Xor(salt.GetBytes().Reduce(saltedKey.Length)); _algorithm.SetKey(saltedKey); _algorithm.Mode = CipherMode.ECB; _algorithm.Padding = PaddingMode.None; BlockLength = _algorithm.BlockSize / 8; _transform = keyWrapDirection == KeyWrapDirection.Encrypt ? _algorithm.CreateEncryptingTransform() : _algorithm.CreateDecryptingTransform(); }