Giới thiệu về chương trình demo

Một phần của tài liệu Đề tài Ứng dụng ẩn mã và giấu tin trong ảnh (Trang 40)

4.3.1. Giới thiệu ngôn ngữ sử dụng

Ngôn ngữ được sử dụng để cài đặt là C#.NET một ngôn ngữ mới và mạnh trong thời điểm hiện này. Với ngôn ngữ này hỗ trợ rất nhiều

trong việc cài đặt chương trình, đặc biệt với việc xử lý (trích và thay thế) các LSB bit.

4.3.2. Mã nguồn chương trình

Chương trình được viết với giao diện được xây dựng trên nền WinForm của ngôn ngữ lập trình C#.NET

Nội dung chi tiết từng file StreamProcess.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace EmbedData { class StreamProcess {

public static void Encode(Stream inStream, byte[] message, Stream outStream) { int byteRead; byte byteWrite; int i = 0; int j = 0; byte bit;

while ((byteRead = inStream.ReadByte()) != -1) {

if (i < message.Length) {

bit = BitProcess.Extract(message[i], j++);

BitProcess.Replace(ref byteWrite, 0, bit);

if (j == 8) { j = 0; i++; } }

outStream.WriteByte(byteWrite); }

}

publicstatic byte[] Decode(Stream stream, int length) {

byte[] hidden = newbyte[length]; int i = 0;

int j = 0; byte bit; int byteRead;

while ((byteRead = stream.ReadByte()) != -1) {

bit = BitProcess.Extract((byte)byteRead, 0); BitProcess.Replace(ref hidden[i], j++, bit); if (j == 8) { j = 0; i++; }

if (i == length) break; }

return hidden; }

}

publicclass FileStreamProcess {

publicstatic byte[] StreamFile(string filename) {

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);

// Create a byte array of file stream length

byte[] ImageData = newbyte[fs.Length];

//Read block of bytes from stream into the byte array

fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length)); //Close the File Stream

fs.Close();

return ImageData; //return the byte data

}

publicstatic void Save(byte[] Bytes, string filesave) {

using (System.IO.Stream s = System.IO.File.Create(filesave)) {

s.Write(Bytes, 0, Bytes.Length); }

} } } 4.4. Chương trình demo

Phần 1 : Giấu đoạn text dữ liệu vào trong file ảnh bitmap

Hình 4.5: Ảnh gốc

Bước 1 : Giấu thông tin

Hình 4.6: Nhập thông tin muốn giấu vào ảnh

Lấy thông điệp ở đây là Nguyen Duy Thang At3b Chọn nơi chứa ảnh mới (ở đây là file Apple.bmp )

Hình 4.7: Dữ liệu được giấu trong ảnh thành công

Click Button Giấu thông tin Ta được file Apple giau tin.bmp

Hình 4.8: 2 Ảnh mới sinh ra và ảnh gốc không có sự khác biệt

Ta có thể thấy Apple giau tin.bmp sau khi được giấu thông tin không khác gì ảnh gốc Apple.bmp

Bước 2 : Lấy Dữ liệu ra khỏi ảnh

Từ file Apple giau tin.bmp ta lấy được phần trước ta sẽ tiền hành lấy thông tin đã được dấu

Từ chương trình chuyển sang tab : Lấy thông tin và chọn file Apple giau tin.bmp

Hình 4.9: Giao diện phần lấy thông tin

Click button Lấy Thông tin để lấy được dữ liệu đã dấu trong Apple giau tin.bmp

Hình 4.10: Lấy thông tin

Như ta đã thấy dữ liệu được lấy ra chính là đoạn text ta đã giấu vào Apple.bmp : Nguyen Duy Thang At3b

Phần 2 : Giấu 1 file dữ liệu vào trong file ảnh bitmap

Cũng như phần trước lấy một bức ảnh bitmap 24 bit : Anh.bmp trước khi giấu thông tin:

Hình 4.11: ảnh gốc

Ta có 1 file ảnhicon.jpg

Hình 4.12: File dữ liệu muốn giấu

Ta sẽ tiến hành giấu ảnh icon.jpg vào trong file Apple.bmp

Bước 1 : Giấu thông tin

Chạy chương trình , chọn tab Giấu File Ta lần lượt chọn

