Steganography (dấu tin, viết phủ) là lĩnh vực nghiên cứu việc nhúng các mẩu tin mật vào một môi trường phủ. Trong quá trình dấu tin để tăng bảo mật có thể người ta dùng một khoá viết mật khi đó người ta nói về Intrinsic Steganography (dấu tin có xử lý). Khi đó để giải mã người dùng cũng phải có khoá viết mật đó. Chú ý rằng khoá này không phải là khoá dùng để lập mật mã mẩu tin, ví dụ nó có thể là khoá để sinh ra hàm băm phục vụ rải tin vào môi trường phủ. Ngược lại nếu không dùng khoá viết mật thì người ta chỉ dấu tin đơn thuần vào môi trường phủ thì khi đó người ta nói về Pure Steganography (dấu tin đơn thuần).
Trang 1Giấu thông tin trong ảnh sử dụng phương pháp Steganography (dấu tin, viết phủ)
I Giới thiệu chung
Steganography (dấu tin, viết phủ) là lĩnh vực nghiên cứu việc nhúng các
mẩu tin mật vào một môi trường phủ Trong quá trình dấu tin để tăng bảo mật có thể người ta dùng một khoá viết mật khi đó người ta nói về Intrinsic Steganography (dấu tin có xử lý) Khi đó để giải mã người dùng cũng phải có khoá viết mật đó Chú ý rằng khoá này không phải là khoá dùng để lập mật mã mẩu tin,
ví dụ nó có thể là khoá để sinh ra hàm băm phục vụ rải tin vào môi trường phủ Ngược lại nếu không dùng khoá viết mật thì người ta chỉ dấu tin đơn thuần vào môi trường phủ thì khi đó người ta nói về Pure Steganography (dấu tin đơn thuần).
Ý tưởng xây dựng thuật toán:
+ Giấu tin: đọc 1 byte từ khối key, lưu chúng vào currentKey; đọc 1 byte từ khối tin cần giấu và sử dụng phép XOR đối với chúng, lưu lại trong currentByte; di chuyển key pixels sang phải, hoặc xuống dưới nếu cần thiết; tô màu cho pixels; set giá trị R,G, hay B cho currentByte
+Đọc tin: đọc 1 byte từ phân lớp key; tính toán vị trí của pixel kế tiếp; nhận màu từ pixel, viết giá trị R,G,B vào lớp ảnh
messageLength = (Int32)messageStream.Length;
//
String colorValue = messageLength.ToString("x");
colorValue = UnTrimColorString(colorValue, 6);
int red = Int16.Parse(colorValue.Substring(0 2), NumberStyles.HexNumber);
int green = Int16.Parse(colorValue.Substring(2 2), NumberStyles.HexNumber);
int blue = Int16.Parse(colorValue.Substring(4 2), NumberStyles.HexNumber);
pixelColor = Color.FromArgb(red, green, blue);
bitmap.SetPixel(0 0, pixelColor);
Read byte from the key:
//Bắt đầu với pixel thứ 2
Point pixelPosition = new Point(1 0);
//Loop
for(int messageIndex=0; messageIndex<messageLength; messageIndex++){
//repeat the key, if it is shorter than the message
Trang 2if(keyStream.Position == keyStream.Length){
keyStream.Seek(0, SeekOrigin.Begin);
}
//Get the next pixel-count from the key, use "1" if it's 0
currentKeyByte = (byte)keyStream.ReadByte();
currentStepWidth = (currentKeyByte==0) ? (byte) : currentKeyByte;
//jump to reverse-read position and read from the end of the stream
keyPosition = keyStream.Position;
keyStream.Seek(keyPosition, SeekOrigin.End);
currentReverseKeyByte = (byte)keyStream.ReadByte();
//jump back to normal read position
keyStream.Seek(keyPosition, SeekOrigin.Begin);
//Perform line breaks, if current step is wider than the image
while(currentStepWidth > bitmapWidth){
currentStepWidth -= bitmapWidth;
pixelPosition.Y++;
}
//Di chuyển vị trí
if((bitmapWidth - pixelPosition.X) < currentStepWidth){
pixelPosition.X = currentStepWidth - (bitmapWidth - pixelPosition.X);
pixelPosition.Y++;
}else{
pixelPosition.X += currentStepWidth;
}
get the pixel and put the message-byte into one color component:
//Get color of the "clean" pixel
pixelColor = bitmap.GetPixel(pixelPosition.X, pixelPosition.Y);
//To add a bit of confusion, xor the byte with
//a byte read from the keyStream
int currentByte = messageStream.ReadByte() ^ currentReverseKeyByte;
if(useGrayscale){
pixelColor = Color.FromArgb(currentByte, currentByte, currentByte);
}else{
//Change one component of the color to the message-byte
SetColorComponent(ref pixelColor, currentColorComponent, currentByte);
//Rotate color components
currentColorComponent =
(currentColorComponent==2) ? 0 : (currentColorComponent+1);
}
} //kết thúc vòng for, chuyển sang byte kế tiếp
II Mô tả chương trình
Trang 3III Ưu nhược điểm của chương trình
Ưu điểm : khả năng bảo mật tương đối cao, người ngoài khi biết được file ảnh giấu tin cũng khó mà có thể đọc tin được vì không rõ key sử dụng là text hay file, khi key là file thì không rõ file giữ key là file nào
Trang 4Nhược điểm : chất lượng ảnh còn kém, dễ phát hiện được bằng mắt thường, dung lượng giấu tin nhỏ
IV Tài liệu tham khảo
Tham khảo một số code của trang web http://www.codeproject.com