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