Ejemplo n.º 1
0
        public bool Access(string password, out string decryptedText)
        {
            decryptedText = string.Empty;

            if (!Exists())
            {
                return(false);
            }

            int aglSize = Size();

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

            /*
             * // verifica che nel file ci sia l'AGL
             * var ssBytes = Encoding.UTF8.GetBytes(BlockIdString);
             * stream.Seek(-ssBytes.Length, SeekOrigin.End);
             * var ss = new byte[ssBytes.Length];
             * stream.Read(ss, 0, ssBytes.Length);
             * if (Encoding.UTF8.GetString(ssBytes) != Encoding.UTF8.GetString(ss))
             *  return false;
             *
             * // Ottieni la lunghezza dell'AGL
             * stream.Seek(-sizeof(int) - ssBytes.Length, SeekOrigin.End);
             * byte[] aglSizeBytes = new byte[sizeof(int)];
             * stream.Read(aglSizeBytes, 0, sizeof(int));
             *
             * int aglSize = BitConverter.ToInt32(aglSizeBytes, 0);
             */
            var current = stream.Seek(-aglSize, SeekOrigin.End);

            int amount = 1;

            while (amount != 0 || stream.Position != stream.Length)
            {
                var lengthBytes = new byte[sizeof(int)];
                stream.Read(lengthBytes, 0, sizeof(int));
                int length = BitConverter.ToInt32(lengthBytes, 0);

                var data = new byte[length];
                amount = stream.Read(data, 0, length);
                try
                {
                    decryptedText = RijndaelService.Decrypt(data, password);

                    return(true);
                }
                catch (Exception)
                {
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        public void Encrypt(string key)
        {
            var stream = new FileStream(Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            // decido quanti byte di inizio file criptare
            // ovviamente devo tener conto della dimensione del file
            int headerSize = 254;

            if (headerSize > stream.Length)
            {
                headerSize = (int)stream.Length;
            }

            var firstBytes = new byte[headerSize];

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

            // crittografa il primo blocco di N bytes
            var crypto = RijndaelService.EncryptBytes(firstBytes, key);

            // leggi tutto il contenuto restante
            byte[] bytes = new byte[stream.Length - firstBytes.Length];
            stream.Read(bytes, 0, bytes.Length);

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

            // LA situazione ora è definita da
            // crypto: primi N bytes criptati
            // bytes: i restanti bytes del file, normali

            stream = new FileStream(Filename, FileMode.Create);
            // All'inizio del blocco specifica il numero dei byte adibiti all'header section
            stream.Write(BitConverter.GetBytes(crypto.Length), 0, sizeof(int));
            stream.Write(crypto, 0, crypto.Length);
            stream.Write(bytes, 0, bytes.Length);
            stream.Close();
            stream.Dispose();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Struttura AGL:
        /// blocchi costituiti da -> size(crypt(testo, key)) + crypt(testo, key)
        /// + size(AGLblocks) + securityIdBlock
        /// </summary>
        /// <param name="data"></param>

        public void Write(string phrase, List <string> keys)
        {
            List <byte> AGLbytes = new List <byte>();

            foreach (var key in keys)
            {
                var enc = RijndaelService.Encrypt(phrase, key);
                AGLbytes.AddRange(BitConverter.GetBytes(enc.Length));
                AGLbytes.AddRange(enc);
            }

            var ssBytes = Encoding.UTF8.GetBytes(BlockIdString);

            AGLbytes.AddRange(BitConverter.GetBytes(AGLbytes.Count + sizeof(int) + ssBytes.Length));
            AGLbytes.AddRange(ssBytes);

            var bytesArr = AGLbytes.ToArray();

            var stream = new FileStream(Filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);

            stream.Write(bytesArr, 0, bytesArr.Length);
            stream.Close();
            stream.Dispose();
        }
Ejemplo n.º 4
0
        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);
        }