private IAlgorithm getSessionKeyAlg(bool encryption, string password) { var SKkey = Serpent.generateKeyFromBytes(computeHash(password)); var SKiv = Serpent.generateIV(true); IAlgorithm sessionKeyAlg = new Serpent(SKkey, SKiv, encryption); sessionKeyAlg.init(null, null, "ECB", 128); return(sessionKeyAlg); }
private IAlgorithm encryptFile(String src, String dst, String cipherMode, int segment, int sessionKeySize, String password) { // выполнение алгоритма // создание объекта класса algorithm (IAlgorithm) // вызов метода encrypt с соответствующими параметрами // включая поддержку индикатора выполнения и прерывания операций IAlgorithm alg; var key = Serpent.generateKey(sessionKeySize); //var key = Serpent.generateKeyFromBytes(Convert.FromBase64String("ZgCKtGo7pgmpRw7EFHJTGQ==")); var iv = Serpent.generateIV(); // шифрование ключа сеанса Serpent / ECB паролем`password' var sessionKeyAlg = getSessionKeyAlg(true, password); var encryptedKey = sessionKeyAlg.encryptInMemory(key.GetKey()); // создание заголовка XDocument miXML = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("EncryptedFileHeader", new XElement("Algorithm", "SERPENT"), new XElement("CipherMode", cipherMode), //new XElement("BlockSize", 128), //это постоянный нет необходимости, чтобы сохранить его new XElement("SegmentSize", segment), new XElement("KeySize", sessionKeySize), new XElement("EncryptedKey", Convert.ToBase64String(encryptedKey)), new XElement("IV", Convert.ToBase64String(iv)) ) ); using (StreamWriter sw = new StreamWriter(dst, false, Encoding.ASCII)) { miXML.Save(sw); sw.WriteLine(); } long xmlSize = new FileInfo(dst).Length; // сохранение заголовка var headerOffset = xmlSize; // шифрование alg = new Serpent(key, iv, true); alg.init(src, dst, cipherMode, segment, 0, headerOffset); return(alg); }
private IAlgorithm decryptFile(String src, String dst, String password) { // выполнение алгоритма // создание объекта класса algorithm (IAlgorithm) // вызов метода encrypt или decrypt с соответствующими параметрами // включая поддержку индикатора выполнения и прерывания операций IAlgorithm alg; // wczytanie nagłówka String xmlHeader = ""; using (StreamReader sr = new StreamReader(src)) { String line; while (sr.Peek() >= 0) { line = sr.ReadLine(); xmlHeader += line + "\r\n"; if (line.Equals("</EncryptedFileHeader>")) { break; } } } XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlHeader); int headerOffset = xmlHeader.Length; // чтение параметров из заголовка XmlNode node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/KeySize"); var keySize = Convert.ToInt32(node.InnerText); keySize = keySize >> 3; node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/EncryptedKey"); byte[] encryptedKey = Convert.FromBase64String(node.InnerText); // расшифровка ключа сеанса с помощью алгоритма Serpent / ECB паролем`password' var sessionKeyAlg = getSessionKeyAlg(false, password); var decryptedKey = sessionKeyAlg.encryptInMemory(encryptedKey); if (decryptedKey.Length != keySize) { var truncatedKey = new byte[keySize]; System.Buffer.BlockCopy(decryptedKey, 0, truncatedKey, 0, keySize); decryptedKey = truncatedKey; } var sessionKey = Serpent.generateKeyFromBytes(decryptedKey); // node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/IV"); byte[] iv = Convert.FromBase64String(node.InnerText); node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/SegmentSize"); var segment = Convert.ToInt32(node.InnerText); node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/CipherMode"); var cipherMode = node.InnerText; // расшифровка alg = new Serpent(sessionKey, iv, false); alg.init(src, dst, cipherMode, segment, headerOffset, 0); return(alg); }
private IAlgorithm getSessionKeyAlg(bool encryption, string password) { var SKkey = Serpent.generateKeyFromBytes(computeHash(password)); var SKiv = Serpent.generateIV(true); IAlgorithm sessionKeyAlg = new Serpent(SKkey, SKiv, encryption); sessionKeyAlg.init(null, null, "ECB", 128); return sessionKeyAlg; }
private IAlgorithm encryptFile(String src, String dst, String cipherMode, int segment, int sessionKeySize, String password) { // wykonanie algorytmu // utworzenie obiektu klasy algorithm (IAlgorithm) // wywołanie metody encrypt z odpowiednimi parametrami // w tym obsługa paska postepu i przerwania operacji IAlgorithm alg; var key = Serpent.generateKey(sessionKeySize); //var key = Serpent.generateKeyFromBytes(Convert.FromBase64String("ZgCKtGo7pgmpRw7EFHJTGQ==")); var iv = Serpent.generateIV(); // zaszyfrowanie klucza sesyjnego algorytmem Serpent/ECB hasłem `password` var sessionKeyAlg = getSessionKeyAlg(true, password); var encryptedKey = sessionKeyAlg.encryptInMemory(key.GetKey()); // utworzenie nagłówka XDocument miXML = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("EncryptedFileHeader", new XElement("Algorithm", "SERPENT"), new XElement("CipherMode", cipherMode), //new XElement("BlockSize", 128), // jest stały do nie ma potrzeby, żeby go zapisywać new XElement("SegmentSize", segment), new XElement("KeySize", sessionKeySize), new XElement("EncryptedKey", Convert.ToBase64String(encryptedKey)), new XElement("IV", Convert.ToBase64String(iv)) ) ); using (StreamWriter sw = new StreamWriter(dst, false, Encoding.ASCII)) { miXML.Save(sw); sw.WriteLine(); } long xmlSize = new FileInfo(dst).Length; // zapisanie nagłówka var headerOffset = xmlSize; // szyfrowanie alg = new Serpent(key, iv, true); alg.init(src, dst, cipherMode, segment, 0, headerOffset); return alg; }
private IAlgorithm decryptFile(String src, String dst, String password) { // wykonanie algorytmu // utworzenie obiektu klasy algorithm (IAlgorithm) // wywołanie metody encrypt lub decrypt z odpowiednimi parametrami // w tym obsługa paska postepu i przerwania operacji IAlgorithm alg; // wczytanie nagłówka String xmlHeader = ""; using (StreamReader sr = new StreamReader(src)) { String line; while (sr.Peek() >= 0) { line = sr.ReadLine(); xmlHeader += line + "\r\n"; if (line.Equals("</EncryptedFileHeader>")) { break; } } } XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlHeader); int headerOffset = xmlHeader.Length; // wyświetlenie nagłówka w GUI fileHeader.Text = xmlHeader; // odczytanie parametrów z nagłówka XmlNode node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/KeySize"); var keySize = Convert.ToInt32(node.InnerText); keySize = keySize >> 3; node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/EncryptedKey"); byte[] encryptedKey = Convert.FromBase64String(node.InnerText); // odszyfrowanie klucza sesyjnego algorytmem Serpent/ECB hasłem `password` var sessionKeyAlg = getSessionKeyAlg(false, password); var decryptedKey = sessionKeyAlg.encryptInMemory(encryptedKey); if (decryptedKey.Length != keySize) { var truncatedKey = new byte[keySize]; System.Buffer.BlockCopy(decryptedKey, 0, truncatedKey, 0, keySize); decryptedKey = truncatedKey; } var sessionKey = Serpent.generateKeyFromBytes(decryptedKey); // node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/IV"); byte[] iv = Convert.FromBase64String(node.InnerText); node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/SegmentSize"); var segment = Convert.ToInt32(node.InnerText); node = doc.DocumentElement.SelectSingleNode("/EncryptedFileHeader/CipherMode"); var cipherMode = node.InnerText; // odszyfrowywanie alg = new Serpent(sessionKey, iv, false); alg.init(src, dst, cipherMode, segment, headerOffset, 0); return alg; }