Cкрытие текста в bmp пример алгоритма (си шарп - C#)- стеганография (аналог шифрования в каком-то смысле)))

Имеются также примеры на PHP =)

код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Diagnostics;
//
namespace Coder
{
    public partial class Form1 : Form
    {
        FileStream fs;
        byte[] picbyte;
        byte[] byteData;

        //int[] mass_pic;
        //string mass_data;


        public Form1()
        {
            InitializeComponent();
        }

        /*загружаем файл картинки*/
        private void Pic_button_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Image File|*.bmp|All Files|*.*";
            dialog.Title = "Please select an image file.";
            //int i = 0;
            //string byte_i = "";

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                fs = new FileStream(dialog.FileName, FileMode.Open, FileAccess.Read);

                picbyte = new byte[fs.Length]; //массив байтов для картинки

                fs.Read(picbyte, 0, System.Convert.ToInt32(picbyte.Length)); // читаем в picbyte

                //mass_pic = new int[picbyte.Length]; //массив бит картинки

                //int bit = (bytedata[i] & (0x01 << j)) >> j;   // 0..7
                //picbyte[i] = ((picbyte[i] >> 1) << 1) | bit;

                //foreach (var pb in picbyte)
                //{
                //    var newpb = new BitArray(new[] { pb });
                //    foreach (bool b in newpb)
                //    {
                //        byte_i += ((bool)b) ? 1 : 0;
                //    }
                //    mass_pic[i] = Convert.ToInt32(byte_i);
                //    byte_i = "";
                //    if (i < picbyte.Length) i++;
                //}

                fs.Close();
                fs.Dispose();
            }
        }

        
        // читаем текст из файла, который мы запишем в картинку
        private void Data_button_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Text File|*.txt|All Files|*.*";
            dialog.Title = "Please select an text file.";
            //int i = 0;
            //string byte_i = "";

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                fs = new FileStream(dialog.FileName, FileMode.Open, FileAccess.Read);

                byteData = new byte[fs.Length]; //массив для текста

                fs.Read(byteData, 0, System.Convert.ToInt32(fs.Length));

                //mass_data = new string[byteData.Length]; //массив бит картинки

                //foreach (var pb in byteData)
                //{
                    
                //    var newpb = new BitArray(new[] { pb });
                //    foreach (bool b in newpb)
                //    {
                //        byte_i += ((bool)b) ? 1 : 0;
                //    }
                //    mass_data += byte_i;
                //    byte_i = "";
                //    if (i < byteData.Length) i++;
                //}

                fs.Close();
                fs.Dispose();
            }
        }

        private void Save_button_Click(object sender, EventArgs e)
        {
            Cripting();
        }

        /*функция, осуществляющая запись текста в картинку*/
        public void Cripting()
        {
            if (picbyte != null && byteData != null)
            {
                /*проверяет что число бит в картинке достататочно для записи текста ()*/
                if ((picbyte.Length-54) < (byteData.Length * 8))
                    MessageBox.Show("Шифрование не возможно, т.к. шифруемый файл превышает размер изображения!!!");
                else // если всё нормально (есть место)
                {
                    int k = 54; // 54 байта в bmp  занимает заголовок - далее мы лишь увеличиваем отступ
                    // в цилке записываем данные в картинку
                    for (int i = 0; i < byteData.Length; i++) 
                    {
                        int bit = 0;
                        for (int j = 0; j < 8; j++)
                        {
                            bit = (byteData[i] & (0x01 << j)) >> j;
                            picbyte[k] = Convert.ToByte(((picbyte[k] >> 1) << 1) | bit);
                            k++; // нарашиваем отсутп(так как мы удаляемся от начала файла)
                        }
                    }
                    // предлагает пользователю сохранить данные вместе с ишфротекстом в файл
                    SaveFileDialog dialog = new SaveFileDialog();
                    dialog.Filter = "Image File|*.bmp|All Files|*.*";
                    dialog.Title = "Please type name of image file.";
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        File.WriteAllBytes(dialog.FileName, picbyte); // пишем результат в файл
                    }
                    //int bit = (bytedata[i] & (0x01 << j)) >> j;   // 0..7
                    //picbyte[i] = ((picbyte[i] >> 1) << 1) | bit;
                }
                
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        //public void Cripting()
        //{
        //    if (mass_data != null && mass_pic != null)
        //    {
        //        if (mass_pic.Length < mass_data.Length)
        //            MessageBox.Show("Шифрование не возможно, т.к. шифруемый файл превышает размер изображения!!!");
        //        else
        //        {
        //            string[] replace_mass = new string[mass_pic.Length];
        //            byte[] out_mass = new byte[replace_mass.Length];

        //            char[] chars_data = mass_data.ToCharArray();

        //            for (int i = 0; i < mass_pic.Length; i++)
        //            {
                        
                        
        //                if (i < 60)
        //                {
        //                    replace_mass[i] = mass_pic[i].ToString();

        //                    Debug.Write(replace_mass[i]);
        //                }
        //                else
        //                {
        //                    if ((i - 60) < chars_data.Length)
        //                        replace_mass[i] = MyReplace(mass_pic[i].ToString(), mass_pic[i].ToString().Length-1, chars_data[i - 60]);
        //                    else
        //                        replace_mass[i] = mass_pic[i].ToString();
        //                }
        //            }
        //            for (int j = 0; j < replace_mass.Length; j++)
        //            {
        //                out_mass[j] = Convert.ToByte(replace_mass[j], 2);
        //            }
        //            Debug.WriteLine("");
        //            for (int k = 0; k < 60;k++)
        //                Debug.WriteLine(out_mass[k]);
        //            File.WriteAllBytes("img.bmp", out_mass);

        //            //SaveFileDialog dialog = new SaveFileDialog();
        //            //dialog.Filter = "Image Files|*.jpg;*.gif;*.bmp;*.png;*.jpeg|All Files|*.*";
        //            //dialog.Title = "Please type name of image file.";
        //            //if (dialog.ShowDialog() == DialogResult.OK)
        //            //{
        //            //    File.WriteAllBytes(dialog.FileName, out_mass);
        //            //}
        //        }
        //    }
        //    else
        //        MessageBox.Show("Файлы не выбраны!");
        //}

        //public String MyReplace(String source, int index, Char newSymb)
        //{
        //    char[] chars = source.ToCharArray();
        //    chars[index] = newSymb;
        //    return new String(chars);
        //}
    }
}

humanmashine's picture

По-моему это называется стеГАнография, в то время как стенография - это нечто иное)))

vedro-compota's picture

извиняюсь - стабильно ошибаюсь в этом слове) сейчас поправлю)

_____________
матфак вгу и остальная классика =)