Beispiel #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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
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);
        }
Beispiel #4
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;
        }
Beispiel #5
0
        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;
        }
Beispiel #6
0
        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;
        }