Bài toỏn giấu tin trong ảnh màu

Một phần của tài liệu Một số phương pháp giấu tin trong tài liệu số hóa (Trang 60)

Bài toỏn giấu tin trong ảnh màu được thiết kế và cài đặt với mục đớch thể hiện thuật toỏn giấu tin trong ảnh màu. Trong bài này chỳng ta sẽ nghiờn cứu bài toỏn giấu tin trong ảnh bitmap 24bit

Input:

- Ảnh gốc: Là ảnh dựng để chứa nội dung thụng điệp muốn giấu - Thụng điệp: Là đoạn văn bản muốn truyền tải

- Mật khẩu: Được xem như là khúa bớ mật giữa người gửi và người nhận, được dựng để trỏnh sự tấn cụng của kẻ địch

Output:

- Ảnh mang: Là ảnh cú chứa nội dung thụng điệp

Sơ lược về ảnh bitmap: Ảnh bitmap được lưu trữ dưới dạng ảnh nhị phõn. Một tệp dạng bitmap được chia thành cỏc thành phần cơ bản sau:

- Phần tiờu đề tệp (Bitmap header):Mụ tả thụng tin chung về tệp định dạng

bitmap, độ lớn của phần này cố định với mọi tệp bitmap

- Thụng tin về ảnh (Bitmap Infor):Mụ tả thụng tin về ảnh được lưu trữ, độ lớn

của phần này cố định

- Bảng màu (Palette table):Bảng màu của ảnh bitmap, độ lớn của phần này cú

thể bằng khụng ( khụng cú bảng màu) đối với ảnh đen trắng và ảnh màu cú số lượng màu lớn hơn 256 màu

- Vựng dữ liệu (Data):Thụng tin về từng điểm ảnh , độ lớn của phần này phụ

thuộc vào kich thước ảnh. Phần Data lưu trữ ảnh theo hướng từ dưới lờn trờn và từ trỏi qua phải

Thứ tự được lưu trữ trong bộ nhớ như sau: Bitmap header  Bitmap Infor Palette table Data.

Cấu trỳc của file ảnh BMP:File này là file nhị phõn, được phõn chia thành 4 phần. Bao gồm File Header, Image Header, Color Table, và cuối cựng là Pixel Data.

* FileHeader: (14 BYTE) cú chức năng chớnh:

- Xỏc định đõy cú phải là file BMP hay khụng (2 byte đầu tiờn) - Độ lớn của file ảnh (4 byte tiếp theo)

- Xỏc đinh vị trớ của dữ liệu ảnh

Tờn trƣờng Kớch thƣớc (byte) Miờu tả

Type 2 Là 2 kớ tự „B‟ và „M‟

Size 4 Kớch thước của file

Reserved 1 2

Khụng được sử dụng, phải cú giỏ trị là 0.

Reserved 2 2

OffBits 4 Vị trớ bắt đầu phần The Pixel Data

Bảng 3.1. Cấu trỳc FileHeader của ảnh Bipmap

* ImageHeader (40 BYTE): Chức năng chớnh là đưa ra thụng tin chi tiết về ảnh và định dạng dữ liệu như:

- Chiều rộng và chiều cao của ảnh

- Bao nhiờu bit được sử dụng cho 1 pixel - Dữ liệu ảnh cú được nộn hay khụng. (adsbygoogle = window.adsbygoogle || []).push({});

Tờn trƣờng Kớch thƣớc (byte) Miờu tả

Size 4 Kớch thước phần Header, phải nhỏ hơn 40.

Width 4 Chiều rộng file theo Pixel

Height 4 Chiều cao file theo Pixel

Planes 2 Phải là 1

BitCount 2 Số bit trờn 1 Pixel : 1, 2, 4, 8, 16, 24, hoặc 32. Compression 4 Kiểu nộn (0 = Khụng được nộn)

SizeImage 4 Kớch thước ảnh, phải là 0 đối với ảnh khụng được nộn

