Thiết kế chương trỡnh giấu tin trong dữ liệu AVI

Một phần của tài liệu giấu tin trong tập tin avi (Trang 65 - 79)

Tư tưởng

Dữ liệu video trong tệp tin AVI chỉ đơn thuần là liờn tiếp cỏc ảnh bitmap. Tư tưởng của thuật toỏn này là chiết xuất tệp tin AVI thành cỏc tập bitmap và sau đú tỏi tạo lại luồng dữ liệu video, mục đớch là để giấu thụng điệp vào tệp tin video

Đọc luồng dữ liệu video

Thư viện Windows AVI là tập cỏc hàm trong tập tin avifil32.dll. Để bắt đầu sử dụng thư viện này, ta phải khởi tạo bằng hàm AVIFileInit. AVIFileOpen để mở tập tin video, AVIFileGetStream để đọc luồng dữ liệu video.

//Khởi tạo thư viện AVI

[DllImport("avifil32.dll")]

public static extern void AVIFileInit();

//Mởi tệp tin AVI

[DllImport("avifil32.dll", PreserveSig=true)] public static extern int AVIFileOpen(

ref int ppfile, String szFile, int uMode,

int pclsidHandler);

//Đọc dữ liệu AVI

[DllImport("avifil32.dll")]

public static extern int AVIFileGetStream( int pfile,

out IntPtr ppavi, int fccType, int lParam);

//Giải phúng luồng AVI

[DllImport("avifil32.dll")]

public static extern int AVIStreamRelease(IntPtr aviStream);

//Giải phúng tập tin AVI

[DllImport("avifil32.dll")]

//Đúng thư viện AVI

[DllImport("avifil32.dll")]

public static extern void AVIFileExit();

Bõy giờ, chỳng ta cú thể mở tập tin AVI và đọc luồng dữ liệu video. Tập tin AVI cú thể chứa nhiều luồng cỏc kiểu khỏc nhau (Video, Audio, Midi, Text). Thường thỡ chỉ cú duy nhất một luồng một kiểu dữ liệu, ở đõy chỳng ta chỉ tập trung vào dữ liệu video.

private int aviFile = 0; private IntPtr aviStream;

public void Open(string fileName) {

AVIFileInit(); //Khởi tạo thư viện AVI

//Mở tập tin

int result = AVIFileOpen( ref aviFile,

fileName,

OF_SHARE_DENY_WRITE, 0);

//Lấy dữ liệu luồng video

result = AVIFileGetStream( aviFile,

out aviStream,

streamtypeVIDEO, 0); }

Trước khi bắt đầu đọc cỏc khung dữ liệu, chỳng ta phải xỏc định chớnh xỏc:

*) Vị trớ khung đầu tiờn *) Cú bao nhiờu khung *) Chiều dài/rộng của ảnh

Thư viện AVI bao gồm cỏc hàm tương ứng cho việc xỏc định ở trờn

//Lấy vị trớ đầu tiờn của luồng video

[DllImport("avifil32.dll", PreserveSig=true)]

public static extern int AVIStreamStart(int pavi);

//Lấy độ dài của luồng trong cỏc khung

[DllImport("avifil32.dll", PreserveSig=true)]

public static extern int AVIStreamLength(int pavi);

//Lấy thụng tin header của luồng đang mở

[DllImport("avifil32.dll")]

public static extern int AVIStreamInfo( int pAVIStream,

ref AVISTREAMINFO psi, int lSize);

Với những hàm này chỳng ta cú thể điền vào cấu trỳc của BITMAP INFOHEADER. Để chiết xuất lấy ảnh, chỳng ta cần 3 hàm nữa

//Chuyển con trỏ đến đối tượng GETFRAME (trả lại giỏ trị 0 nếu cú lỗi xảy ra)

[DllImport("avifil32.dll")]

public static extern int AVIStreamGetFrameOpen( IntPtr pAVIStream,

ref BITMAPINFOHEADER bih);

//Chuyển con trỏ tới DIB (trả lại giỏ trị 0 nếu cú lỗi xảy ra)

[DllImport("avifil32.dll")]

