/// <summary>
        /// Restores a cryptogrpahic key from a <see cref="T:System.IO.Stream" />. This method is intended for use in
        /// transferring a key between machines.
        /// </summary>
        /// <param name="inputStream"><see cref="T:System.IO.Stream" /> from which key is to be restored.</param>
        /// <param name="passphrase">User-provided passphrase used to encrypt the key in the arhive.</param>
        /// <param name="protectionScope"><see cref="T:System.Security.Cryptography.DataProtectionScope" /> used to protect the key on disk. </param>
        /// <returns>Key restored from stream, encapsulated in a <see cref="T:Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.ProtectedKey"></see>.</returns>
        public static ProtectedKey RestoreKey(Stream inputStream, string passphrase, DataProtectionScope protectionScope)
        {
            IKeyReader keyReader = new KeyReaderWriter();

            return(keyReader.Restore(inputStream, passphrase, protectionScope));
        }
        /// <summary>
        /// Archives a cryptographic key to a <see cref="T:System.IO.Stream" />. This method is intended for use in
        /// transferring a key between machines.
        /// </summary>
        /// <param name="outputStream"><see cref="T:System.IO.Stream" /> to which key is to be archived.</param>
        /// <param name="keyToArchive">Key to be archived.</param>
        /// <param name="passphrase">User-provided passphrase used to encrypt the key in the arhive.</param>
        public static void ArchiveKey(Stream outputStream, ProtectedKey keyToArchive, string passphrase)
        {
            IKeyWriter keyWriter = new KeyReaderWriter();

            keyWriter.Archive(outputStream, keyToArchive, passphrase);
        }
        /// <overloads>
        /// Reads an encrypted key from an input stream. This method is not intended to allow keys to be transferred
        /// from another machine.
        /// </overloads>
        /// <summary>
        /// Reads an encrypted key from an input stream. This method is not intended to allow keys to be transferred
        /// from another machine.
        /// </summary>
        /// <param name="inputStream"><see cref="T:System.IO.Stream" /> from which DPAPI-protected key is to be read.</param>
        /// <param name="dpapiProtectionScope"><see cref="T:System.Security.Cryptography.DataProtectionScope" /> used to protect the key on disk. </param>
        /// <returns>Key read from stream, encapsulated in a <see cref="T:Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.ProtectedKey"></see>.</returns>
        public static ProtectedKey Read(Stream inputStream, DataProtectionScope dpapiProtectionScope)
        {
            IKeyReader keyReader = new KeyReaderWriter();

            return(keyReader.Read(inputStream, dpapiProtectionScope));
        }
        /// <summary>
        /// Writes an encrypted key to an output stream. This method is not intended to allow the keys to be
        /// moved from machine to machine.
        /// </summary>
        /// <param name="outputStream"><see cref="T:System.IO.Stream" /> to which DPAPI-protected key is to be written.</param>
        /// <param name="key">Encrypted key to be written to stream.</param>
        public static void Write(Stream outputStream, ProtectedKey key)
        {
            IKeyWriter keyWriter = new KeyReaderWriter();

            keyWriter.Write(outputStream, key);
        }