XPelsPerMeter 4 Uu tiờn độ phõn giải pixels/ meter YPelsPerMeter 4 Uu tiờn độ phõn giải pixels/ meter

ClrUsed 4 Số màu Map được sử dụng thực sự

ClrImportant 4 Số mày cú ý nghĩa

ColorTables: Tiếp theo là Palette màu của BMP, gồm nhiều bộ cú kớch thước 4 byte xếp liền nhau theo cấu trỳc Blue-Green-Red và một Byte dành riờng cho Itensity. Kớch thước của vựng Palette màu bằng 4 x số màu của ảnh. Nếu số bits màu của ảnh (byte 15- 16 của Info là 24 hoặc 32 thỡ khụng cú vựng Palette). Vỡ Palette màu của màn hỡnh cú cấu tạo theo thứ tự Red-Green-Blue nờn khi đọc Palette màu của ảnh BMP vào ta phải chuyển đổi lại cho phự hợp. Số màu của ảnh được biết dự trờn số Bits cho 1 pixel cụ thể là:

- Nếu là ảnh 24 bit, thỡ ColorTable khụng được biểu diễn.

- Nếu là ảnh 8 bit thỡ ColorTable chứa 256 “entries” với mỗi “entry” chứa 4 byte của dữ liệu. 3 byte đầu tiờn là giỏ trị cường độ màu Blue, Green, Red. Byte cuối cựng khụng được sử dụng và phải bằng zero.

The Pixel Data: Với ảnh 8 bit, mỗi pixel được biểu diễn bởi 1 byte đơn của dữ liệu.Với ảnh 24 bit, mỗi pixel được biểu diễn bởi 3 byte tuần tự của dữ liệu.

3.3 Thiết kế và cài đặt chương trỡnh giấu tin trong ảnh màu trờn Visual Basic.NET 3.3.1 Thiết kế cỏc chức năng của chƣơng trỡnh

Hỡnh 3.1. Cỏc chức năng chớnh của chương trỡnh

3.3.2 Cài đặt chức năng giấu thụng tin trong ảnh

Xõy dựng Module ModGlobal: bao gồm hàm kiểm tra đõy cú phải ảnh BMP hay khụng và thủ tục zoomOut để phúng to ảnh,1 hàm kiểm tra độ sõu màu (hay núi cỏch khỏc là kiểm tra ảnh 1, 2,4,8 bit).

PublicFunction CheckBMP(ByVal inStream As FileStream) AsBoolean

Dim char1 AsChar

Giấu thụng điệp Chương trỡnh giấu thụng tin trong ảnh Giấu thụng tin Lấy thụng tin

Giấu File văn bản Giấu File ảnh

Lấythụng điệp Lấy File văn bản Lấy File ảnh

Dim char2 AsChar

char1 = Chr(inStream.ReadByte()) char2 = Chr(inStream.ReadByte)

If char1 = "B"And char2 = "M"Then ReturnTrue

Else ReturnFalse EndIf EndFunction

PublicSub zoomOut(ByVal objPic As PictureBox)

Dim obj As Form = New Form() obj.Height = 600

obj.Width = 600 obj.Text = "Zoom out" (adsbygoogle = window.adsbygoogle || []).push({});

obj.StartPosition = FormStartPosition.WindowsDefaultBounds

Dim objPicBox AsNew PictureBox obj.Controls.Add(objPicBox) objPicBox.SizeMode = PictureBoxSizeMode.StretchImage objPicBox.Dock = DockStyle.Fill objPicBox.Image = objPic.Image obj.Show() EndSub

PublicFunction ktDoSauMau(ByVal fileName AsString) AsBoolean

Dim inStream As FileStream = New FileStream(fileName, FileMode.Open, FileAccess.Read)

Dim b AsByte

inStream.Seek(28, SeekOrigin.Begin) b = inStream.ReadByte()

