Итак, я пытаюсь зашифровать / расшифровать текстовый документ, используя шифр Цезаря.Мой класс Цезарь работает для изображений (.png) и (.txt) документов.Однако, когда я зашифровываю документ word (.docx) и снова дешифрую этот документ word, модифицируется последний байт get.На следующем рисунке показано, что я имею в виду:
Все байты, кроме последнего, изменены правильно.Вместо байта 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 : Я добавил некоторый код, чтобы выможет восстановить проблему, с которой я имею дело.
Создайте класс с именем caesarShift и скопируйте код из функций cesher cipher и enciper / decipher, написанных выше в моем оригинальном посте.
Создайте основную форму с 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);
}
- Создайте документ с фиктивным словом и протестируйте функцию шифрования / дешифрования.Вы также можете проверить файлы .jpg и .txt (они работают).