public static extern int AVIStreamGetFrame( int pGetFrameObj,

//Giải phúng đối tượng GETFRAME

[DllImport("avifil32.dll")]

public static extern int AVIStreamGetFrameClose(int pGetFrameObj);

Cuối cựng chỳng ta sẽ giải nộn cỏc khung dữ liệu

//Lấy vị trớ đầu tiờn và số khung dữ liệu

int firstFrame = AVIStreamStart(aviStream.ToInt32()); int countFrames = AVIStreamLength(aviStream.ToInt32());

//lấy thụng tin về header

AVISTREAMINFO streamInfo = new AVISTREAMINFO();

result = AVIStreamInfo(aviStream.ToInt32(), ref streamInfo, Marshal.SizeOf(streamInfo));

//Xõy dựng header của ảnh bitmap

BITMAPINFOHEADER bih = new BITMAPINFOHEADER(); bih.biBitCount = 24; bih.biCompression = 0; //BI_RGB; bih.biHeight = (Int32)streamInfo.rcFrame.bottom; bih.biWidth = (Int32)streamInfo.rcFrame.right; bih.biPlanes = 1; bih.biSize = (UInt32)Marshal.SizeOf(bih);

//Chuẩn bị giải nộn DIBs (device independend bitmaps)

int getFrameObject = AVIStreamGetFrameOpen(aviStream, ref bih);

//Xuất cỏc khung đến một vị trớ nhất định

public void ExportBitmap(int position, String dstFileName){

int pDib = Avi.AVIStreamGetFrame(getFrameObject, firstFrame + position);

//Chộp header bitmap vào cấu trỳc định sắn

BITMAPINFOHEADER bih = new BITMAPINFOHEADER();

bih = (BITMAPINFOHEADER)Marshal.PtrToStructure(new IntPtr(pDib),

bih.GetType());

//Chộp ảnh

byte[] bitmapData = new byte;

int address = pDib + Marshal.SizeOf(bih);

for(int offset=0; offset<bitmapData.Length; offset++){ bitmapData[offset] = Marshal.ReadByte(new

IntPtr(address)); address++; }

//Chộp thụng tin bitmap

byte[] bitmapInfo = new byte[Marshal.SizeOf(bih)]; IntPtr ptr;

ptr = Marshal.AllocHGlobal(bitmapInfo.Length); Marshal.StructureToPtr(bih, ptr, false);

address = ptr.ToInt32();

for(int offset=0; offset<bitmapInfo.Length; offset++){ bitmapInfo[offset] = Marshal.ReadByte(new

IntPtr(address)); address++; }

.Lưu vào cỏc tệp bitmap

//Tạo header

Avi.BITMAPFILEHEADER bfh = new Avi.BITMAPFILEHEADER(); bfh.bfType = Avi.BMP_MAGIC_COOKIE;

//kớch cỡ tệp tin ghi lờn đĩa

bfh.bfSize = (Int32)(55 + bih.biSizeImage);

bfh.bfOffBits = Marshal.SizeOf(bih) + Marshal.SizeOf(bfh);

//Tạo và ghi đố lờn tệp tin đớch

FileStream fs = new FileStream(dstFileName, System.IO.FileMode.Create);

BinaryWriter bw = new BinaryWriter(fs);

//Ghi header bw.Write(bfh.bfType); bw.Write(bfh.bfSize); bw.Write(bfh.bfReserved1); bw.Write(bfh.bfReserved2); bw.Write(bfh.bfOffBits);

//Ghi thụng tin bitmap

bw.Write(bitmapInfo);

//Ghi dữ liệu bitmap

bw.Write(bitmapData); bw.Close();

fs.Close(); }

Chương trỡnh sử dụng cỏc tập bitmap đó được chiết xuất để làm đầu vào của bộ nhỳng. Nếu bản phủ là tập AVI, chương trỡnh sẽ chiết xuất khung đầu tiờn vào tập tin tạm thời, mở tập tin đú ra và giấu một phần của thụng điệp. Sau đú nú sẽ ghi tập bitmap đó bao gồm tin giấu vào luồng dữ liệu video mới, và cứ thế với khung tiếp theo. Sau khi đến khung cuối cựng, chương trỡnh sẽ đúng cả hai tập tn video, xúa tập tin ảnh bitmap tạm thời, và tiếp tục với bản phủ tiếp theo (tập tin AVI khỏc).

Ghi vào luồng dữ liệu video

Khi chương trỡnh mở tập tin AVI nguồn, nú sẽ tạo ra một tập tin AVI khỏc để chứa cỏc khung bitmap kết quả. Tập tin video mới phải cú cựng kớch cỡ và cựng tỉ lệ khung hỡnh so với tập tin gốc, vỡ vậy chỳng ta khụng thể sử dụng hàm Open(). Ngay khi khung bitmap đầu tiờn tới, ta sẽ biết được kớch thước của khung để tạo ra tập video mới. Hàm AVIFileCreateStream,AVIStreamSetFormat và AVIStreamWrite dựng để tạo luồng video và ghi vào khung.

//Tạo luồng mới trong tập AVI đang mở

[DllImport("avifil32.dll")]

public static extern int AVIFileCreateStream( int pfile,

out IntPtr ppavi,

ref AVISTREAMINFO ptr_streaminfo);

//Thiết lập định dạng cho luồng video mới

[DllImport("avifil32.dll")]

public static extern int AVIStreamSetFormat( IntPtr aviStream, Int32 lPos,

ref BITMAPINFOHEADER lpFormat, Int32 cbFormat);

//Ghi mẫu vào luồng

[DllImport("avifil32.dll")]

public static extern int AVIStreamWrite(

IntPtr aviStream, Int32 lStart, Int32 lSamples, IntPtr lpBuffer, Int32 cbBuffer, Int32 dwFlags, Int32 dummy1, Int32 dummy2);

Bõy giờ ta sẽ tạo luồng video

//Tạo luồng video mới

AVISTREAMINFO strhdr = new AVISTREAMINFO(); strhdr.fccType = this.fccType;

strhdr.fccHandler = this.fccHandler; //"Microsoft Video 1" strhdr.dwScale = 1;

strhdr.dwRate = frameRate;

strhdr.dwSuggestedBufferSize = (UInt32)(height * stride);

//Thiết lập chế độ chất lượng cao. Nộn sẽ cú thể làm hỏng thụng điệp được giấu

strhdr.dwQuality = 10000;

strhdr.rcFrame.bottom = (UInt32)height; strhdr.rcFrame.right = (UInt32)width; strhdr.szName = new UInt16[64];

//Tạo luồng

int result = AVIFileCreateStream(aviFile, out aviStream, ref strhdr);

//định dạng ảnh

BITMAPINFOHEADER bi = new BITMAPINFOHEADER(); bi.biSize = (UInt32)Marshal.SizeOf(bi); bi.biWidth = (Int32)width;

bi.biHeight = (Int32)height; bi.biPlanes = 1;

bi.biBitCount = 24;

bi.biSizeImage = (UInt32)(this.stride * this.height);

//định dạng luồng

result = Avi.AVIStreamSetFormat(aviStream, 0, ref bi, Marshal.SizeOf(bi));

}

