示例#1
0
        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);
        }
示例#2
0
        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);
        }