Cкрытие текста в bmp пример алгоритма (си шарп - C#)- стеганография (аналог шифрования в каком-то смысле)))
Primary tabs
Forums:
Имеются также примеры на 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); //} } }
- Log in to post comments
- 11820 reads
humanmashine
Mon, 04/08/2013 - 20:40
Permalink
Немного о терминах
По-моему это называется стеГАнография, в то время как стенография - это нечто иное)))
vedro-compota
Mon, 04/08/2013 - 20:43
Permalink
извиняюсь - стабильно
извиняюсь - стабильно ошибаюсь в этом слове) сейчас поправлю)
_____________
матфак вгу и остальная классика =)