简单的数字水印加密技术

来源:互联网 发布:匡恩网络市值是多少 编辑:程序博客网 时间:2024/05/01 08:39

最近我一个朋友问谍战情节里是怎样办到将数据隐藏到一般图片里的,正好有一段时间我也研究过这个问题,既然他问了干脆我就写出来和大家也一起分享一下吧,大都是自己琢磨的,如有更加专业的做法欢迎大家讨论啊。

由于时间比较久远,当年研究的代码找了半天也没找到,其实原理很简单,就不重新编了吧,重点说说思路。

其实数字水印加密技术基本原理是很简单的,我们都知道,一张图片是由红绿蓝三个灰度矩阵组成的,每个灰度矩阵(二维数组)又包含很多个灰度值,灰度值范围为0~255,占8位。这些都是数字栅格图的基本常识,如果不太明白的话可以上网查查相关资料。

现在我们说说这些灰度是怎么隐藏我们秘密的。灰度共分为256个级,但事实上,人眼根本就区分不出563435等等这些靠的很近的灰度值,也就是说你在灰度值上面修改一两个值根本察觉不到图片有什么变化。简单的数字水印加密技术就是基于这个原理的。

具体怎么做呢?

第一步:将你需要加密的数据分解为二进制编码(也可以是8进制或10进制,但是2进制效果最好,16进制最好别用,估计明显能够看出图片做过手脚)。

第二步:按顺序将需要加密的二进制数据(0或者1)对应到图片的每个灰度值(如52),然后修改灰度值,使灰度值的最后一位与相应的二进制数据保持一致。比如说,第三位需要加密的二进制编码数据是1,第三个灰度值是00010100,那么修改后的灰度值就是00010101

第三步:根据修改后的灰度值矩阵重新构建图片就好了,保证你看不出来带加密数据的图片和原图片有什么不一样。

加密这就完成了,那么解密呢?自然是按照你写进去的编码方式读出来就好了。

 

下面几个问题:

一、解密的时候如何知道读到结尾了没有?

可以设计一个结尾标识。

二、可不可以不从第一个灰度值开始记录加密数据?

可以,要设计一个密钥,告诉解密程序从哪里开始读取数据。

三、对数据不放心还可以进一步加密吗?

可以,设计复杂点的密钥,告诉解密软件数据读取数据的顺序和规则、异或计算的数据或其他加密方式的解密提示。比如:0010,1010,1011可能表达的意思是:从第3个灰度值开始是有效数据,有效数据里每读一个数据抛弃一个数据,数据解码的异或运算数字是1011。当然,这些密钥也可以是事先约定好的,也可以直接写在图片里,这就看你怎么设计了。

四、对图片有什么要求吗?

图片最好发杂一点,需要大一点,这种加密方式最多也就能加密点阵数量的3倍的数据,还是比较小的,如果需要加密更多数据可以考虑使用10进制,或者采用更加高效的编码方法。

五、除了加密传送数据,还可以干其他的吗?

可以,比如说通过对添加的水印进行复原可以检测你的图片是否被修改过等等。

原创粉丝点击