這張圖裡,
藏著一句話。

這張灰階影像看起來很普通,但它每個像素的最低位元,都被換成了另一張黑白影像。點一下圖旁的位元,從 bit 7 一路看到 bit 0。

  • —PSNR,肉眼分不出差別
  • —取出時的錯誤率
  • —的像素被改動過
從原理開始看直接動手玩
藏密影像

它是怎麼做到的

從一個像素開始,一步一步看懂 LSB 影像隱藏:怎麼藏、藏完差多少、怎麼加密,以及它會在哪裡被識破。每一段都附一個可以直接操作的小工具。

一個像素就是 8 個位元

灰階影像的每個像素是 0 到 255 的整數,也就是 8 個位元。每個位元代表的份量不同:最左邊的 bit 7 值 128,最右邊的 bit 0 只值 1。

試著翻轉不同的位元。翻 bit 7,亮度整個跳掉一半;翻 bit 0,數值只差 1,眼睛根本看不出來。這個「最低有效位元」(Least Significant Bit,LSB)就是藏東西的地方。

182原本
182翻轉後

點上面任一個位元把它翻轉。

把每一層拆開,就是位元平面

把整張影像所有像素的同一個位元抽出來,會得到一張只有黑白的「位元平面」。bit 7 平面幾乎就是影像的輪廓,越往下越像雜訊。到了 bit 0,原本的影像已經看不出來了。

最上面那張圖旁的 bit 7 到 bit 0 按鈕,就是在看這 8 張平面。正因為 bit 0 本來就像雜訊,換成別的內容也不會有人察覺。

這是還沒藏任何東西的原始影像。拉到 bit 0 看看它本來長什麼樣子。

把秘密寫進最低位元

先把秘密影像轉成黑白,每個像素就只剩 0 或 1。接著把載體每個像素的 bit 0 清掉,再填入對應的秘密位元:

p′ = (p AND 11111110₂) OR s

要取出秘密,只要把藏密影像每個像素和 1 做 AND,也就是 s = p′ AND 1。

工具裡是從影像中隨機挑的 8×8 小區塊。秘密位元剛好等於原本的 bit 0 時,像素完全不變;不一樣時才改動,而且只差 1。

原始灰階值

秘密位元

藏密後(框起來的有改)

藏完到底差多少:MSE 與 PSNR

衡量藏密影像和原圖差多少,最常用的是均方誤差 MSE 和峰值訊噪比 PSNR:

MSE = (1/N) Σ (p′ᵢ − pᵢ)²  PSNR = 10 · log₁₀ (255² / MSE)

LSB 法大約一半的像素要改、每次只差 1,所以 MSE ≈ 0.5,PSNR ≈ 51.14 dB。一般認為 PSNR 超過 30 dB,肉眼就很難分辨。

如果改藏在第 k 個位元,每次改動變成 2ᵏ,MSE 變成 0.5 × 4ᵏ,PSNR 每往上一層就掉約 6 dB。長條圖是用這張圖實際算出來的結果。

粉紅色代表低於 30 dB,藏密影像已經看得出異狀。注意:PSNR 是整張圖的平均,就算高於 30 dB,在平坦的區域也可能隱約看到秘密。

先加密再藏:Arnold 置亂

只用 LSB 藏,任何人把 bit 0 平面抽出來就看得到秘密。所以可以先用 Arnold 轉換(Arnold's cat map)把秘密影像的像素位置打亂:

[x′, y′] = [[2, 1], [1, 1]] · [x, y] mod N

這個矩陣的行列式是 1,所以轉換一定可逆。更神奇的是,重複做固定次數之後影像會自己變回原樣。256×256 的影像,這個週期是 — 次。

做幾次就是金鑰。知道次數的人可以反轉回來;不知道的人只會看到雜訊。置亂只換位置不換數量,所以完全不影響 PSNR。

0 次

按播放看它一路打亂,再在第 — 次變回原圖。

藏起來的東西,會被發現嗎

視覺攻擊:直接看 bit 0 平面。沒加密的秘密一眼就被看穿,置亂過的則像雜訊。

卡方攻擊:LSB 替換只會讓 2i 和 2i+1 這兩個數值互相轉換(例如 100 ↔ 101),當秘密位元是 0、1 各半的亂數時,每一對數值的出現次數會被「拉平」。卡方檢定專門偵測這種現象。

反直覺的是:把秘密加密成均勻亂數,反而最容易被卡方攻擊抓到。改用 ±1 匹配(不同時隨機 +1 或 −1,而不是只翻 bit 0)就不會產生這種成對的痕跡。

bit 0 平面

相鄰數值的出現次數(紫色偶數、粉色奇數)

它最怕的是壓縮

LSB 法把資訊放在最脆弱的地方。JPEG 壓縮會把影像轉到頻率域、捨棄細節再轉回來,每個像素的值都會被改動一點點,bit 0 幾乎全部重洗。

拉動 JPEG 品質滑桿試試。就算品質設到 95,取出的秘密也已經接近亂碼(BER 接近 0.5 就等於亂猜)。所以藏密影像只能用 PNG、BMP 這類無損格式傳送;想要抗壓縮,就得改用 DCT、DWT 等頻率域的隱藏方法。

100

實驗室

把上面所有原理接成一條完整流程。換成你自己的兩張圖、改任何一個參數,六個步驟和數值都會馬上更新。圖片不會上傳到任何地方。

兩張彩色影像
黑白轉換
門檻值128
藏在第幾個位元bit 0

bit 0 是最低位元(LSB)。往上每一層,PSNR 約掉 6 dB。

嵌入方式

直接把位元換掉。

Arnold 加密金鑰37 次
取出時用的金鑰37 次

0 次代表不加密。256×256 的週期是 192 次。

對藏密影像攻擊
—PSNR(dB)
—MSE
—BER
—被改動的像素
—卡方攻擊 p 值
灰階載體0.299R + 0.587G + 0.114B
黑白秘密Otsu
加密後的秘密Arnold 37 次
藏密影像藏在 bit 0
別人看到的位元平面攻擊後的 bit 0
取出並解密的秘密BER 0