'MsgBox(b)

If (b = 1) Or (b = 2) Or (b = 4) Or (b = 8) Then

If (MessageBox.Show("Ảnh cú độ sõu màu quỏ nhỏ, chất lượng ảnh sau khi giấu kộm."& vbCrLf &"Bạn nờn chọn ảnh khỏc !", "Thụng bỏo", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning)) = DialogResult.OK Then ReturnFalse Else ReturnTrue EndIf Else ReturnTrue EndIf EndFunction

Xõy dựng một số lớp giải quyết vấn đề:

- Lớp clsBIT:Bao gồm hàm lấy ra 1 bit trong byteRead tại vị trớ xỏc định.Và thủ tục thay thế giỏ trị của bit LSB trong 1 byte ảnh.

'Bao gồm 2 phương thức tĩnh Extract và Replace 'Hàm lấy ra 1 bit trong byteRead tại vị trớ xỏc định.

'Toỏn tử << là phộp dịch bit sang trỏi, (x << y): gt trả ra x*2^y 'Toỏn tử >> là phộp dịch bit sang phải,(x >> y): gt trả ra x div 2^y

Public Shared Function Extract(ByVal b As Byte, ByVal pos As Integer) As Byte Return CByte(b And (1 << pos)) >> pos

End Function

'Thủ tục thay thế giỏ trị của bit LSB trong 1 byte ảnh.

Public Shared Sub Replace(ByRef b As Byte, ByVal pos As Integer, ByVal value As Byte) If value = 1 Then

b = CByte(b Or (1 << pos)) Else

b = CByte(b And (Not (1 << pos))) End If

End Sub

Lớp clsLSB: Cú một thủ tục “hideMess” thay thế bit ớt quan trọng trong từng byte của file ảnh bằng từng bit của message cần giấu

Begin

- Input: InputStream, mess, i=0, j=0 - i là chỉ số của mảng byte hiddenMessage - j là chỉ số của từng bit trong hiddenMessage(i) - While chưa đọc hết file ảnh

. ByteĐọc=InStream.ReadByte

. If chưa đọc hết kớ tự trong hidemess then

*Lấy ra bit ở vị trớ thứ j của Hidemess(i). Bit=Extract(Hidemess(i),j)

*Tăng j lờn 1: j=j+1

*Thay thế Bit vừa lấy ra ở trờn với bit tại vị trớ 0 của ByteĐọc Replace(ByteĐọc,0,Bit)

*Nếu ẩn hết cỏc bit của 1 kớ tự trong mess tức là j=7 thỡ khởi tạo lại j=0 và i=i+1 tức là ẩn kớ tự tiếp theo End if

. Ghi ByteĐọc vừa được thay thế vào 1 luồng mới outputStrea Loop (adsbygoogle = window.adsbygoogle || []).push({});

output: outputStream End

Hỡnh 3.2: Lưu đồ thuật toỏn giấu tin

Một thủ tục ẩn thụng tin vào file ảnh: thay thế LSB với đầu vào là 1 luồng để dọc cỏc byte ảnh và mảng byte của HiddenMessage. Đầu ra sẽ là luồng output mới chứa HiddenMessage trong file ảnh.Trong thủ tục này ta chỉ thao tỏc với cỏc bit dữ liệu của thụng điệp với cỏc bit của phần Data Pixel trong file ảnh:

'Thủ tục thay thế bit ớt quan trọng trong từng byte của File ảnh bằng từng bit của message cần giấu 'Input: 1 luồng để đọc cỏc byte ảnh và 1 mảng byte của HiddenMessage.

'Output: 1 luồng chứa HiddenMessage trong file ảnh.

PublicSubhideMess(ByVal inStream As FileStream, ByVal hideMess AsByte(), ByVal outStream As FileStream)

Dim byteRead AsByte

Dim i AsInteger = 0 „i là chỉ số của mảng byte hiddenMessage

