基于SM4和LSB算法实现图片数字水印加密软件(密码赛)
一、前言
密码赛和星火杯时做的小项目,密码赛的时候是个半成品,没有过初赛,星火杯之前完善了
设计思路
- 最开始是想做一个图片水印用作对图片来源的不可否认性做保护,又考虑保护数据完整性,因此选中了易损水印,并实际使用LSB算法实现。
- 但考虑到传统LSB算法的变换规律十分明显,所以很容易被隐写分析检查出来。因此又添加了一步加密,从而使数据混淆置乱,可以有效防止反解造成的欺骗,达到保密性的目的。
- 因此最终是综合了LSB算法和SM4加密算法,共同完成了本作品
二、相关技术
(一)数字水印技术
1.介绍
常见的图片水印多是在图片上附上文字、logo等信息,可以直观地看出来,除了这种水印外,还可以给图片加一种看不见的水印,比如说是文字信息,在本项目中,这种看不见的水印是特定的图片。
2.特征
一般地,数字水印应具有如下的基本特性:
(1)可证明性:水印应能为受到版权保护的信息产品的归属提供完全和可靠的证据。
(2)不可感知性:不可感知包含两方面的意思,一个指视觉上的不可感知性(对听觉也是同样的要求),即因嵌入水印导致图像的变化对观察者的视觉系统来讲应该是不可察觉的,最理想的情况是水印图像与原始图像在视觉上一模一样,这是绝大多数水印算法所应达到的要求;另一方面水印用统计方法也是不能恢复的,如对大量的用同样方法和水印处理过的信息产品即使用统计方法也无法提取水印或确定水印的存在。
(3)鲁棒性:鲁棒性即健壮性,它对水印而言极为重要。一个鲁棒性强的数字水印应该能够承受大量的、不同的物理和几何失真,包括有意的(如恶意攻击)或无意的(如图像压缩、滤波、扫描与复印、噪声污染、尺寸变化等等)。但易碎水印技术恰恰与之相反,其鲁棒性很低,它所保护信息的微小变化都会引起水印被破坏。
注:本项目所使用的水印技术为易损(脆弱)水印,这种水印对于密钥准确性要求高,对于信息完整性要求高。即容易利用其来达到保护版权和数据完整性的作用。
3.原理
- 图像中的每个像素通常用RGB三个0255的值来表示,转化为二进制就是0000000011111111。
- 把每个值的最后一位全部设为零,这种变化人眼观察不到。
- 这样空出来的最后一位就可以用来存储信息。
- 提取信息的过程就是上述过程的逆:把像素值提取出来,选择最后一位,拼出信息。
4.典型算法
此处介绍我们使用的时域水印嵌入算法——LSB算法(将水印信息嵌入到数据的最低有效位Least Significant Bit)以及加密时使用的算法SM4.
(1)LSB原理
基于不可感知的要求,即数据的变化几乎不会引起使用的者的察觉,将水印信息嵌入到数据的最低有效位(Least Significant Bit),也就是将图片的RGB数值转换为二进制数据,然后用水印替换掉最低位,这种变化对于人眼来说是不可察觉的。
详见数字水印技术:LSB加密详解(附python代码)
- 加密过程就是将水印图片的每个像素点(8位二进制)按照R,G,B的顺序遍历写成一个字符串(字符串中每个R,G,B都需要按照8位向左补齐,保证统一)。
遍历载体图片的每个像素点的R,G,B值,同样转化为二进制,将此每个像素值的最后一位替换为code[count]的值。载体图片原像素值最后一位是通过取8位二进制减去它本身模2得到的。 - 解密过程:由于载体图片中不是所有像素点都被修改了的,而且就算将水印图片的像素点RGB值还原了,但不知道水印图片的宽和高是根本没办法还原水印的,一个像素的差别就可能导致整个图片错位。因此,解密的密钥很明显了,就是水印图片的宽和高。当然,上文str(code)的长度也算密钥,只是这个可以通过宽和高计算的,值等于宽×高×3×8。
遍历载体图片的像素点,从每个像素点的三个像素值中提取最后一位组成原str,从而恢复出水印图片。
(2)LSB相关代码
详见代码
(二)SM4加密算法
SM4是国密分组密码算法,密钥长度和分组长度均为128位
在本项目中,SM4算法用来加密水印图片,使其达到混乱,通过对水印图片遍历产生的二进制字符串str进行分组加密,此时得到的水印图片是加密的混乱状态。我们使用加密过后的水印图片来使用LSB隐写入载体图片。只有拥有LSB密钥及SM4解密密钥的人(即版权拥有者),才能得到真正的水印图片,如果与最初加入的完全一致,即可证明图片的归属以及图片数据的完整性。
(关于SM4详细加解密算法过程不详细介绍)
注意:
在使用SM4算法时有几个需要注意的地方,由于最终待加密的字符串不一定是32位的整数倍:
- 如果我们生成的十六进制明文不能够被32整除,即不能作为完整的n组128位二进制串的整数倍。对于这个问题,我们对加密过程做了一些处理。我们可以先将十六进制明文分为32位一组,最后一组可能凑不够32位,我们暂时将它称为第n组,我们先按顺序加密前n-1组,并按顺序生成n-1组密文,流输出,最后我们对最后一组进行处理,由于它凑不够32位,所以我们可以将刚刚加密过的最后几位密文与第n组的几位凑成一组,保证它的长度为32位,并对其进行加密。
- 这样位数不够的问题就被解决了,但是我们要尤其注意加密顺序的问题,我们可以通过上述流程看到,有些位数是经过二次加密的,所以在解密的过程中存在一个顺序的问题,必须要先解密最后32位,然后才可以按照正序或倒序解密其他密文。同时加密后的密文转化为了可以被32整除的位数。
三、具体算法实现
(一)加密过程
1.加密结构
2.具体步骤
(1)水印图片转换为十六进制串流
我们的思路是通过遍历将每个像素点的RGB值,将遍历出来的RGB分别转化为十六进制后存为三元组,而后拼接为一个六位的串,通过不断遍历读取和输出,从而得到一个按顺序的十六进制串流,且此串流满足我们所要求的可逆性和信息完整性要求。具体实现可以被总结为一个算法,用于实现图片转化为串流形式(这里不一定为十六进制,可以推广)。算法如图
(2)16进制明文SM4加密
这里存在一个问题,那就是如果我们生成的十六进制明文不能够被32 整除,即不能作为完整的n组128位二进制串的整数倍。对于这个问题,我们对加密过程做了一些处理。我们可以先将十六进制明文分为32位一组,最后一组可能凑不够32位,我们暂时将它称为第n组,我们先按顺序加密前n-1组,并按顺序生成n-1组密文,流输出,最后我们对最后一组进行处理,由于它凑不够32位,所以我们可以将刚刚加密过的最后几位密文与第n组的几位凑成一组,保证它的长度为32位,并对其进行加密。
这样位数不够的问题就被解决了,但是我们要尤其注意加密顺序的问题,我们可以通过上述流程看到,有些位数是经过二次加密的,所以在解密的过程中存在一个顺序的问题,必须要先解密最后32位,然后才可以按照正序或倒序解密其他密文。同时加密后的密文转化为了可以被32整除的位数。
(3)十六进制密文转换为加密水印图片
在之前的模块中我们实现了对于一个图片的加密,但是这种加密目前只限于十六进制串流的形式,但是我们想要的其实是加密后的水印图片,所以我们还需要采取一些手段来将十六进制串流恢复为图片。这是从图片转化为十六进制串流的逆过程。
具体是将十六进制串流分组,每组六位十六进制字符,并分别存到三元组内,形成对于该像素点R、G、B值的描述。以此类推,从而得到所有像素点的信息。同样用一个遍历过程实现将信息恢复为图片。这里所使用的过程函数同样可以被总结为一个算法。算法如下图
此处的得到的加密图片应该与原水印图片完全不一致,并且通过加密图片很难得到原水印图片,从而满足了我们当初对水印图片加密的要求。
(4)加密水印图片嵌入载体图片,获得加密图片
(二)解密过程
1.解密结构
2.具体步骤
(1)应用LSB解密算法从载体图片中提取出加密水印图片
数字水印技术有着不可感知的要求。嵌入数字水印后载体数据发生了变化,但不会影响到载体的使用,于使用者而言也不可察觉。因此在我们看来加密图片与原始的载体图片并无异样。
想要得到载体图片里的隐藏信息,即加密水印图,我们选取LSB解密算法将加密水印从载体图片中提取出来,且以最大限度保证提取出的水印图与嵌入前毫无差别。
由于采用的是无法承受大量失真的易损水印,因此水印信息嵌入在数据的最低有效位部分,对整体数据的影响最小。
(2)提取出的加密水印图片转换为十六进制串流
我们想要给加密水印进行SM4解密,就必须将其转换为十六进制串流的形式。与加密过程基本相似,我们依旧采用遍历每个像素点的RGB值,每个像素点的单个坐标都需要用2位16进制来表示,因此每个像素点的总坐标共需6位十六进制来表示。RGB值转换为十六进制后存为三元组,而后拼接为一个六位的串,通过不断地遍历读取和输出,从而得到一个按顺序的十六进制串流。满足我们对其进行SM4解密的要求。
同时,我们发现这与之前将水印图片转化为十六进制的形式几乎相同,所以我们可以沿用算法1。
(3)SM4解密密文串得到十六进制明文串
由于加密模块我们采用了国家密码管理局发布的SM4分组密码算法,此算法为对称密码算法,因此解密密钥与加密密钥相同。SM4算法的明文、密钥和密文都是128bit,加解密算法和密钥扩展算法迭代轮数均为32轮。SM4加解密过程的算法相同,并且使用相同密钥,但在轮密钥的使用顺序上相反,如图
对于密文的解密处理必须要将可以被32整除的十六进制代码恢复为与原始完全相同的十六进制串,因此要先对第n组(同上)进行解密,再对其他组进行解密。其中关键代码如下图
(4)十六进制明文串转换为原始水印图片
从十六进制转化为图片,我们将十六进制串流分组,每组六位十六进制字符,并分别存到三元组内,形成对于该像素点R、G、B值的描述。以此类推,从而得到所有像素点的信息。同样用一个遍历过程实现将信息恢复为图片。
同时,我们发现这与之前将水印图片转化为十六进制的形式几乎相同,所以我们可以沿用上文提到的算法2。
四、运行结果
(一)界面
加密界面
解密界面
(二)测试
要保证水印图片远小于载体图片才可以,要有数量级上的差异,所以我们做了以下选取
载体图片
水印图片
1.加密过程
(1)选择载体图片与水印图片
点击选择载体图片和选择水印图片按钮,从设备中选择载体图片和需要加密的水印图片(注:要求图片的格式应为.bmp)
(2)输入SM4密钥
输入用户自己定义的SM4密钥,此处密钥应为32位十六进制的字符串。
(3)生成加密水印图片并且嵌入载体图片中
该步骤先将原始的水印图片进行SM4加密,然后依据LSB数字水印加密算法嵌入载体图片中,获得加密图片。
通过下载得到的加密水印图片
2.解密过程
(1)先上传要解密的图片
待解密图片
(2)输入水印图片的宽和高
(3)提取出加密水印图片
本产品通过LSB数字水印解密算法将原先嵌入载体图片的加密水印图片提取出来
(4)将加密水印图片复原为原始水印图片
通过SM4解密算法将加密后的水印图片还原,与原始水印图片相比,实现了预期效果与目标
得到的复原水印图片如下图
五、应用前景
(1)数字作品的知识产权保护
(2)商务交易中的票据防伪
(3)图像数据的隐藏标识和篡改提示
(4)隐蔽通信及其对抗
六、总结
数字水印技术是近几年国际上提出的一种全新信息安全领域的技术,正广泛应用于视频、音频、图像等其他数字媒体。由于它在版权保护、真伪鉴别、秘密通信和隐含标注等领域有着广泛的应用前景,因此日益成为一个非常重要的研究领域。传统的加密方法对多媒体内容的保护和完整性认证具有一定的局限性。加密方法只用在通信的信道中,一旦被解密,信息就完全变成了明文,因此访问控制和加密技术只能对数据进行有限的保护,无法防止数据的非法复制和鉴别数字媒体的知识产权。这种方法不修改数字产品的内容,而是将重要信息以附加信息的方式存放在数字产品的头部,或是存为单独的文件,并与产品一起发送给客户,数字签名是其中的典型例子。这种方法的最大缺陷是由于版权信息与作品内容分离,所以很容易被非法去除。在这种情况下,近几年提出了数字水印技术,它将具有确定性和保密性的信息直接嵌入到原始数据,并作为原始数据的一部分而保存在其中,因而即使在原始数据解密之后仍可以鉴定信息是否被篡改,对媒体数据进行有效的保护,这种信息通常是不可见的,只有通过专用的浏览器或阅读器才能提取。数字水印技术既充分利用了网络和数字媒体的便利,又能在一定程度上克服了传统信息安全方法的局限性,为多媒体信息提供有效的保护,因此得到了国内外众多学者的广泛关注,自 1993 年以来,它已引起工业界的浓厚兴趣,并日益成为国际上非常活跃的研究领域。全球支持或开展此项研究的政府机构和研究部门很多,包括美国财政部、欧洲电信联盟、麻省理工学院、微软公司、朗讯贝尔实验室等机构,同时,IBM、日立、NEC、Pionee和Sony五家公司还宣布联合研究基于信息隐藏的数字水印。但是随着计算机技术的发展,单一的数字水印加密技术也出现了漏洞,保密信息容易被非法提取或篡改,传统的数字水印加密算法无法抵御这种非法攻击,因此我们创新出的基于SM4算法的图像数字水印加解密就具有很大的可推广性。
相关代码见密码赛代码