IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity
Avatar
n5ver
Člen
Avatar
n5ver:30.8.2015 15:18

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
30.8.2015 15:18
Avatar
coells
Tvůrce
Avatar
coells:30.8.2015 16:25

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:30.8.2015 16:28

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
Tvůrce
Avatar
Odpovídá na n5ver
coells:30.8.2015 16:38

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:30.8.2015 22:34

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
Tvůrce
Avatar
Odpovídá na n5ver
coells:30.8.2015 23:25

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:31.8.2015 9:04

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.