Dim j AsInteger = 0 'j là chỉ số của từng bit trong hiddenMessage(i)

Dim bit AsByte

Dim len AsLong = inStream.Length

DoWhile inStream.Position <> len byteRead = inStream.ReadByte

If i < hideMess.Length Then

'Lấy ra bit ở vị trớ thứ j của hideMess(i) bit = ClsBit.Extract(hideMess(i), j)

j += 1

„Thay thế bit vừa lấy ra cho bit tại vị trớ 0 của 1 byteRead. ClsBit.Replace(byteRead, 0, bit)

If j = 8 Then

i = i + 1

EndIf EndIf

„Ghi byte đó được thay thế bit LSB vào luồng outStream outStream.WriteByte(byteRead)

Loop

outStream.Close() inStream.Close()

EndSub

-Lớp clsCoverFile: Với chức năng chớnh là tạo ra 1 file ảnh là file ảnh gốc ban đầu nhưng cú chứa cả thụng tin ẩn trong đú.Mục đớch là tạo ra 1 file ảnh cú chứa sau nú nội dung của 1 message. Xõy dựng phương thức CreateStegoFile với 3 tham số: tờn file ảnh mới, nội dung message và password.Chỉ làm việc với ảnh bitmap : Phải kiểm tra file ảnh muốn giấu phải là ảnh Bitmap. dựa vào 2 byte đầu tiờn để xỏc định file ảnh Bitmap.

Giấu cả thụng tin về chiều dài của đoạn Message vào 4 byte đầu tiờn trong phần Data Pixel. Tức là bắt đầu từ byte thứ 54 của file ảnh sẽ lưu trữ chiều dài của message.Vậy ta xõy dựng 1 hàm đưa chiều dài của message vào 4 byte đầu tiờn , sau đú là nội dung của message dưới dạng byte. Kết quả trả về là một mảng byte. Lỳc này ta giấu cả mảng byte này vào trong file ảnh.

'Input:Mảng cần chứa thụng tin cần giấu.

'Output: Trả về mảng byte gồm 4 byte đầu chứa chiều dài của mess, cũn lại là cỏc byte mess.

PrivateFunction AddLenghAHead(ByVal messByte() AsByte) AsByte()

Dim len AsInteger = messByte.Length

'Khai bỏo mảng bLen(), phẩn tử đầu tiờn là gt (len), mảng gồm 4 bytes. (adsbygoogle = window.adsbygoogle || []).push({});

Dim bLen AsByte() = BitConverter.GetBytes(len)

Dim ret AsByte() = NewByte(len + bLen.Length) {}

Dim i AsInteger

'Add toàn bộ giỏ trị mảng bLen() vào mảng ret()

For i = 0 To bLen.Length - 1 ret(i) = bLen(i)

Next

'Cỏc phẩn tử tiếp theo của ret() mang gt của messByte()

For i = 0 To messByte.Length - 1

ret(i + bLen.Length) = messByte(i)

Next Return ret

EndFunction

Xõy dựng 2 hàm CreateStegoFile nhưng với tham số khỏc nhau. 1 hàm với message truyền vào là một chuỗi, 1 hàm khỏc với message là một mảng cỏc byte.Với tham số message là một chuỗi:

Function CreateStegoFile(ByVal stegoFileName As String, ByVal mess As String, ByVal pass As String) As ClsStegoFile

'Tạo luồng để đọc file

Dim inStream As FileStream = New FileStream(fileName, FileMode.Open, FileAccess.Read) „Kiểm tra đõy cú phải là file ảnh Bitmap

Dim kt1, kt2 As Char

kt1 = Chr(inStream.ReadByte) 'ChrW kt2 = Chr(inStream.ReadByte) If kt1 <> "B" And kt2 <> "M" Then

MessageBox.Show("Đõy khụng phải là file ảnh Bitmap", "Chỳ ý", MessageBoxButtons.OK) Return New ClsStegoFile("", pass) 'Trả ra 1 đối tượng ko tờn của ClsStegoFile

