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(); } } }