Diskuze: Hlášení postupu při šifrování

C# .NET .NET (C# a Visual Basic) Hlášení postupu při šifrování American English version English version

Avatar
n5ver
Člen
Avatar
n5ver:

Ahoj, jak mám při šifrování odeslat zprávu o postupu?

private void EncryptFile(string inputFile, string outputFile, string passwordPhrase)
{
    try
    {
        //Definice AES
        RijndaelManaged algorythm = new RijndaelManaged();
        //Nastavení modu Cypher block chaining
        algorythm.Mode = CipherMode.CBC;
        //Nastavení paddingu posledního bloku
        algorythm.Padding = PaddingMode.PKCS7;
        //Derivace bytů z hesla
        PasswordDeriveBytes password = new PasswordDeriveBytes(passwordPhrase, null);
        //Vytvoření pole z derivovaných bytů
        byte[] keyBytes = password.GetBytes(keysize / 8);

        //Vytvoření encryptoru
        ICryptoTransform encryptor = algorythm.CreateEncryptor(keyBytes, ivBytes);

        FileStream fsIn = new FileStream(inputFile, FileMode.Open);

        FileStream fsCrypt = new FileStream(outputFile, FileMode.Create);

        CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write);

        int data;
        //Šifrování
        while ((data = fsIn.ReadByte()) != -1)
        {
            cs.WriteByte((byte)data);
        }

        fsIn.Close();
        cs.Close();
        fsCrypt.Close();
        MessageBox.Show(@"Zašifrováno");
    }

    catch (Exception ex)
    {
        MessageBox.Show(@"Chyba šifrování!", @"Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void encryptButton_Click(object sender, EventArgs e)
{
    if (_jmenoSouboruNoveho != null && _jmenoSouboruVybraneho != null && _cesta != null
        && passwordTextBox.Text != "")
    {
        encryptionWorker.RunWorkerAsync();
    }

    else
    {
        MessageBox.Show(@"Nebylo vybráno vše", @"Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void encryptionWorker_DoWork(object sender, DoWorkEventArgs e)
{
    EncryptFile(_jmenoSouboruVybraneho, _cesta + @"Enc_" + _jmenoSouboruNoveho, passwordTextBox.Text);
}
 
Odpovědět  -1 30.8.2015 15:18
Avatar
coells
Redaktor
Avatar
coells:

Netuším, co znamená "odeslání zprávy o postupu", ale v šifrování máš chybu v nastavení IV.
Měl by ses držet dokumentace a doufat, že je to tam správně.

 
Nahoru Odpovědět 30.8.2015 16:25
Avatar
n5ver
Člen
Avatar
Odpovídá na coells
n5ver:

Promiň špatně zformulováno... Prostě chci získat informace o tom, kolik už se zašifrovalo a promítnou to v progress baru.

 
Nahoru Odpovědět 30.8.2015 16:28
Avatar
coells
Redaktor
Avatar
Odpovídá na n5ver
coells:

Vezmeš si celkovou délku filu a budeš si udržovat počet zapsaných bytů.

long total = FileInfo(inputFile).Length;
long written = 0;

while ((data = fsIn.ReadByte()) != -1)
{
    cs.WriteByte((byte)data);
    written++;
}

Takže (written/total) jsou procenta zapsaných bytů.
Navíc by cyklus neměl jet po jednom bytu, ale cca po 1-10kB.
Pak můžeš třeba jednom procentu hlásit postup.

 
Nahoru Odpovědět 30.8.2015 16:38
Avatar
n5ver
Člen
Avatar
Odpovídá na coells
n5ver:

To jsem zkusil, ale cyklus jede po jednom bytu a u větších souborů se aplikace sekala.

 
Nahoru Odpovědět 30.8.2015 22:34
Avatar
coells
Redaktor
Avatar
Odpovídá na n5ver
coells:

Vždyť jsem ti psal, ať uděláš cyklus po kilobytech místo bytů.
To znamená, že si vytvoříš pole bytů (třeba byte[1024]) a budeš číst a zapisovat celé pole najednou.

UI se obvykle aktualizuje po uplynutí nějakého času, například 0.2 nebo 0.5 sekundy.

Tak jako tak, je hezké si pohrát s kryptografií, ale je velká šance, že výsledné šifrování nebude bezpečné, takže nedoporučuji používat v reálu. Jak už jsem psal, teď tam máš chybu v IV, která umožní detekci zprávy, která byla zašifrovaná.

 
Nahoru Odpovědět 30.8.2015 23:25
Avatar
Odpovídá na n5ver
Michal Štěpánek:

Aby se ti aplikace nesekala, použij BackGroundWorker. Tam si můžeš ošéfovat i výstup v ProgressBaru...

Nahoru Odpovědět 31.8.2015 9:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.