none
не могу дешифровать после подписания файла RRS feed

  • Вопрос

  • Здравствуйте!

    Не понимаю почему не могу дешифровать подписанный файл. Просто зашифрованный файл дешифруется, но как только я в него дописываю подпись дешифровка не происходит.  Я думаю дешифрование не проходит потому что исходный файл портися. 

    Подпись файла:

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    EncryptFile = openFileDialog1.FileName;
                    FileStream fsRead = new FileStream(EncryptFile, FileMode.Open);
                    StreamReader sReader = new StreamReader(fsRead);
                    byte[] buffer = new byte[fsRead.Length];
                    byte[] hash = new byte[64];
                    try
                    {
                        fsRead.Seek(0, SeekOrigin.Begin);
                        fsRead.Read(buffer, 0, (int)fsRead.Length);
                        fsRead.Close();/**/
                        /*int nchar = sReader.Read();
                        int i = 0;
                        int len =(int)fsRead.Length ;
                        try
                        {
                            while (nchar != -1)
                            {
                                buffer[i] = (byte)nchar;
                                nchar = sReader.Read();
                                i++;
                            }
                            fsRead.Close();
                            sReader.Close();/**/
                        sReader.Close();
                       
                        hash = SHA512hash(buffer);
                        byte[] sig = CreateSignature(hash);
                        FileStream fs = new FileStream(EncryptFile, FileMode.Open);
                        try
                        {
                            fs.Seek(fs.Length+1, SeekOrigin.Begin);
                            fs.Write(sig, 0, sig.Length);
                            fs.Close();
                            MessageBox.Show("файл подписан", "Результат подписи файла");
                        }
                        catch { MessageBox.Show("Ошибка записи электронной подписи", "Результат записи электронной подписи"); }
                    }
                    catch (IOException e1)
                    {
                        MessageBox.Show(e1.Message, "MyApp");
                    }
                }           

    Дешифрование

       string EncryptFile = @"D:\EncryptFile.txt";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    EncryptFile = openFileDialog1.FileName;

                    FileStream fsRead = new FileStream(EncryptFile, FileMode.Open);          
                    CryptoStream cStream = new CryptoStream(fsRead, RijAlg.CreateDecryptor(Key, RijAlg.IV), CryptoStreamMode.Read);
                    StreamReader sReader = new StreamReader(cStream);
                    int len = (int)fsRead.Length - 129;
                    char[] buffer = new char[len];
                    byte[] data = new byte[len];
                    fsRead.Seek(0,SeekOrigin.Begin);
                    fsRead.Write(data,0,len);

                   // int i = 0;

                    try
                    {
                       /* int nchar = sReader.Read();
                        buffer[i] = Convert.ToChar(nchar);
                        nchar = sReader.Read();
                        richTextBox1.Text += buffer[i];/**/
                        sReader.ReadBlock(System.Text.Encoding.ASCII.GetString(data).ToCharArray(), 0, len);
                       /* while (i != len)
                        {
                            buffer[i] = Convert.ToChar(nchar);
                            nchar = sReader.Read();
                            richTextBox1.Text += buffer[i];
                            i++;
                        }/**/
                        fsRead.Close();
                        //fsWrite.Close();
                        sReader.Close();
                        MessageBox.Show("Дешифрование завершено", "Результат дешифрования");
                    }
                    catch (IOException e1)
                    {
                        MessageBox.Show(e1.Message, "MyApp");
                    }
                }

     

    Как правильно сделать, чтобы все работало?

    24 апреля 2010 г. 10:32

