已完成 2025年3月 - 2025年3月
StegoApollo - 圖像隱寫術工具
採用 MVP 架構的 C# Windows Forms 隱寫術應用程式,實作四種演算法(LSB、QIM、DCT、Histogram Shift),整合直方圖視覺化、即時日誌記錄與互動式演算法解說功能。
C# Steganography MVP School Project
專案簡介
StegoApollo 是一個Windows Forms 隱寫術工具應用程式,提供在圖片中隱藏與提取訊息的完整解決方案。專案實作四種隱寫演算法(LSB、QIM、DCT、Histogram Shift),採用 MVP (Model-View-Presenter) 架構設計,整合直方圖視覺化、即時日誌記錄與演算法解說功能,適用於資訊安全教學與隱寫技術研究。
核心理念
- 多演算法支援:LSB(最低有效位元)、QIM(量化索引調變)、DCT(離散餘弦轉換)、Histogram Shift(直方圖位移)
- 教育導向設計:互動式演算法解說面板、即時操作日誌、直方圖視覺化
- 模組化架構:Strategy Pattern 設計、服務層與工具層分離、可擴展的介面定義
- 專業級 UI/UX:進度指示器、錯誤處理機制、一鍵匯出功能
我的職責
作為專案的唯一開發者,我負責:
系統架構設計
- 設計雙專案架構:StegoLib(類別庫)+ StegoApolloUI(WinForms 應用程式)
- 實作 Strategy Pattern:IStegoService 介面 + 4 種演算法實作
- 建立 MVP 架構:MainForm (View) + MainPresenter (Presenter) + StegoLib (Model)
- 設計服務層與工具層分離:Services/ + Utilities/
核心演算法實作 (StegoLib 類別庫)
- LsbStegoService (148 行):最低有效位元嵌入與提取
- 支援 RGB 三通道 1-2 bit 嵌入
- 前置 4 bytes 記錄訊息長度
- Unsafe Code 指標操作優化效能
- QimStegoService (194 行):量化索引調變
- 灰階通道量化處理
- Delta 步長可調整(預設 8)
- 直方圖生成支援
- DctStegoService (210 行):離散餘弦轉換
- 頻域嵌入技術
- 8x8 區塊 DCT 轉換
- 中頻係數修改
- HistShiftService (586 行):直方圖位移
- 可逆資訊隱藏技術
- Peak/Zero 點選擇演算法
- 完整的直方圖統計與位移邏輯
工具函式庫開發 (Utilities/)
- ImageHelper (41 行):圖片載入、儲存、格式轉換
- HistogramHelper (46 行):灰階直方圖計算與 Bitmap 生成
- DctUtils (52 行):DCT 與 IDCT 轉換函數
- LogManager (100 行):分級日誌系統(Info, Warning, Error, Debug)
- MetadataHelper (79 行):EXIF 元資料讀寫
UI 開發 (Windows Forms)
- MainForm (708 行 + 919 行 Designer):
- 圖片選擇與預覽
- 演算法選擇(ComboBox)
- 嵌入/提取模式切換
- 進度條視覺化(ProgressBar)
- 結果匯出功能
- LogForm (109 行 + 107 行 Designer):
- 即時日誌顯示(RichTextBox)
- 顏色編碼(Info=Black, Warning=Orange, Error=Red)
- 自動捲動至最新訊息
- ExplanationForm (27 行 + 59 行 Designer):
- LSB 演算法解說
- QIM 演算法解說
- 互動式切換面板
核心功能
1. LSB (最低有效位元) 隱寫
- 嵌入演算法:
- 將訊息轉為 UTF-8 bytes
- 前置 4 bytes 記錄長度(支援最大 4GB 訊息)
- 遍歷圖片像素的 R、G、B 通道
- 每個通道最低 1-2 位元替換為訊息位元
- 容量計算:
寬 × 高 × 3 × bitsToUse
- 提取演算法:
- 讀取前 4 bytes 取得訊息長度
- 從 RGB 通道提取最低位元
- 重組為 bytes 並轉為 UTF-8 字串
- 特色:
- 對人眼幾乎不可見(視覺品質 PSNR > 50dB)
- 容量大(100KB 圖片可嵌入約 37KB 訊息)
- 但抗干擾性較弱(壓縮或濾鏡會破壞)
2. QIM (量化索引調變) 隱寫
- 嵌入演算法:
- 將圖片轉為灰階
- 量化步長 Delta(預設 8)
- 訊息 bit = 0 → 量化至偶數倍數
- 訊息 bit = 1 → 量化至奇數倍數
- 公式:
q = round(pixel / Δ),newPixel = q × Δ + (bit × Δ/2)
- 提取演算法:
- 計算量化索引
q = round(pixel / Δ) - 提取位元
bit = q % 2
- 計算量化索引
- 特色:
- 較強的抗壓縮能力(JPEG 壓縮後仍可提取)
- 直方圖視覺化支援
- 容量較 LSB 小(僅單通道)
3. DCT (離散餘弦轉換) 隱寫
- 嵌入演算法:
- 將圖片分割為 8×8 區塊
- 對每個區塊執行 2D DCT 轉換
- 在中頻係數嵌入訊息(避免低頻與高頻)
- 執行 IDCT 反轉換
- 提取演算法:
- 對區塊執行 DCT
- 從中頻係數提取訊息
- 特色:
- JPEG 壓縮抗性佳(頻域嵌入)
- 視覺品質優良
- 實作複雜度較高
4. Histogram Shift (直方圖位移) 隱寫
- 嵌入演算法:
- 統計灰階直方圖
- 選擇 Peak 點(最高頻率)與 Zero 點(頻率為 0)
- 將 Peak 與 Zero 之間的像素值位移
- 在 Peak 點嵌入訊息(Peak+1 或維持 Peak)
- 提取演算法:
- 識別 Peak 點
- 還原位移像素
- 完全無損提取
- 特色:
- 可逆隱寫:提取後可完美還原原圖
- 容量受限於 Peak 點頻率
- 適用於醫學影像等需無損還原場景
5. 視覺化與日誌系統
- 直方圖生成:
- 256 級灰階統計
- Bitmap 繪製(800×600)
- 僅支援 QIM 演算法
- 日誌系統:
- 4 種等級:Info、Warning、Error、Debug
- 顏色編碼視覺化
- 即時捲動至最新訊息
- 記錄操作時間戳
- 演算法解說:
- LSB 原理說明(位元替換示意圖)
- QIM 原理說明(量化調變公式)
- 互動式切換
使用技術
開發框架
- .NET Framework 4.7.2:目標框架
- Windows Forms:GUI 框架
- C# 7.3:程式語言
- System.Drawing:圖片處理核心函式庫
設計模式
- Strategy Pattern:IStegoService 介面 + 4 種演算法實作
- MVP Pattern:Model (StegoLib) + View (MainForm) + Presenter (MainPresenter)
- Factory Pattern:演算法服務實例化
- Singleton Pattern:LogManager 全域日誌管理
關鍵技術
Unsafe Code:允許不安全程式碼以優化效能
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
指標操作:直接操作 Bitmap 記憶體(BitmapData.Scan0)
泛型與介面:IStegoService<T> 抽象化演算法
事件驅動:IProgress<int> 進度回報
開發工具
- Visual Studio 2019/2022:IDE
- Git:版本控制
專案狀態
當前版本:功能完整(develop 分支)
- 專案結構:雙專案解決方案(StegoLib + StegoApolloUI)
功能完成度
- ✅ 已完成:
- 4 種隱寫演算法(LSB、QIM、DCT、Histogram Shift)
- Windows Forms 圖形介面
- 嵌入與提取完整流程
- 直方圖視覺化(QIM)
- 即時日誌系統
- 演算法解說面板
- 進度指示器
- PNG 格式匯出
- 錯誤處理機制
- 📋 待改進:
- 更多視覺化選項(LSB 通道分離圖)
- 不支援圖片格式的錯誤處理
- 單元測試覆蓋率
- UI/UX 優化
開發挑戰與收穫
1. LSB 演算法實作
挑戰:如何高效地修改像素的最低位元?
解決方案:
- 使用位元運算:
(value & ~mask) | (bit << position) - 清除目標位元:
& ~(1 << b) - 設定新位元:
| (payloadBit << b)
收穫:
- 深入理解位元運算技巧
- 掌握 RGB 色彩空間操作
- 學習訊息長度前置編碼(4 bytes header)
2. QIM 量化索引調變
挑戰:如何在灰階通道實現穩健的嵌入?
解決方案:
- 量化步長 Delta 的選擇(8 為最佳平衡)
- 奇偶量化:
q % 2決定訊息位元 - 公式推導:
newPixel = round(pixel / Δ) × Δ + bit × Δ/2
收穫:
- 理解量化理論與數位訊號處理
- 掌握灰階轉換技術
- 學習抗壓縮隱寫設計
3. Unsafe Code 效能優化
挑戰:SetPixel/GetPixel 效能瓶頸(每次呼叫需 Marshal)。
解決方案:
- 使用
LockBits鎖定 Bitmap 記憶體 - 透過指標直接存取像素陣列
- 批次處理後
UnlockBits解鎖
效能提升:
- SetPixel/GetPixel:約 100-200 ms/pixel
- Unsafe Code:< 1 ms/pixel
- 提升 100-200 倍
收穫:
- 理解 .NET 記憶體管理
- 掌握 Unsafe Code 最佳實務
- 學習效能分析與優化
4. Strategy Pattern 應用
挑戰:如何設計可擴展的多演算法架構?
解決方案:
定義 IStegoService 介面:
public interface IStegoService { StegoResult Embed(Bitmap coverImage, string message, IProgress<int> progress = null); StegoResult Extract(Bitmap stegoImage, IProgress<int> progress = null); }每個演算法獨立實作介面
UI 層透過介面呼叫,無需知道具體實作
收穫:
- 深入理解 Strategy Pattern
- 掌握依賴反轉原則(DIP)
- 學習介面驅動開發
5. MVP 架構設計
挑戰:如何分離 UI 邏輯與業務邏輯?
解決方案:
- Model (StegoLib):核心演算法與資料模型
- View (MainForm):UI 呈現與使用者互動
- Presenter (MainPresenter):協調 View 與 Model,處理事件
收穫:
- 理解 MVP 與 MVC 差異
- 掌握 UI 與邏輯分離技巧
- 提升程式碼可測試性
6. 直方圖視覺化
挑戰:如何將 256 級灰階統計繪製為直方圖?
解決方案:
- 統計每個灰階值的像素數量(陣列
counts[256]) - 找出最大值作為縮放基準
- 使用 Graphics.DrawLine 繪製垂直長條
收穫:
- 掌握 GDI+ 繪圖技術
- 理解直方圖統計原理
- 學習資料視覺化設計
專案亮點
技術創新
- ✅ 4 種隱寫演算法完整實作(LSB、QIM、DCT、Histogram Shift)
- ✅ Unsafe Code 效能優化(100-200 倍提升)
- ✅ 可逆隱寫支援(Histogram Shift)
- ✅ Strategy Pattern 優雅設計
教育價值
- ✅ 互動式演算法解說面板
- ✅ 即時日誌系統追蹤操作
- ✅ 直方圖視覺化展示
- ✅ 4 張螢幕截圖完整工作流程
工程實務
- ✅ MVP 架構分離 UI 與邏輯
- ✅ 雙專案解決方案(類別庫 + 應用程式)
- ✅ 完整的錯誤處理機制
- ✅ 進度指示器提升使用者體驗
學習成果
- ✅ 深入實作資訊隱藏技術
- ✅ 掌握位元運算與指標操作
- ✅ 理解設計模式實際應用
- ✅ 學習 WinForms 複雜 UI 開發
應用程式執行截圖