Exit Function End If

'Đọc phần tiờu đề của file ảnh Dim offset As Integer = 54

Dim Header() As Byte = New Byte(offset) {} inStream.Seek(0, SeekOrigin.Begin)

' Đọc từng khối byte từ luồng inStream và write ra buffer

inStream.Read(Header, 0, offset) ' Đọc từ 0 đến offset-1 (offset+Count-1) 'Ghi phần tiờu đề này vào 1 luồng mới lấy dữ liệu từ buffer

Dim outStream As FileStream = New FileStream(stegoFileName, FileMode.Create, FileAccess.Write) outStream.Write(Header, 0, offset)

Dim unicode As UTF8Encoding = New UTF8Encoding(True) Dim messByte() As Byte

messByte = AddLenghAHead(unicode.GetBytes(mess)) 'MsgBox(unicode.GetBytes(mess).Length)

'MsgBox(unicode.GetString(messByte)) Dim lsb As New ClsLSB

messByte = ClsCryptoHelper.Encrypt(messByte, pass) lsb.hideMess(inStream, messByte, outStream)

outStream.Close() inStream.Close()

MsgBox("Bạn đó giấu thụng tin thành cụng.", , "Thụng bỏo !") Return New ClsStegoFile(stegoFileName, pass) (adsbygoogle = window.adsbygoogle || []).push({});

End Function

Với tham số message là một mảng cỏc byte:

Function CreateStegoFile(ByVal stegoFileName As String, ByVal message() As Byte, ByVal pass As String) As ClsStegoFile

'Tạo luồng để đọc file

Dim inStream As FileStream = New FileStream(fileName, FileMode.Open, FileAccess.Read) 'Kiểm tra đõy cú phải là file ảnh Bitmap

Dim kt1, kt2 As Char

kt1 = Chr(inStream.ReadByte) kt2 = Chr(inStream.ReadByte) If kt1 <> "B" And kt2 <> "M" Then

MsgBox("Đõy khụng phải là file ảnh Bitmap", MsgBoxStyle.Exclamation) Return New ClsStegoFile("", pass)

Exit Function End If

'Đọc phần tiờu đề của file ảnh Dim offset As Integer = 54

Dim header() As Byte = New Byte(offset) {}

inStream.Seek(0, SeekOrigin.Begin) 'inStream.Seek(0, 0) inStream.Read(header, 0, offset)

'Ghi phần tiờu đề này vào 1 luụng mới

Dim outStream As FileStream = New FileStream(stegoFileName, FileMode.Create, FileAccess.Write)

outStream.Write(header, 0, offset) Dim messByte() As Byte

Dim uni As UTF8Encoding = New UTF8Encoding messByte = AddLenghAHead(message)

Dim lsb As New ClsLSB

messByte = ClsCryptoHelper.Encrypt(messByte, pass) lsb.hideMess(inStream, messByte, outStream)

outStream.Close() inStream.Close() outStream.Dispose() inStream.Dispose()

MsgBox("Bạn đó giấu thụng tin thành cụng.", , "Thụng bỏo !") Return New ClsStegoFile(stegoFileName, pass)

End Function

Sở dĩ xõy dựng thờm phương thức này vỡ cú thể ỏp dụng giấu cả 1 file text, file văn bản hoặc một file ảnh vào trong một ảnh. Do vậy khi ta đọc những file này thỡ sẽ thu được mảng cỏc byte. Và khi giấu là ta giấu trực tiếp luụn một mảng cỏc byte đú. Thực chất hàm CreateStegoFile với tham số message là một chuỗi cũng là giấu một mảng cỏc byte, phải thụng qua một bước chuyển đổi.

Lớp ClsCryptoHelper: Cú một phương thức “Encrypt” mó hoỏ thụng tin giấu được xỏc nhận bằng Password

