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); }
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(); }
/// <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(); }
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); }