...and write video frames.

public void Open(string fileName, UInt32 frameRate) { this.frameRate = frameRate;

Avi.AVIFileInit();

int hr = Avi.AVIFileOpen( ref aviFile, fileName, OF_WRITE | OF_CREATE, 0); }

//Thờm một khung mẫu vào luồng

public void AddFrame(Bitmap bmp) { BitmapData bmpDat = bmp.LockBits(

new Rectangle(0, 0, bmp.Width, bmp.Height),

ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);

//Tỡm khung đầu tiờn, lấy kớch thước và tạo luồng mới

if (this.countFrames == 0) {

this.stride = (UInt32)bmpDat.Stride; this.width = bmp.Width;

this.height = bmp.Height;

CreateStream(); //a method to create a new video stream

}

//thờm ảnh bitmap vào luồng

int result = AVIStreamWrite(aviStream, countFrames, 1,

bmpDat.Scan0, //pointer to the beginning of the image data

(Int32) (stride * height), 0, 0, 0);

bmp.UnlockBits(bmpDat); this.countFrames ++; }

Sử dụng tất cả những hàm được nờu ở trờn là đủ để đọc và ghi cỏc luồng video. Ở đõy chỳng ta chưa thực hiện việc giấu tin trờn video nộn, vỡ nộn sẽ cú thể phỏ hủy thụng điệp đem giấu, màu sắc bị thay đổi và hơn nữa õm thanh sẽ làm cho kớch thước tập tin lớn hơn.

HideOrExtract() lần lượt đọc từng ảnh bitmap và giải phúng nú trước khi đọc ảnh tiếp theo. Ảnh bitmap hay khung AVI được chứa trong cấu trỳc BitmapInfo structure dưới đõy