Gồm phương thức mó hoỏ 2 tham số: Tham số thứ 1 là thụng tin mó hoỏ dưới dạng mảng byte (mess) ,Tham số thứ 2 chớnh là mật khẩu dựng để mó hoỏ (pass). Được gọi từ hàm EncryptDecrypt .Password nhập vào sẽ được dựng làm khoỏ cho mó hoỏ. Dựng lớp Rfc2898DeriveBytes làm trung gian để chuyển Password từ dạng chuỗi sang dạng mảng cỏc byte.

Public Shared Function EncryptDecrypt(ByVal mess As Byte(), ByVal pass As String) As Byte() 'Dim passwordLength As Integer = pass.Length

Dim salt As Byte() = {0, 5, 1, 2, 1, 9, 8, 5} '8 bytes ngẫu nhiờn

„Dựng lớp Rfc2898DeriveBytes làm trung gian để chuyển Password từ dạng chuỗi sang dạng mảng cỏc byte

Dim retMessage As Byte() = New Byte(mess.Length) {} Try

Dim key As Byte() = pdb.GetBytes(64) 'pdb.getBytes(128) Dim i As Integer

For i = 0 To mess.Length - 1 Dim index As Integer index = 1 Mod key.Length (adsbygoogle = window.adsbygoogle || []).push({});

retMessage(i) = CByte(key(index) Xor mess(i)) Next

Catch ex As Exception End Try

Return retMessage End Function

3.3.3 Cài đặt chức năng lấy thụng tin từ ảnh

Lớp clsLSB: Cú mộthàm “ShowMess” lấy ra byte được thay thế trong từng byte ảnh Begin

- Input: InputStream, mess, i=0, j=0 - i là chỉ số của mảng byte hiddenMessage - j là chỉ số của từng bit trong hiddenMessage(i) While chưa đọc hết file ảnh

+ ByteĐọc=InputStream.ReadByte + If chưa đọc hết kớ tự trong mess then

*Lấy ra bit ở vị trớ thứ 0 của byte ảnh. Bit=Extract(bytedọc,0)

*Thay thế Bit vừa lấy ra ở trờn vào vị trớ j của mess(i). Replace(Hidemes(i),j,Bit)

*Tăng j lờn 1: j=j+1

*Nếu thay thế hết cỏc bit của 1 kớ tự trong Hidemess tức là j=7 thỡ khởi tạo lại j=0 và i=i+1 tức là thay thế kớ tự tiếp theo

End if - Loop

Return hideMess -End

Cú hàm lấy thụng tin được ẩn từ file ảnh: Đầu vào là 1 luồng chứa byte ảnh và chiều dài của thụng tin muốn lấy ra. Kết quả trả ra là mảng thụng tin đó được giấu trong file ảnh:

'Hàm lấy ra byte được thay thế trong từng byte ảnh

'Input: 1 luồng chứa byte ảnh và chiều dài của thụng tin muốn lấy ra 'Output: Mảng byte của thụng tin muốn lấy ra (hidden)

PublicFunction showMess(ByVal instream As FileStream, ByVal length AsInteger) AsByte()

Dim hideMess AsByte() = NewByte(length) {} 'Kieu byte ko co Constructors

Dim i AsInteger = 0

Dim j AsInteger = 0

Dim byteRead AsInteger

'Dim leng As Long = instream.Length

DoWhile i < length

byteRead = instream.ReadByte

bit = ClsBit.Extract(byteRead, 0)'Lấy ra bit tại vị trớ 0 của byte ảnh

ClsBit.Replace(hideMess(i), j, bit)' Đưa bit đú vào vị trớ thứ j của hideMess(i) j += 1 If j = 8 Then j = 0 i += 1 EndIf Loop Return hideMess EndFunction

