图像隐写之使用PHP隐藏图像中的文本

2019-04-01 23:23:27

隐写术是一门研究隐藏信息的科学艺术,通过隐写术,可以只让发送者和接收者知道隐藏的信息。

图像隐写术则是研究将数据隐藏在图像中,通过该技术可以防止无关用户发现这些隐藏的信息或数据。

相关的原理

图像都是由很小的点组成的,这些点就是像素。每个像素由三个字节来表示:一个代表红(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 (自备梯子)


  • 2018-12-04 15:30:01

    如何在Mac OS X上安装 Ruby运行环境

    ​ 对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境。 此安装方法同样适用于产品环境!

  • 2018-12-04 15:31:15

    iOS--Pod install && Pod update

    许多人在最初接触CocoaPods时认为pod install只是在第一次为项目设置CocoaPods时使用,之后都应该使用pod update.看起来是这样,但也不是(But that's not the case at all.)。 这篇文章的目的就是教你啥时候用pod install,啥时候用pod update

  • 2018-12-04 15:33:19

    CocoaPods安装和使用教程

    当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。总之小编的意思就是,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”。所以,你需要 CocoaPods。

  • 2018-12-04 23:37:37

    pod install 和 pod update

    当我们新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件,Podfile.lock文件里存储着我们已经安装的依赖库(pods)的版本。 当我们第一次运行Podfile时,如果对依赖库不指定版本的话,cocoapods会安装最新的版本,同时将pods的版本记录在Podfile.lock文件中。这个文件会保持对每个pod已安装版本的跟踪,并且锁定这些版本。

  • 2018-12-04 23:40:26

    pod删除已导入的第三方库和移除项目中的cocoapods

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。在我们有了CocoaPods这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数. 但是如果我们导入的某个第三方不适用,或者我们又不想使用该第三方,那我们又该如何将这些相关的东西从我们的项目中清理出去呢?

  • 2018-12-04 23:41:47

    制作自己的Pod库(公有/私有)

    目的:1.管理自己常用的类;2.组件化开发步骤:1.想一个比较酷的名字,在桌面简历文件夹。2.打开terminal,cd到这个文件夹下面,执行pod lib create  xxx(这里我们以JJCategoryKit为例子,下同)命令,如下图。这个过程会问几个问题,根据实际情况输入回答即可。这里我们选择添加demo,结束的时候会自动Lanuch这个app. 作者:深水日月 链接:https://www.jianshu.com/p/ece0b5721461 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2018-12-05 06:08:26

    CocoaPods建立私有仓库 spec repo

    好多项目里都有公共的组件,copy来,copy去很容易出错,而且不容易维护,所以就想到用用cocoapods 建自己的私有库,Carthage用法虽然相对简单,但是它是把公共组件都放在framework里不容易单步调试,所以我还是选择用Cocoapods 来建立私有仓库 参考使用Cocoapods创建私有podspec

  • 2018-12-05 15:11:18

    为什么 Objective-C非常难

    作为一个Objective-C的coder,我总能听到一部 分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这 些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。

  • 2018-12-05 15:22:23

    十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有的同学会感觉像是看天书一样。不过,语言都是相通的,有很多共性。下面列出Objective-C语言的语法和Java,C++的对比,这样你就会很容易Objective-C的语法是怎么回事了。

  • 2018-12-05 15:33:33

    一篇文章看懂有关iOS开发语言的一切!

    OS开发语言有哪些?OS开发语言主要包括什么?iOS开发语言具体怎么学习?今天重点介绍一下: iOS开发语言主要包括:C语言基础、Obiective-C编程、Swift、UIKit框架详解这几大块,在这里项目阶段就不详细的介绍了。 C语言基础 C语言是开发语言的基础,是最常用的一门程序设计语言,最常用于编写计算机程序。