public struct BitmapInfo{

//Ảnh bitmap

public Bitmap bitmap;

//vị trớ của khung trong luồng AVI, giỏ trị -1 trả về dữ liệu khụng phải AVI hay bitmap

public int aviPosition;

//số khung trong luồng AVI, giỏ trị là 0 cho dữ liệu khỏc, khụng phải AVI hay bitmap

public int aviCountFrames;

//đường dẫn và tờn của tệp tin bitmap

//tập tin này sẽ bị xúa đi sau đú, nếu aviPosition >= 0

public String sourceFileName;

//Số bytes sẽ được giấu vào ảnh

public long messageBytesToHide;

public void LoadBitmap(String fileName){ bitmap = new Bitmap(fileName);

sourceFileName = fileName; }

3.7 Tổng kết chương

Trong chương này, tỏc giả giới thiệu một kỹ thuật giấu tin cho video độ phõn giải cao. Ưu điểm của phương phỏp này là hiệu ứng sau khi nhỳng tin đối với chất lượng hỡnh ảnh hầu như khụng đỏng kể và dung lượng dữ liệu giấu khỏ cao. Cuối cựng, kĩ thuật này cú thể dễ dàng mở rộng nờn tớnh bền vững cao hơn, tớnh bảo mật dữ liệu tốt hơn và khả năng nhỳng tin lớn hơn. Tỏc giả cũng cung cấp một số thư viện để cú thể xuất và giấu dữ liệu trong tập tin AVI.

KẾT LUẬN

1. Kết quả của luận văn

- Làm rừ cỏc khỏi niệm liờn quan đến giấu tin, phõn biệt sự giống và khỏc nhau giữa ba khỏi niệm: “giấu tin”, “phủ tin” (steganography), “thủy võn” (watermarking)

- Luận văn phõn tớch, đỏnh giỏ, và so sỏnh cỏc kỹ thuật giấu tin, giỳp cho người đọc tỡnh tổng quỏt và đầy đủ khi nghiờn cứu và triển khai cỏc hệ thống giấu tin trong thực tiễn.

- Luận văn trỡnh bày phương phỏp biến đổi DCT (Discrete cosine transform)

- Đề xuất một phương phỏp giấu tin trong tập tin AVI (Audio Video Interleave) và phỏt triển chương trỡnh thử nghiệm dựa trờn phương phỏp đú

2. Phương hướng nghiờn cứu

- Nghiờn cứu và phỏt triển kỹ thuật giấu tin và ứng dụng vào lĩnh vực sở hữu trớ tuệ như bảo vệ và xỏc thực bản quyền tỏc giả.

- Nghiờn cứu và phỏt triển ứng dụng theo dừi và xỏc thực cụng văn điện tử dựa trờn ý tưởng: Trước khi gửi cụng văn đi, người văn thư vẽ một hỡnh gỡ đú vào phớa sau tờ cụng văn, sau đú xộ một gúc hoặc lề của cụng văn giữ lại, phần chớnh sẽ được gửi đi. Phương phỏp này giỳp người văn thư cú thể xỏc thực được cụng văn của mỡnh đó gửi đi.

TÀI LIỆU THAM KHẢO Tiếng Việt

1. Vũ Bỏ Đỡnh, Nguyễn Xuõn Huy, Đào Thanh Tĩnh (2002), Đỏnh giỏ

khả năng giấu dữ liệu trong bản đồ số, tạp chớ Tin học và Điều khiển học, số 4, 347-353

2. Nguyễn Xuõn Huy, Bựi Thị Thuý Hằng (2001), Một số cải tiến của kĩ

thuật giấu dữ liệu trong ảnh

3. Phạm Văn Ất, Nguyễn Hữu Cường, Đỗ Văn Tuấn, Giấu tin trong ảnh

nhị phõn và ứng dụng, Tạp chớ Khoa học Giao thụng vận tải, số 19 thỏng 9 năm 2007

Tiếng Anh

1. Chun-Shien Lu, Multimedia Security: Steganography and Digital

Watermarking Techniques for Protection of Intellectual Property, IDEA

Group Publishing 2005

2. Min Wu, Multimedia Data Hiding, Princeton University, USA, 2001

3. Michael Arnold, Dir. Christoph Bushch, Watermarking of Audio, Music

Scores and 3D Models, INI-GraphicsNet – Press & Media 2003

4. Nedeljko Cvejic, Tapio Seppaen, Fusing Digital Audio Watermarking And Atuthentication In Diverse Signal Domains, EUSIPCO Proceedings,

2005

5. Min Wu, Scott A, Craver, Edward W Felten, Bede Liu, Analysis of Attachs On Sdmi Audiowatermarks, Priceton University, USA, 2003

6. Shi-Cheng Liu, Shinfeng d. Lin, BCH Code-Based Robust Audio Watermarking in the Cepstrum Domain, Journal of Information Science

and Engineering 22 (2006) 535

8. Yu-Chee Tsengt - Hsiang-Kuang Pan, Secure and Invisible Data Hiding in 2-Color Images

9. Husrev T. Sencar Mahalingam Ramkumar, Ali N. Akansu

Một phần của tài liệu giấu tin trong tập tin avi (Trang 65 - 79)

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

(79 trang)
w