Lớp clsStegoFile: Với chức năng chớnh là lấy được thụng tin ẩn trong file ảnh.Đầu vào là một file ảnh dạng bitmap(.bmp) đó chứa tin trong đú và cựng với mật khẩu dựng để mó hoỏ dữ liệu.Đầu ra là thụng tin đó bị giấu trong file ảnh và hiện thị nú lờn.

Thuật toỏn:

Hỡnh 3.3: Lưu đồ thuật toỏn giải mó thụng tin

Begin (adsbygoogle = window.adsbygoogle || []).push({});

- Input: InputStream, mess, i=0, j=0 - i là chỉ số của mảng byte hiddenMessage - j là chỉ số của từng bit trong hiddenMessage(i)

While chưa đọc hết file ảnh + ByteĐọc=InputStream.ReadByte + If chưa đọc hết kớ tự trong mess then

Bit=Extract(bytedọc,0) *Lấy ra bit ở vị trớ thứ 0 của byte ảnh.

Replace(Hidemes(i),j,Bit) *Thay thế Bit vừa lấy ra ở trờn vào vị trớ j của mess(i). *Tăng j lờn 1: j=j+1

*Nếu thay thế hết cỏc bit của 1 kớ tự trong Hidemess tức là j=7 thỡ khởi tạo lại j=0 và i=i+1 tức là thay thế kớ tự tiếp theo End if

Loop

-Buffer= HiddenMess „Mảng byte tin bị giấu

-Giải mó mảng byte tin đú cựng với mật khẩu buffer = lsb.ClsCryptoHelper.Decrypt(buffer, Pass) - output: HiddenMessage

End.

Mục đớch: Là để lấy lại những thụng tin đó giấu trong một file ảnh.

Xõy dựng phương thức ExtractHiddenMessage: Phương thức này ngược với phương thức giấu thụng tin CreateStegoFile ở trờn. Đầu tiờn sẽ phải đọc 4 byte đầu tiờn trong phần Data Pixel để lấy về chiều dài của nội dung thụng tin giấu trong ảnh. Sau đú mới đọc tiếp nội dung của thụng tin đó giấu. Với message là một chuỗi

'Lấy ra message được giấu trong file, với Message ở dạng xõu.

PublicFunction ExtractHiddenMessage() AsString

Dim inStream As FileStream = New FileStream(stegoFile, FileMode.Open, FileAccess.Read)

Dim offset AsInteger = 54

Dim lsb AsNew ClsLSB

inStream.Seek(offset, SeekOrigin.Begin) 'Lấy ra 4 byte chứa chiều dài của Message

Dim bLen() AsByte

bLen = lsb.showMess(inStream, 4)

bLen = ClsCryptoHelper.Decrypt(bLen, passWord)

Dim len AsInteger

len = BitConverter.ToInt32(bLen, 0) 'Lấy ra nội dung của message

'inStream.Seek(offset + 32, SeekOrigin.Begin)

'32 byte đầu tiờn của phần Data pixel chứa độ dài của Message(gồm 4 byte) 'vỡ mỗi byte của ảnh chỉ chứa 1 bit của Message.

inStream.Seek(offset + 4 * 8, SeekOrigin.Begin) 'bLenBox(inStream.ReadByte)

Dim buffer AsByte()

Try

buffer = lsb.showMess(inStream, len)

Catch ex As Exception

MsgBox("File ảnh này khụng được giấu thụng tin hoặc mật khẩu sai.") (adsbygoogle = window.adsbygoogle || []).push({});

Return""

EndTry

'buffer = noi2MangByte(bLen, buffer)

buffer = ClsCryptoHelper.Decrypt(buffer, passWord) 'Dim byteMessage As Byte() = GetByteMessage(buffer)

Dim unicode As UTF8Encoding = New UTF8Encoding(True) hidenMessage = unicode.GetString(buffer)

inStream.Dispose()

Return hidenMessage

EndFunction

Một phần của tài liệu Một số phương pháp giấu tin trong tài liệu số hóa (Trang 60)