Шифрование документа Word изменяет последний байт - PullRequest
0 голосов
/ 02 декабря 2018

Итак, я пытаюсь зашифровать / расшифровать текстовый документ, используя шифр Цезаря.Мой класс Цезарь работает для изображений (.png) и (.txt) документов.Однако, когда я зашифровываю документ word (.docx) и снова дешифрую этот документ word, модифицируется последний байт get.На следующем рисунке показано, что я имею в виду: enter image description here

Все байты, кроме последнего, изменены правильно.Вместо байта NUL измененный документ содержит байт SOH, который, по-видимому, является «Началом заголовка».

Это мой класс шифрования caeser, содержащий функции enciper и decipher:

        static char ciphChar(char ch, int key)
    {
        if (!char.IsLetter(ch))
        {
            return ch;
        }
        char d = char.IsUpper(ch) ? 'A' : 'a';
        return (char)((((ch + key) - d) % 26) + d);
    }

    public static string Cipher(string message, int key, bool cipherMode) 
    {
        if (cipherMode == false)
        {
            key = 26 - key;
        }
        string output = string.Empty;
        foreach (char ch in message)
            output += ciphChar(ch, key);
        return output;
    }

Функции шифрования и дешифрования также приведены ниже (шифр Caeser сдвигает сообщение на число от ключа. Так, например, если сообщение - «a», а ключ - 3, сообщение становится «d», потому что «a» смещено3 буквы в алфавите - 'd'):

        public static string Encipher(string input, int key)
    {
        return Cipher(input, key, true);
    }

    public static string Decipher(string input, int key)
    {
        return Cipher(input, key, false);
    }

Чтобы использовать функцию шифрования в документе, я конвертирую байты документа в строку, используя Convert.ToBase64String.После того, как я прочитал байты как строку, я использую свою функцию шифрования / дешифрования и преобразую строку обратно в байты, используя следующий код Convert.FromBase64String.

Мой код успешно шифрует и расшифровывает файлы .txt и .png.Однако для файлов .docx последний байт не декодируется обратно правильно. Я благодарен за любые рекомендации по решению моей проблемы, спасибо.

Редактировать 1 : Я добавил некоторый код, чтобы выможет восстановить проблему, с которой я имею дело.

  1. Создайте класс с именем caesarShift и скопируйте код из функций cesher cipher и enciper / decipher, написанных выше в моем оригинальном посте.

  2. Создайте основную форму с 3 кнопками и 1 текстовым полем.Скопируйте следующий код ниже:

        public static byte[] EncryptFile(string filePath)
    {
        byte[] fileBytes = File.ReadAllBytes(filePath);
        byte[] bytesEncrypted = Enciphe(fileBytes);
        File.WriteAllBytes(filePath, bytesEncrypted);
        return bytesEncrypted;
    }
    
    public static byte[] DecryptFile(string filePath)
    {
        byte[] fileBytes = File.ReadAllBytes(filePath);
        byte[] bytesDecrypted = Deciphe(fileBytes);
        File.WriteAllBytes(filePath, bytesDecrypted);
        return bytesDecrypted;
    }
    
    static byte[] Enciphe(byte[] file)
    {
        var fileToString = Convert.ToBase64String(file);
        string caeser;
        caeser = caesarShift.Encipher(fileToString, 3);
        file = Convert.FromBase64String(caeser); 
        return file;
    }
    
    static byte[] Deciphe(byte[] file)
    {
        var fileToString = Convert.ToBase64String(file);
        string caeser;
        caeser = caesarShift.Decipher(fileToString, 3);
        file = Convert.FromBase64String(caeser);
        return file;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.Filter = "encryptable files|*.rtf;*.docx;*.jpg;*.txt;*.png;";
        openFileDialog1.Title = "Select File";
        if (Directory.Exists(textBox1.Text))
        {
            openFileDialog1.InitialDirectory = textBox1.Text;
        }
        else
        {
            openFileDialog1.InitialDirectory = @"C:\";
        }
    
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = openFileDialog1.FileName;
        }
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
       EncryptFile(textBox1.Text);
    }
    
    private void button3_Click(object sender, EventArgs e)
    {
        DecryptFile(textBox1.Text);
    }
    
  3. Создайте документ с фиктивным словом и протестируйте функцию шифрования / дешифрования.Вы также можете проверить файлы .jpg и .txt (они работают).
...