FME中的栅格数据操作之十一——Steganography(资讯隐藏)

原文发布时间:2010-05-01

作者:毛毛虫

隐写术)是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写的信息通常用一些传统的方法进行加密,然后用某种方法修改一个“伪装文本”(covertext),使其包含被加密过的消息,形成所谓的“隐秘文本”(stegotext)。

这里说一下FME中简单的加密解密问题,这实际上也是一个RasterExpressionEvaluator函数应用的例子。

如下,我现在两张影像:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

 观察下这两幅影像的不同。好像这两幅影像是一样的,没有什么区别。

如果以两幅影像作为源数据,通过一个RasterExpressionEvaluator转换器,设置如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

if(A[0]-B[0]==0,0,255)这个表达式就是说如果两个影像的像素相同,就输出黑色,否则输出白色。执行后生成的数据如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

下面是个加密解密的示例。对于下面这幅原始影像,我们根据影像中写入一段文字,形成加密文字,然后再解读出来。

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

加密。

使用转换器RasterPropertiesExtractor提取这个影像的属性(为了找出影像的范围,使得写入的文字中影像的范围内)。生成加密字段的过程如下:使用2DpointReplacer在影像范围内生成一个点,然后给这个点设置一个lable属性,把需要加密的文章作为这个属性的值(可以设置一个Published Parameter来修改加密文本的内容)。

例如,我们设置AttributeCreator转换器如下图,Value的内容为:Steganography ,\nis the art and science \nof writing hidden messages

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

此时生成的是一个含有属性lable(值为Steganography ,\nis the art and science \nof writing hidden messages)的点。

使用LabelPointReplacer转换器生成注记点(label point)之后再使用TextStroker转换器转换点为聚类多边形。

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

栅格化这个聚类多边形为一个栅格数据(数据类型与原类型一致)。ImageRasterizer设置如***意行列数及生成的栅格数据的范围与源数据一致):

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

还有个需要注意的问题是在FME2010中,默认的Fill Background with Nodata设置为Yes,改为no。否则在执行RasterExpressionEvaluator时会提示:

RasterExpressionEvaluator(RasterEvaluationFactory): Some bands used in expression 0 have a nodata value and some bands do not.  Please ensure that all bands used in an expression have the same nodata value, or all bands used in an expression have no nodata value

A fatal error has occurred. Check the logfile above for details

这个在前面的内容中已经说过,不再重复。生成的栅格数据如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

最后把这个栅格化的文本数据与原影像通过转换器RasterExpressionEvaluator计算,源数据写入A端口,生成的栅格写入B端口,该转换器设置为

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

表达式为:if(B[0]!=0,A[0]+1,A[0]);if(B[0]!=0,A[1]+1,A[1]);if(B[0]!=0,A[2]+1,A[2]),也就是说,对于文本生成的栅格中如果有信息,原影像的像素加1,否则保持原值。生成的数据如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

看似与源数据相同,但是我们放大到有文本的地方,对比下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

源影像单元格的属性如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

新影像单元格的属性如下:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

可见在有文本的地方单元格的每个波段增加1,而没有文本的地方保持不变。

下面我们对上面生成的栅格数据,解密,如文章开头所示的例子,使用转换器RasterExpressionEvaluator(表达式if(A[0]-B[0]==0,255,0)),转换后的结果是:

FME中的栅格数据操作之十一——Steganography(资讯隐藏)

这种方法对于水印影像可能很有用,不过使用有损压缩会破坏隐藏的信息(压缩需要比水印更复杂的算法)。