/// <summary>
        /// Ricordiamoci che l'accesso deve essere gerarchico
        /// un può essere acceduto con piu di un una chiave
        /// </summary>
        /// <param name="keys"></param>
        public void Encrypt(List<string> keys)
        {
            if (keys.Count == 0)
                return;

            // Non fare niente se il file presenta già un protocollo di sicurezza
            var aglService = new FileAGLService(Filename);
            if (aglService.Exists() == true)
                return;

            string currentPassword = string.Empty;

            foreach (var key in keys)
                currentPassword += key;

            Encrypt(currentPassword);

            // Ora resta da scrivere, sul file, la parte riguardante l'AGL
            string securityPhrase = FileAGLService.SecurityPhrase;
            if (keys.Count > 1)
                securityPhrase += ":" + currentPassword;

            aglService = new FileAGLService(Filename);
            aglService.Write(securityPhrase, keys);
        }
        public bool Decrypt(string key, bool ownermode = true)
        {
            string password = key;

            var aglService = new FileAGLService(Filename);
            string decryptoAGL = string.Empty;
            if (aglService.Access(key, out decryptoAGL))
            {
                if (decryptoAGL.Contains(FileAGLService.SecurityPhrase + ":"))
                    password = decryptoAGL.Replace(FileAGLService.SecurityPhrase + ":", string.Empty);
            } else return false;

            int aglSize = aglService.Size();

            var stream = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            // Ottieni la lunghezza dell'header
            stream.Seek(0, SeekOrigin.Begin);
            byte[] headerSizeBytes = new byte[sizeof(int)];
            stream.Read(headerSizeBytes, 0, headerSizeBytes.Length);

            int headerSize = BitConverter.ToInt32(headerSizeBytes, 0);

            // leggi l'header
            var headerBytes = new byte[headerSize];
            stream.Read(headerBytes, 0, headerBytes.Length);

            // decripta l'header
            byte[] decrypto;

            try
            {
                decrypto = RijndaelService.DecryptBytes(headerBytes, password);
                Key = password;
            }
            catch (Exception) { return false; }

            // se è riuscito a decriptarlo, sostituisci il file con quello originale, rimuovendo anchel'AGL

            var bytes = new byte[stream.Length - sizeof(int) - headerBytes.Length - aglSize];
            stream.Read(bytes, 0, bytes.Length);

            stream.Close();
            stream.Dispose();

            // Ripristina il file

            stream = new FileStream(Filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            // All'inizio del blocco specifica il numero dei byte adibiti all'header section
            stream.Write(decrypto, 0, decrypto.Length);
            stream.Write(bytes, 0, bytes.Length);
            stream.Close();
            stream.Dispose();

            return true;
        }
Beispiel #3
0
        /// <summary>
        /// Ricordiamoci che l'accesso deve essere gerarchico
        /// un può essere acceduto con piu di un una chiave
        /// </summary>
        /// <param name="keys"></param>
        public void Encrypt(List <string> keys)
        {
            if (keys.Count == 0)
            {
                return;
            }

            // Non fare niente se il file presenta già un protocollo di sicurezza
            var aglService = new FileAGLService(Filename);

            if (aglService.Exists() == true)
            {
                return;
            }

            string currentPassword = string.Empty;

            foreach (var key in keys)
            {
                currentPassword += key;
            }


            Encrypt(currentPassword);


            // Ora resta da scrivere, sul file, la parte riguardante l'AGL
            string securityPhrase = FileAGLService.SecurityPhrase;

            if (keys.Count > 1)
            {
                securityPhrase += ":" + currentPassword;
            }

            aglService = new FileAGLService(Filename);
            aglService.Write(securityPhrase, keys);
        }
        public bool Decrypt(string key, bool ownermode = true)
        {
            string password = key;

            var    aglService  = new FileAGLService(Filename);
            string decryptoAGL = string.Empty;

            if (aglService.Access(key, out decryptoAGL))
            {
                if (decryptoAGL.Contains(FileAGLService.SecurityPhrase + ":"))
                {
                    password = decryptoAGL.Replace(FileAGLService.SecurityPhrase + ":", string.Empty);
                }
            }
            else
            {
                return(false);
            }

            int aglSize = aglService.Size();

            var stream = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            // Ottieni la lunghezza dell'header
            stream.Seek(0, SeekOrigin.Begin);
            byte[] headerSizeBytes = new byte[sizeof(int)];
            stream.Read(headerSizeBytes, 0, headerSizeBytes.Length);

            int headerSize = BitConverter.ToInt32(headerSizeBytes, 0);

            // leggi l'header
            var headerBytes = new byte[headerSize];

            stream.Read(headerBytes, 0, headerBytes.Length);

            // decripta l'header
            byte[] decrypto;

            try
            {
                decrypto = RijndaelService.DecryptBytes(headerBytes, password);
                Key      = password;
            }
            catch (Exception) { return(false); }

            // se è riuscito a decriptarlo, sostituisci il file con quello originale, rimuovendo anchel'AGL

            var bytes = new byte[stream.Length - sizeof(int) - headerBytes.Length - aglSize];

            stream.Read(bytes, 0, bytes.Length);

            stream.Close();
            stream.Dispose();

            // Ripristina il file

            stream = new FileStream(Filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            // All'inizio del blocco specifica il numero dei byte adibiti all'header section
            stream.Write(decrypto, 0, decrypto.Length);
            stream.Write(bytes, 0, bytes.Length);
            stream.Close();
            stream.Dispose();

            return(true);
        }