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
- 12802 reads
humanmashine
Mon, 04/08/2013 - 20:40
Permalink
Немного о терминах
По-моему это называется стеГАнография, в то время как стенография - это нечто иное)))
vedro-compota
Mon, 04/08/2013 - 20:43
Permalink
извиняюсь - стабильно
извиняюсь - стабильно ошибаюсь в этом слове) сейчас поправлю)
_____________
матфак вгу и остальная классика =)