File ảnh gốc : Apple.bmp File cần giấu : icon.jpg

Click Button Giấu thông tin Ta được file Apple giau icon.bmp

Hình 4.15: Giấu file vào trong ảnh

Ta có thể thấy file mới sinh ra Apple giau icon.bmp không khác gì file gốc Apple.bmp

Bước 2 : Lấy tin

Từ file Anh3.bmpta lấy được phần trước ta sẽ tiền hành lấy thông tin đã được dấu

Từ chương trình chuyển sang tab : Lấy file và chọn file Applegiau icon.bmp

Hình 4.17: Lấy file từ ảnh được sinh ra

Hình 4.18: Lấy file

Sau khi click button Lấy File ta thấy sẽ sinh được file mới icon1.jpg

Ta có thể nhận thấy File mới được sinh ra là icon.jpg không khác so với file ban đầu là icon1.jpg

Hình 4.20: Không nhận thấy sự khác nhau giữa 2 hình

KẾT LUẬN 1. Đánh giá

Sau một khoảng thời gian nỗ lực nghiên cứu cùng với sự hướng dẫn tận tình của thầy giáo em đã bản hoàn thành được các yêu cầu đề tài. Đó là giấu

được thông tin vào trong một file ảnh và lấy thông tin từ các file ảnh có ẩn chứa thông tin trong đó. Các thông tin được giấu là một đoạn thông điệp, một file ảnh cũng có thể được giấu trong một file ảnh.

2. Phát triển và hạn chế của đề tài

Chương trình đã làm được những công việc trên và hướng của em mong muốn đó là nhúng vào một phần mềm có sẵn để bảo vệ bản quyền cho một sản phẩm nào đó. Hy vọng em sẽ được các thầy, cô chỉ bảo để phát triển thành một phần mềm thiết thực hơn nữa. Em xin chân thành cảm ơn!

TÀI LIỆU THAM KHẢO

1. Giấu tin trong dữ liệu đa phương tiện , một công nghệ mới trong bảo mật thông tin – Trần Quốc

2. Dùng Kỹ thuật giấu tin trong ảnh sử dụng các bit LSB – Thạc sỹ Lương Đức Hải.

3. Keeping secrets secrest : Steganography with .NET – www.devx.com 4. Techiniques for data hiding – W.Bender – D.Gruhl – N.Morimoto – A.Lu 5. Trang web www.wikipedia.com

6. Andersen, R.J., Petitcolas, F.A.P., On the limits of steganography. IEEE Journal of Selected Areas in Communications, Special Issue on Copyright and Privacy Protection 16 No.4 (1998) 474-481.

7.Balasubramanian, R., Bouman, C.A., Allebach, J.P.: Sequential Scalar Quantization of Color Images. Journal of Electronic Imaging 3 No.1 (1994) 45-

59.ckW.:StegoDos.ftp://ftp.csua.berkeley.edu/pub/cypherpunks/steganograph y/ stegodos.zip

8. Các nguồn khác trên internet

PHỤ LỤC Mã nguồn chương trình đầy đủ

Nội dung chi tiết StreamProcess.cs

using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace EmbedData { class StreamProcess {

public static void Encode(Stream inStream, byte[] message, Stream outStream) { int byteRead; byte byteWrite; int i = 0; int j = 0; byte bit;

while ((byteRead = inStream.ReadByte()) != -1) {

byteWrite = (byte)byteRead; if (i < message.Length) {

bit = BitProcess.Extract(message[i], j++);

if (j == 8) { j = 0; i++; } }

outStream.WriteByte(byteWrite); }

}

publicstatic byte[] Decode(Stream stream, int length) {

byte[] hidden = newbyte[length]; int i = 0;

int j = 0; byte bit; int byteRead;

while ((byteRead = stream.ReadByte()) != -1) {

bit = BitProcess.Extract((byte)byteRead, 0); BitProcess.Replace(ref hidden[i], j++, bit); if (j == 8) { j = 0; i++; } if (i == length) break; } return hidden; } }

publicclass FileStreamProcess {

publicstatic byte[] StreamFile(string filename) {

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);

// Create a byte array of file stream length

byte[] ImageData = newbyte[fs.Length];

//Read block of bytes from stream into the byte array

fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length)); //Close the File Stream

