3.1.1 Lịch sử về ngụn ngữ Visual Basic.Net
Năm 2002, tuy hơi chậm khi người khổng lồ Microsoft nhận thấy trước tầm ảnh hưởng của Internet, cỏch mà Internet đó đang và sẽ thay đổi cả thế giới. Microsoft đó quyết định rằng Internet là phần cốt lừi của Visual Basic trong tương lai. Microsoft định hỡnh một hướng đi mới – xõy dựng lại toàn bộ kiến trỳc cho Visual Basic. Bắt đầu một bước ngoặt mới khi Microsoft quyết định làm lại từ đầu, tạo ra một mụi trường phỏt triển ứng dụng hỗ trợ đa ngụn ngữ lập trỡnh mới trờn khuụn nền .Net Framework. Visual Basic.Net 2002 ra đời, việc phỏt triển ứng dụng Web bõy giờ đó là một phần tớch hợp của Visual Basic như phỏt triển ứng dụng Windows.
Năm 2003, Microsoft tiếp tục nõng cấp Visual Basic.Net 2002 để cho ra đời Visual Basic.Net 2003. Phiờn bản này hỗ trợ thờm cho phỏt triển ứng dụng Web trờn Mobie như PDA hay cỏc thiết bị thụng minh như PC Pocket. Việc cải tiến cũng được thực hiện cho cỏc dịch vụ Web và cụng cụ chuyển mó (Visual Basic 6.0-VB6 sang Visual Basic.Net).Năm 2005, Microsoft tiếp tục phỏt triểnphiờn bản mới Visual Basic.Net 2005. Phiờn bản này chứa rất nhiều Wizard sinh mó tự động, thờm nhiều từ khúa làm tăng tốc độ viết mó và hiệu suất thực thi của ứng dụng. Cải tiến toàn bộ thư viện xử lý dữ liệu ADO.Net, đưa ra rất nhiều thành phần giao diện trực quan hiệu quả cho ứng dụng Windows lẫn Web. Hỗ trợ lập trỡnh Web và Internet tối đa với khả năng thiết kế cỏc ứng dụng ASP.Net trực quan. Visual Basic.Net 2005 đó đưa Microsoft lờn một tầm cao mới. Nú đỏp ứng hầu như mong mỏi của hàng triệu lập trỡnh viờn trờn thế giới. Hiện nay đó cú phiờn bản Visual Basic.Net 2012.
3.1.2 Những đặc điểm nổi bật của ngụn ngữ Visual Basic.Net
Visual Basic.Net là ngụn ngữ lập trỡnh khuynh hướng đối tượng (Object Oriented
Programming Language - OOP), một trong những ngụn ngữ được tạo ra để hướng đến
mục tiờu tạo ra ứng dụng phõn tỏn trờn mụi trường .Net dựa trờn nền Microsoft 's .Net Framework. Giờ đõy, Visual Basic.Net chuyển sang hướng đi hoàn toàn mới đú là tập trung vào phỏt triển cỏc ứng dụng cho mụi trường đa tầng, cỏc ứng dụng phõn tỏn,…Đặc biệt là trong lĩnh vực cụng nghệ Internet, lập trỡnh ứng dụng mạng, xõy dựng ứng dụng Web,...với cụng cụ tạo cỏc ứng dụng Web mới là Visual Web Developer được viết ASP.Net mạnh mẽ, chỉnh chu hơn và đơn giản hơn .
Visual Basic.Net hỗ trợ đầy đủ bốn tớnh chất của ngụn ngữ lập trỡnh hướng đối tượng: Tớnh thừa kế (Inheritance), Trừu tượng húa dữ liệu (Abstraction) , Tớnh đa hỡnh (Polymorphism), Tớnh đúng gúi (Encapsulation). Visual Basic.Net bổ sung thờm cỏc tớnh năng khuynh hướng đối tượng như: Giao tiếp (Interface) , Nạp chồng (Overloading) , Hàm tạo và hàm hủy, Xử lý ngoại lệ cú cấu trỳc, Xử lý đa luồng .
3.1.3 Những ứng dụng ngụn ngữ Visual Basic.Net
Visual Basic.Net cú thể viết hầu hết cỏc loại ứng dụng như: Tạo ứng dụng trũ chơi trờn Windows; Tạo cỏc ứng dụng quản lý cho doanh nghiệp; Tạo bỏo cỏo, tập tin văn bản; Xử lý đồ họa; Tương tỏc với hệ thống tập tin của Window; Truy xuất cơ sở dữ liệu; Tạo cỏc dịch vụ Windows; Tạo cỏc thư viện liờn kết động (DLL); Tạo cỏc ứng dụng cho PDA, Mobie (Pocket PC),…Điểm nổi bật khi bạn để ý thấy chữ “.Net” trong Visual Basic.Net, bạn sẽ thấy ngay ngụn ngữ lập trỡnh này chuyờn trị tạo ứng dụng của mụi trường .Net như: Lập trỡnh ứng dụng mạng (Network Application Programming), tạo ứng dụng Web / Internet (ASP.Net), tạo cỏc dịch vụ Web (Web Services),…
3.2 Bài toỏn giấu tin trong ảnh màu
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.
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"
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
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.
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)
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
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