隱寫術 是將秘密資訊隱藏於載體(如圖片、音訊)中,使其外觀不變、難以被察覺。本文介紹一個完整的 C# 實作,利用 24-bit BMP 圖片的最低有效位元(LSB)特性,將任意二進位檔案隱藏於像素色彩通道中,並提供對應的提取還原功能。程式碼包含 Bitmap24Writer(寫入)、Bitmap24Reader(讀取)、BitmapWorks(高層封裝)以及命令列工具 BmpSafe。
PixelFormat.Format24bppRgb 格式。WriteByte(byte):將一個位元組拆解為 8 位元,依序寫入 R、G、B 三通道 LSB。curX、curY、iRGB 指標,掃描順序為左→右、上→下、R→G→B。GetUnusedBitCount()、GetMaxBitStorageCount() 提供容量查詢。ReadByte(out byte):讀取 8 位元組成一個位元組,MSB 先行(by |= bit << 7 後再右移)。public static bool Data2Bmp(FileStream dataStream, FileStream bmpStream,
string outFName, out string error)
流程:
(寬 × 高 × 3) / 8 位元組,預留 4 位元組存長度。WriteByte。public static bool Bmp2Data(FileStream bmpStream, string outFName,
out string error)
流程:
Bitmap24Reader。ReadByte 寫入輸出檔案。用法:
BmpSafe.exe /file2bmp 載體圖片.bmp 要隱藏的檔案 [輸出圖片.bmp]
BmpSafe.exe /bmp2file 含隱藏資料的圖片.bmp [輸出檔案]
Secret.BMP 或 Secret.bin。// 寫入單一位元到指定通道
switch (iRGB)
{
case 0: r = (byte)(r & 0xFE); r |= curBit; break; // R 通道
case 1: g = (byte)(g & 0xFE); g |= curBit; break; // G 通道
case 2: b = (byte)(b & 0xFE); b |= curBit; break; // B 通道
}
bmp.SetPixel(curX, curY, Color.FromArgb(r, g, b));
// 從指定通道讀取 LSB
switch (iRGB)
{
case 0: bit = (byte)(col.R & 1); break;
case 1: bit = (byte)(col.G & 1); break;
case 2: bit = (byte)(col.B & 1); break;
}
by |= (byte)(bit << 7);
if (bits2Do != 0) by >>= 1; // MSB-first 重建