Все ответы

  • Задам вопрос по другому: Есть 2 файла - 1 с зашифрованными данными, 2 с ЭЦП. Когда дописываю в первый файл ЭЦП данные портятся.

    Вопрос почему ? Как этого избежать?

     

  • А зачем при дешифровке затирать данные в файле пустым массивом?

            int len = (int)fsRead.Length - 129;
            char[] buffer = new char[len];
            byte[] data = new byte[len]; - массив с нулями
            fsRead.Seek(0,SeekOrigin.Begin);
            fsRead.Write(data,0,len); - запись его в исходный файл

  • Не надо этого. Извиняюсь перепутал Write с Read.

    Но проблема не в дешифровке. Когда в конец файла дописываю ЭЦП то данные все портятся.

    if

     

    (openFileDialog1.ShowDialog() == DialogResult.OK)

    {

    EncryptFile = openFileDialog1.FileName;

     

    FileStream fsRead = new FileStream(EncryptFile, FileMode.Open);

     

    StreamReader sReader = new StreamReader(fsRead);

     

    byte[] buffer = new byte[64];

     

    //char[] buffer = new char[fsRead.Length];

     

    byte[] hash = new byte[64];

     

    try

    {

     

    int nchar = sReader.Read();

     

    int i = 0;

     

    try

    {

     

    while (i != 64)

    {

    buffer[i] = (

    byte)nchar;

    nchar = sReader.Read();

    i++;

    }

    fsRead.Close();

    sReader.Close();

    /**/

    hash = SHA512hash(buffer);

     

    byte[] sig = CreateSignature(hash);

     

    FileStream fs = new FileStream(EncryptFile, FileMode.Open);

     

    try

    {

    fs.Seek(fs.Length + 1,

    SeekOrigin.Begin);

    fs.Write(sig, 0, sig.Length);

    fs.Close();

    }

     

    catch

    {

     

    MessageBox.Show(" ", " ");

    }

    /**/

    }

     

    catch (IOException e1)

    {

     

    MessageBox.Show(e1.Message, "MyApp");

    }

    }

  • Это код "портит" данные? Как именно портит? Они остаются точно такими же, но выглядят плохо? :)

    Собрал его, запустил - он просто дописывает (sig.Length + 1) байт в конец файла.

    И зачем эти try/catch/MessageBox('','') по коду?

  • Я думаю, что он, потому что когда я дописываю ЭЦП в конец файла, то потом дешифровать нельзя исключение возникает. Тогда я записал ЭЦП в другой файл(отдельно от зашифрованного) и дешифрование прошло. Еще пробовал просто записывать данные не шифруя, но подписывая. После дописывания ЭЦП вместо текста(он на русском данные из БД) абракадабра.   

    (sig.Lenght+1) - это я ставлю указатель в файле чтобы данные и ЭЦП были раздельно

    try catch - чтобы исключения ловить поидее но пока это не стольважная задача как дешифровка после подписывания.

    Спасибо, что помогаете.

  • Раздели в коде, с выводом промежуточных реультатов в отдельные файлы:

    1. Шифрование

    2. Подписывание

    3. Добавление подписи в зашифрованный файл

    4. Вырезание подписи из зашифрованного и подписанного файла

    5. Проверку подписи

    6. Расшифровку

    Скорее всего ты где-то на 3 или на 4-ом пункте пишешь подпись поверх данных (как было выше с write). Например, sig.Lenght+1 уже добавляет лишний байт между данными и подписью, который потом расшифруется в абракадабру.

  • Все пункты вроде сделал: шифрование, создание подписи и запись ее в отдельный файл, в зашифр. файл, даже проверка подписи проходит.

    При дешифровании файла с подпись вылетает исключение

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    EncryptFile = openFileDialog1.FileName;
    using (FileStream fsRead = new FileStream(EncryptFile, FileMode.Open))//;
    { 
    CryptoStream cStream = new CryptoStream(fsRead, RijAlg.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
    StreamReader sReader = new StreamReader(cStream,Encoding.Unicode);
    int len = (int)fsRead.Length - 128;
    char[] buffer = new char[len];
    int nchar = sReader.Read(); // воздесь происходит исключение
    int i = 0;
    try
    { // 
    while (i != len)
    {
    buffer[i] = Convert.ToChar(nchar);
    nchar = sReader.Read();
    richTextBox1.Text += buffer[i];
    i++;
    }
    fsRead.Close();
    sReader.Close();
    MessageBox.Show(" ", " ");
    }
    catch (IOException e1)
    {
    MessageBox.Show(e1.Message, "MyApp");
    }

     

     

    Не полный текст исключения:

    System.Security.Cryptography.CryptographicException не обработано
      Message="Заполнение неверно и не может быть удалено."
      Source="mscorlib"
      StackTrace:
           в System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
           в System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
           в System.Security.Cryptography.CryptoStream.Read(Byte[] buffer, Int32 offset, Int32 count)
           в System.IO.StreamReader.ReadBuffer()
           в System.IO.StreamReader.Read()
           в ProjectForDiplom.Form1.button4_Click(Object sender, EventArgs e) в D:\мои файлы\Project For Diplom\ProjectForDiplom\ProjectForDiplom\Form1.cs:строка 285
          

    Добавляю подпись так

     

    FileStream fs = new FileStream(EncryptFile, FileMode.Open);
    try
    {
    fs.Seek(fs.Length, SeekOrigin.Begin);
    fs.Write(sig, 0, sig.Length);
    fs.Close();
    MessageBox.Show(" ", " ");
    richTextBox1.Text = File.ReadAllText(EncryptFile);
    }
    catch
    {
    MessageBox.Show(" ", " ");
    }/**/