fs.Close();

return ImageData; //return the byte data

}

publicstatic void Save(byte[] Bytes, string filesave) {

using (System.IO.Stream s = System.IO.File.Create(filesave)) { s.Write(Bytes, 0, Bytes.Length); } } } } BitProcess.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EmbedData { class BitProcess { //Thay The

publicstatic void Replace(ref byte b, int pos, byte value) {

b = (byte)(value == 1 ? b | (1 << pos) : b & ~(1 << pos)); }

//Lay Gia tri

publicstatic byte Extract(byte b, int pos) {

return (byte)((b & (1 << pos)) >> pos); } } } Code.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace EmbedData

{

class Code {

public static void CreateFile(string fileName, string stegoFileName,

string message) {

FileStream inStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

int offset = 54; //So bit cua Header + Info trong file bmp

byte[] header = new byte[offset]; inStream.Seek(0, 0);

// Doc header tu inStream

inStream.Read(header, 0, offset);

FileStream outStream = new FileStream(stegoFileName, FileMode.Create, FileAccess.Write);

//Ghi phan header cua inStream trong outStream

outStream.Write(header, 0, offset);

UnicodeEncoding unicode = new UnicodeEncoding(); // Them header + info cua Image vao Message

byte[] messageBytes = AddHeadMessage(unicode.GetBytes(message));

inStream.Seek(offset, 0); // Thay the bit

StreamProcess.Encode(inStream, messageBytes, outStream); inStream.Close();

outStream.Close(); }

privatestatic byte[] AddHeadMessage(byte[] messageBytes) {

int len = messageBytes.Length;

byte[] bLen = BitConverter.GetBytes(len); byte[] ret = newbyte[len + bLen.Length]; for (int i = 0; i < bLen.Length; i++)

ret[i] = bLen[i];

for (int i = 0; i < messageBytes.Length; i++) ret[i + bLen.Length] = messageBytes[i]; return ret;

}

publicstatic string ExtractHiddenMessage(string fileName) {

Stream inStream = new (fileName, FileMode.Open, FileAccess.Read); FileStream

int offset = 54;

inStream.Seek(offset, 0);

da giau)

byte[] bLen = StreamProcess.Decode(inStream, 4);

//Do dai cua message

int len = BitConverter.ToInt32(bLen, 0);

inStream.Seek(offset + 4 * 8, 0); // Lay message

byte[] buffer;

buffer = StreamProcess.Decode(inStream, len);

UnicodeEncoding unicode = new UnicodeEncoding(); string hiddenMessage = unicode.GetString(buffer); inStream.Close();

return hiddenMessage; }

publicstatic void ExtractFileHidden(string fileName,string filehidden) {

Stream inStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

inStream.Seek(offset, 0);

// Lay 4 bytes trong inStream (4 byte nay chua header cua message da giau)

byte[] bLen = StreamProcess.Decode(inStream, 4);

//Do dai cua message

int len = BitConverter.ToInt32(bLen, 0);

inStream.Seek(offset + 4 * 8, 0); // Lay message

byte[] buffer;

buffer = StreamProcess.Decode(inStream, len); FileStreamProcess.Save(buffer, filehidden); inStream.Close();

}

public static void CreatedFileinFile(string fileName, string

stegoFileName, string filehidden) {

FileStream inStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

int offset = 54; //So bit cua Header + Info trong file bmp

byte[] header = new byte[offset]; inStream.Seek(0, 0);

// Doc header tu inStream

inStream.Read(header, 0, offset);

FileStream outStream = new FileStream(stegoFileName, FileMode.Create, FileAccess.Write);

//Ghi phan header cua inStream trong outStream

outStream.Write(header, 0, offset);

UnicodeEncoding unicode = new UnicodeEncoding(); // Them header + info cua Image vao Message

byte[] messageBytes = AddHeadMessage(FileStreamProcess.StreamFile(filehidden));

inStream.Seek(offset, 0); // Thay the bit

StreamProcess.Encode(inStream, messageBytes, outStream); inStream.Close(); outStream.Close(); } } }

Một phần của tài liệu Đề tài Ứng dụng ẩn mã và giấu tin trong ảnh (Trang 40)

Tải bản đầy đủ (DOC)

(66 trang)
w