隱寫術是一門研究隱藏資訊的科學藝術,通過隱寫術,可以只讓傳送者和接收者知道隱藏的資訊。
影像隱寫術則是研究將資料隱藏在影像中,通過該技術可以防止無關使用者發現這些隱藏的資訊或資料。
相關的原理
影像都是由很小的點組成的,這些點就是畫素。每個畫素由三個位元組來表示:一個代表紅(Red),一個代表綠(Green),一個代表藍(Blue)。這三種顏色的組合決定了畫素的實際顏色。
紅色:
二進位制:11001001
十進位制:201
綠色:
二進位制:11111000
十進位制:248(原文此處為201,實際應為248)
藍色:
二進位制:00000011
十進位制:3
這一組合呈現的畫素顏色是橙色。
影像隱寫的基本原理就是修改LSB(Least Significant Bit,最不重要的那一bit)並不會被人眼察覺到。所以我們修改RGB的LSB值來儲存隱藏資訊,同時不影響影像的顏色。
在這個例子中,我們僅僅修改藍色的LSB,但是如果我們想的話,也可以修改所有的紅,綠和藍的成分。不過只修改藍色的LSB,我們可以隱藏的資訊更少一些。我們也可以將要隱藏資訊的長度儲存到影像中,不過本教程中還沒有做這一點。
假設我們現在要將1101藏到圖片中。
首先我們要得到圖片中每個畫素的RGB值,因為我們要隱藏4bit的資料,而且我們要修改藍色的部分,所以我們需要4個畫素。
假設圖片前4個畫素的RGB值如下:
11001100 10010001 00101011
00011000 11110000 11111110
11100010 00100101 01010101
11111101 00001010 01000011
現在,我們將這4個RGB值最後的bit替換成1101,
現在新的RGB值變成了:
11001100 10010001 00101011
00011000 11110000 11111111
11100010 00100101 01010100
11111101 00001010 01000011
加粗的最後一bit,就是我們要隱藏到圖片的資訊。
現在將新的RGB值應用到畫素,因為人眼並不會注意到這種改變,所以圖片看起來還是一樣的。
加密的部分到現在就完成了,接下來我們將解密隱藏在圖片的資訊。
為了達到這一點,我們需要取出每個畫素的RGB值,然後合併LSB來得到我們隱藏的資訊。
用PHP實現
我們需要一張圖片和3個php指令碼來實現基本的影像隱寫。
encrypt.php
decrypt.php
functions.php
1.jpg
encrypt.php
include('functions.php');
$message_to_hide = 'hello';
$binary_message = toBin($message_to_hide);
$message_length = strlen($binary_message);
$src = '1.jpg';
$im = imagecreatefromjpeg($src);
for($x=0;$x<$message_length;$x++){
$y = $x;
$rgb = imagecolorat($im,$x,$y);
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$newR = $r;
$newG = $g;
$newB = toBin($b);
$newB[strlen($newB)-1] = $binary_message[$x];
$newB = toString($newB);
$new_color = imagecolorallocate($im,$newR,$newG,$newB);
imagesetpixel($im,$x,$y,$new_color);
}
echo $x;
imagepng($im,'simple.png');
imagedestroy($im);
?>
decrypt.php
include('functions.php');
$src = 'simple.png';
$im = imagecreatefrompng($src);
$real_message = '';
for($x=0;$x<40;$x++){
$y = $x;
$rgb = imagecolorat($im,$x,$y);
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$blue = toBin($b);
$real_message .= $blue[strlen($blue)-1];
}
$real_message = toString($real_message);
echo $real_message;
die;
?>
functions.php
function toBin($str){
$str = (string)$str;
$l = strlen($str);
$result = '';
while($l--){
$result = str_pad(decbin(ord($str[$l])),8,"0",STR_PAD_LEFT).$result;
}
return $result;
}
function toString($binary){
return pack('H*',base_convert($binary,2,16));
}
?>
更多的資訊可以檢視這個視訊:
視訊地址:yotube: https://youtu.be/qH0wLIwZa0U (自備梯子)
本文由看雪翻譯小組 LImp 編譯,來源thedebuggers 轉載請註明來自看雪社群