影像隱寫之使用PHP隱藏影像中的文字

Editor發表於2018-02-07


隱寫術是一門研究隱藏資訊的科學藝術,通過隱寫術,可以只讓傳送者和接收者知道隱藏的資訊。

影像隱寫術則是研究將資料隱藏在影像中,通過該技術可以防止無關使用者發現這些隱藏的資訊或資料。

相關的原理

影像都是由很小的點組成的,這些點就是畫素。每個畫素由三個位元組來表示:一個代表紅(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  轉載請註明來自看雪社群

相關文章