2015-12-14 2 views
0

Мне нужно выполнить скрытие данных в зашифрованном изображении. Чтобы скрыть данные, мне нужно иметь растровое изображение. Но я не знаю, как сохранить изображение в виде растрового изображения.Открыть зашифрованное изображение в виде растрового изображения C#

Ниже приведен мой код шифрования.

public void EncryptFile(string source, string destination) 
{ 
    string sKey = "super545"; 
    FileStream fsInput = new FileStream(source, FileMode.Open, FileAccess.Read); 

    FileStream fsEncrypted = new FileStream(destination, FileMode.Create, FileAccess.Write); 

    DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
    ICryptoTransform desencrypt = DES.CreateEncryptor(); 
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write); 
    byte[] bytearrayinput = new byte[fsInput.Length - 1]; 

    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 
    cryptostream.Close(); 
    fsInput.Close(); 
    fsEncrypted.Close(); 
} 

Это называется как:

EncryptFile(originalimage, output); 

output переменная строка с пути, чтобы сохранить зашифрованный файл.

Как я могу вызвать функцию для запуска шифрования?

Я получаю ошибку параметр является недействительным, когда я ударил эту строку:

Bitmap bitmap3 = new Bitmap(output); 
+1

Он появляется код шифрование всего файла растрового изображения, а не данных, содержащихся внутри. Вот почему он терпит неудачу, вы зашифровали формат файла и не понимаете, что это такое. –

+0

Я попытался исключить заголовки: - byte [] bytearrayinput = новый байт [fsInput.Length - 54]; все еще не может открыть изображение. – Abby

+1

есть несколько вещей, которые я хотел бы указать здесь ... за исключением заголовков СЛЕДУЕТ означать: скопируйте их в выходной файл БЕЗ их шифрования ... не только на 54 байт меньше от входного файла ... 54 байт может быть размер заголовка, но, возможно, вы также захотите оставить цветные таблицы/цветные маски неповрежденными ... и, конечно же, все это будет работать только с несжатыми растровыми изображениями, поэтому вам может потребоваться проверить, является ли поле заголовка biCompression равным 0 или 3 ... если нет, отклоните изображение или сначала распакуйте его ... – DarkSquirrel42

ответ

2

Я предполагаю, что вы пытаетесь сделать, это довольно близко к этому:

public void EncryptFile(string source, string destination) 
{ 
    string sKey = "super545"; 
    FileStream fsInput = new FileStream(source, FileMode.Open, FileAccess.Read); 

    FileStream fsEncrypted = new FileStream(destination, FileMode.Create, FileAccess.Write); 

    //Consider to use something else, DES is dead 
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 

    //use some key derivation function like pbkdf2 instead 
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 

    //should be random, may be fixed ONLY for testing purposes 
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 

    ICryptoTransform desencrypt = DES.CreateEncryptor(); 
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write); 

    //byte[] bytearrayinput = new byte[fsInput.Length - 1]; // what do you need that big buffer for anyways? 
    //fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 
    //cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 

    byte[] headerBuffer = new byte[54]; // buffer for our bmp header ... without any color tables or masks 

    //No need for lots of checks in a proof of concept 
    fsInput.Read(headerBuffer, 0, headerBuffer.Length); 
    var biCompression = BitConverter.ToInt32(headerBuffer, 30); //get biComp from header 

    if (biCompression != 0 && biCompression != 3) 
    { 
     throw new Exception("Compression is not in the correct format"); 
    } 

    //The buffer is copied without any encryption 
    fsEncrypted.Write(headerBuffer, 0, headerBuffer.Length); 

    //copy the rest and encrypt it ... don't care about color tables and masks for now 
    //and let's just hope plaintext and ciphertext have the right size 
    fsInput.CopyTo(cryptostream); 

    cryptostream.Close(); 
    fsInput.Close(); 
    fsEncrypted.Close(); 
} 
+1

Рассмотрите возможность использования 'using' для объектов, которые реализуют' IDisposable', то есть 'stream', чтобы убедиться, что они закрыты и расположены правильно. Это также лучшая практика и так хорошо продвигать. – TheLethalCoder

+0

Привет большое спасибо. Я решил свою проблему. Код работает :) Я проанализирую ваш код и узнаю оттуда. – Abby

+0

@ TheLethalCoder - это PoC и должен быть как можно ближе к коду Абби ... если мы начнем применять правила кодирования здесь, тогда как 80% изменений будут касаться чего угодно, кроме вопроса Эбби ... достаточно, чтобы вы отредактировали забавный материал ... ;-( – DarkSquirrel42

Смежные вопросы