首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作 LSB 隱寫術:將文字檔隱藏於 24-bit BMP 圖片中

     編輯:關於C語言

前言

隱寫術 是將秘密資訊隱藏於載體(如圖片、音訊)中,使其外觀不變、難以被察覺。本文介紹一個完整的 C# 實作,利用 24-bit BMP 圖片的最低有效位元(LSB)特性,將任意二進位檔案隱藏於像素色彩通道中,並提供對應的提取還原功能。程式碼包含 Bitmap24Writer(寫入)、Bitmap24Reader(讀取)、BitmapWorks(高層封裝)以及命令列工具 BmpSafe。

核心原理

  • 24-bit BMP 每像素佔 3 個位元組(R、G、B),每通道 8 位元。
  • 修改各通道的最低位元(LSB)對人眼視覺影響極小。
  • 每像素可藏 3 位元資訊,一張 800×600 圖片約可藏 180 KB 資料。
  • 檔案大小資訊(4 位元組)寫入開頭,讀取時先解析長度再提取內容。

主要類別架構

Bitmap24Writer - 位元寫入器

  • 建構子驗證 PixelFormat.Format24bppRgb 格式。
  • WriteByte(byte):將一個位元組拆解為 8 位元,依序寫入 R、G、B 三通道 LSB。
  • 內部維護 curX、curY、iRGB 指標,掃描順序為左→右、上→下、R→G→B。
  • GetUnusedBitCount()、GetMaxBitStorageCount() 提供容量查詢。

Bitmap24Reader - 位元讀取器

  • 對應 Writer 的掃描順序,從像素 LSB 重建位元組。
  • ReadByte(out byte):讀取 8 位元組成一個位元組,MSB 先行(by |= bit << 7 後再右移)。
  • 同樣提供容量查詢方法。

BitmapWorks - 靜態工具類別

Data2Bmp - 隱藏檔案到圖片

public static bool Data2Bmp(FileStream dataStream, FileStream bmpStream,
    string outFName, out string error)
流程:
  1. 載入 BMP,驗證 24-bit 格式。
  2. 計算最大可藏容量:(寬 × 高 × 3) / 8 位元組,預留 4 位元組存長度。
  3. 檢查輸入檔案大小是否超過容量。
  4. 寫入 4 位元組檔案長度(Little-Endian)。
  5. 逐位元組讀取資料流並呼叫 WriteByte。
  6. 儲存輸出 BMP,回報使用空間百分比。

Bmp2Data - 從圖片提取檔案

public static bool Bmp2Data(FileStream bmpStream, string outFName,
    out string error)
流程:
  1. 載入 BMP,建立 Bitmap24Reader。
  2. 讀取前 4 位元組還原資料長度。
  3. 依長度循環呼叫 ReadByte 寫入輸出檔案。
  4. 例外處理確保資料流正確關閉。

命令列工具 BmpSafe

用法:
BmpSafe.exe /file2bmp 載體圖片.bmp 要隱藏的檔案 [輸出圖片.bmp]
BmpSafe.exe /bmp2file 含隱藏資料的圖片.bmp [輸出檔案]
  • 預設輸出:Secret.BMP 或 Secret.bin。
  • 完整錯誤處理:檔案不存在、格式錯誤、容量不足等。
  • 詳細進度輸出至 Console。

程式碼精要片段

位元寫入核心邏輯

// 寫入單一位元到指定通道
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 重建

限制與注意事項

  • 僅支援 24-bit BMP,其他格式(JPG、PNG、32-bit BMP)會拋出例外。
  • 載體圖片不可經過有損壓縮(如 JPEG),否則 LSB 資料會損毀。
  • 隱藏資料會微幅改變圖片雜訊特徵,專業隱寫分析仍可偵測。
  • 大量資料建議先壓縮(GZip/Deflate)再隱藏,提高空間利用率。

擴展建議

  • 加入 AES 加密再隱藏,提升機密性。
  • 支援 PNG 無損格式(需處理行過濾器與 CRC)。
  • 實作自適應區塊選擇(如邊緣區域優先),降低統計可偵測性。
  • 建立 GUI 介面整合拖放操作與進度列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved