【学习笔记】STC校验子格编码 syndrome-trellis code

这篇具有很好参考价值的文章主要介绍了【学习笔记】STC校验子格编码 syndrome-trellis code。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考书:隐写学原理与技术 第11章 校验子格编码
两篇原始论文:
Minimizing Embedding Impact in Steganography using Trellis-Coded Quantization
Minimizing Additive Distortion in Steganography using Syndrome-Trellis Codes

STC toolbox
CSDN输入公式

背景:

已有的隐写编码局限性:

  • 矩阵编码和GLSBM在分组上进行优化,但不能进行全局优化。
  • 湿纸编码提取方程难构造。

校验子格编码STC基本解决以上问题,提供了求解加性模型PLS(限负载求最小失真)问题方法。

STC基本思想

STC的校验矩阵是由子矩阵排列成的带状阵,避免构造高维线性提取方程,基于局部性质进行优化,提前排除不可能达到最优的构造路线,最后选择全部满足局部提取方程,并且失真(嵌入次数或失真函数定义与隐写安全相关的指标)总和最低的构造路线。
STC类似于通信中的卷积码viterbi解码。
viterbi编码思想介绍:如何通俗地讲解 viterbi 算法?(知乎)
B站 【信息论基础】第7章有噪信道编码—卷积码
B站 国防科技大学-信息论与编码基础(国家级精品课)P65-66

STC算法描述

STC算法产生目标向量(最优涉密载体)y、奇偶校验矩阵H:

  1. 使式子 H y T = m Hy^{T}=m HyT=m 成立
  2. 寻找向量 y y y,使下列式子(失真和)最小, D ( x , y ) D(x,y) D(x,y) x x x y y y 之间的(汉明)距离
    【学习笔记】STC校验子格编码 syndrome-trellis code
  3. m是要传递的秘密消息,长度为b,即 m = m 1 m 2 m 3 . . . m b m=m_1m_2m_3...m_b m=m1m2m3...mb

H为校验矩阵,由高为 h h h,宽为w的基础矩阵 H ^ h × w \hat{H}_{h×w} H^h×w生成。(涉密)原始载体的长度为 n n n , n = w ∗ b n =w* b n=wb
基础矩阵 H ^ h × w \hat{H}_{h×w} H^h×w
【学习笔记】STC校验子格编码 syndrome-trellis code
将基础矩阵按照对角线方向不断重复,得到下面的校验矩阵H。最后几次复制不完整,但不影响校验和提取。
【学习笔记】STC校验子格编码 syndrome-trellis code
STC编码可以看作通过逐步修改x或者逐步构造y,使得 H y T = m Hy^{T}=m HyT=m 并满足失真和最小。在逐步构造提取方程时,STC 每次通过新加入 w w w y y y 中元素传输一个消息比特m,依次构造以下等式并记录其有效解 y j y_j yj,与修改叠加量 e j e_j ej;
【学习笔记】STC校验子格编码 syndrome-trellis code【学习笔记】STC校验子格编码 syndrome-trellis code
由于矩阵H的特殊形式,根据矩阵乘法原理 H y T = m Hy^{T}=m HyT=m, 只有向量的 前w 比特能影响消息 m 的第一比特(第1子块),同样,m 的第二比特仅受 y 的 前2w 比特的影响,m的第三比特仅受 y 的第 w+1 位至第 3w 位的比特影响,以此类推。

STC算法格子图构成

为了描述STC算法,需要先介绍格子图的组成。
【学习笔记】STC校验子格编码 syndrome-trellis code
(1)子块。格子图包含m个子块,依次代表 H m × n H_{m×n} Hm×n中对角线方向相应子矩阵 H ^ h × w \hat{H}_{h×w} H^h×w的处理;每个子块有 q n q^n qn行w+1列,子块中两个相邻列上的节点由连线从左向右连接。
(2)位置(列编号)。除了每个子块的第一列,格子图的所有列依次编号为{1,2,…,n},表示当前考虑修改的载体位置;每个子块的首列仅包括子块的局部校验子初态,因此,第i个子块的首列用 p i p_i pi标识。
(3)局部校验子(行编号)。每行依次编号为{0,1,···, q n q^n qn-1},一般用q进制表示当前得到的局部校验子(partialsyndrome),即当前子块计算能够影响到的m中子段;注意局部校验子值是低位靠右,对应局部校验子向量的上部。
(4)节点。每个子块节点表示一个路径上阶段性的状态集合,它反映了一个阶段点上的位置、局部校验子与失真等的状态;连线通过的节点为可达节点;在两个子块间,按照当前考察区域上是否满足 ( H y ) i = m i (Hy)_i=m_i (Hy)i=mi的原则选择可达节点进入下一子块的第一列,下一子块对应在下一区域隐藏下一个消息符号,当前局部校验子状态低位删除高位补0,因此子块首列节点总表示子块计算之前的初态集合。
(5)失真(节点标注)。节点上记录的数字表示连线上所表示嵌入方法当前的总失真(代价),即截至目前连线上前面修改的加性失真总和;编码算法将适时比较各个节点上的失真状态,及时删除那些到达同一节点上失真更大或者相同的路径。
(6)连线。子块内每个可达节点的q个分支代表不同嵌入方法,这使得 e i e_i ei不同;子块间的连线仅表示有效状态节点进入下一子块。注意,连线的方向并不表示特定的修改方式,它仅连接 y i y_i yi当前的状态以及不修改或者修改后的状态;虚线表示删除的路径。
以上第i个子块图通过w层的发展确保了 m i m_i mi可通过 H y = m Hy=m Hy=m提取, y i y_i yi决定了是否以及如何将H的第i列加到校验子中。

具体例子

本节介绍的STC算法以载体系数修改数量作为秘密信息的嵌入代价衡量指标。

x = 10110001 x=1011 0001 x=10110001 中嵌入 m = 0111 m=0111 m=0111 ,求 y y y(也就是修改后的 x x x),失真为修改次数
【学习笔记】STC校验子格编码 syndrome-trellis code【学习笔记】STC校验子格编码 syndrome-trellis code

  1. 对第1子块的处理:最初状态为0,从 p 0 p_0 p0列的00状态出发,此时失真为0。
    00状态二分发展: y 1 y_1 y1不修改,即保持原来的 x 1 x_1 x1,也就是1,对应将H的第1列加入校验子,进入 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11](也就是11)状态,失真和 e 1 e_1 e1为0;若修改 y 1 y_1 y1,即把 x 1 x_1 x1改为0,对应不将H的第一列加入校验子,维持 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00](也就是00)状态,失真和 e 1 e_1 e1为1。
    不修改 y 1 y_1 y1的11状态继续二分发展: 若保持 y 2 y_2 y2不修改,即保持原来的 x 2 x_2 x2,也就是0,对应不将H的第2列 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]加入校验子,进入 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]+ [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]= [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]状态(这里的加号可理解为异或⊕),失真和 e 2 e_2 e2为0;若修改 y 2 y_2 y2,即把 x 2 x_2 x2改为1,对应将H的第2列 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]加入校验子,进入 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]+ [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]= [ 0 1 ] \begin{bmatrix} 0 \\ 1 \\ \end{bmatrix} [01]状态,失真和 e 2 e_2 e2为1。

    修改 y 1 y_1 y1的00状态继续二分发展: 若保持 y 2 y_2 y2不修改,即保持原来的 x 2 x_2 x2,也就是0,对应不将H的第2列 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]加入校验子,进入 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]+ [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]= [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]状态,失真和 e 2 e_2 e2为1;若修改 y 2 y_2 y2,即把 x 2 x_2 x2改为1,对应将H的第2列 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]加入校验子,进入 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]+ [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]= [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]状态,失真和 e 2 e_2 e2为2。

    这样就完成了对第一子块的处理。 m 1 m_1 m1为0,因此只有 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00] [ 0 1 ] \begin{bmatrix} 0 \\ 1 \\ \end{bmatrix} [01]状态可以进入下一子块,因为这两个状态满足低位为 0 的要求,失真和分别为1和2。
    【学习笔记】STC校验子格编码 syndrome-trellis code

注意:这里的局部校验子是低位靠右,对应校验子向量的上部。如H的第二列向量(第1子块内) [ 0 1 ] \begin{bmatrix} 0 \\ 1 \\ \end{bmatrix} [01] 对应的校验子是10。

  1. 对第2子块的处理:对上面的 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00] [ 0 1 ] \begin{bmatrix} 0 \\ 1 \\ \end{bmatrix} [01]状态,删除低位(这里是0),在高位补0,分别进入 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00] [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]状态,失真和分别为1和2。
    00状态二分发展: 若保持 y 3 y_3 y3不修改,即保持原来的 x 3 x_3 x3,也就是1,对应将H的第3列 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]加入校验子,进入 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]+ [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]= [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]状态,失真和 e 3 e_3 e3为1;若修改 y 3 y_3 y3,即把 x 3 x_3 x3改为0,对应不将H的第3列加入校验子,维持 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00]状态,失真和 e 3 e_3 e3为2。
    01状态二分发展: 若保持 y 3 y_3 y3不修改,即保持原来的 x 3 x_3 x3 ,也就是1,对应将H的第3列 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]加入校验子,进入 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]+ [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]= [ 0 1 ] \begin{bmatrix} 0 \\ 1 \\ \end{bmatrix} [01]状态,失真和 e 3 e_3 e3为2;若修改 y 3 y_3 y3,即把 x 3 x_3 x3改为0,对应不将H的第3列 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} [11]加入校验子,维持 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10]状态,失真和 e 3 e_3 e3为3。

    上面的四种状态再分别二分发展:(为了后续表述方便,校验子不再写成向量形式)
    11状态二分发展(此时失真和 e 3 e_3 e3为1): 若保持 y 4 y_4 y4不修改,即保持原来的 x 4 x_4 x4,即1,对应将H的第4列10加入校验子,进入11+10=01状态,失真和 e 4 e_4 e4为1;若修改 y 4 y_4 y4,即把 x 4 x_4 x4改为0,对应不将H的第4列10加入校验子,维持11状态,失真和 e 4 e_4 e4为2
    00状态二分发展(此时失真和 e 3 e_3 e3为2): 若保持 y 4 y_4 y4不修改,即保持原来的x_4,即1,对应将H的第4列10加入校验子,进入00+10=10状态,失真和 e 4 e_4 e4为2;若修改 y 4 y_4 y4,即把 x 4 x_4 x4改为0,对应不将H的第4列10加入校验子,维持00状态,失真和 e 4 e_4 e4为3。(失真和较大,被删除,用图中虚线表示)
    10状态二分发展(此时失真和 e 3 e_3 e3为2): 若保持 y 4 y_4 y4不修改,即保持原来的 x 4 x_4 x4,即1,对应将H的第4列10加入校验子,进入10+10=00状态,失真和 e 4 e_4 e4 为2;若修改 y 4 y_4 y4,即把 x 4 x_4 x4改为0,对应不将H的第4列10加入校验子,维持10状态,失真和 e 4 e_4 e4 为3(失真和较大,被删除)
    01状态二分发展(此时失真和 e 3 e_3 e3为3): 若保持 y 4 y_4 y4不修改,即保持原来的 x 4 x_4 x4,即1,对应将H的第4列10加入校验子,进入01+10=11状态,失真和 e 4 e_4 e4为3(和上面的11状态相比,被删除);若修改 y 4 y_4 y4,即把 x 4 x_4 x4改为0,对应不将H的第4列10加入校验子,维持01状态,失真和 e 4 e_4 e4为4(失真和较大,被删除)
    此时第二子块处理完毕。 m 2 m_2 m2为1,选择满足低位为1的状态,也就是01和11,失真和分别为1和2,其他路径被剪去。
  2. 对第3子块进行处理:对上面的01和11状态,删除低位(这里是1),在高位补0,分别进入00和01状态,失真和分别为1和2。再进行上述类似步骤;
  3. 最后一个子块不完整,使用时在高位补0 ,即第7列为 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \\ \end{bmatrix} [10],也就是01;第8列为 [ 0 0 ] \begin{bmatrix} 0 \\ 0 \\ \end{bmatrix} [00],也就是00;继续进行上述类似步骤;
  4. 对所有子块处理完毕后,找到失真和最小的路径,进行回溯,得到修改载体,如图所示。
    【学习笔记】STC校验子格编码 syndrome-trellis code

STC解码

由于 H y T = m Hy^{T}=m HyT=m,STC 的解码过程就是用 带状矩阵 H H H 逐行乘以 y y y 并逐元素输出 m m m 的过程。发送方与接收方共享STC编码中的校验矩阵,接收方通过校验矩阵与载密图像相乘提取秘密消息。但实验表明,存在一个小的概率使 STC在嵌入时无法得到可行解,从而导致嵌入失败,不过这一般可以通过减少消息量或更换位置置乱密钥解决。文章来源地址https://www.toymoban.com/news/detail-448848.html

到了这里,关于【学习笔记】STC校验子格编码 syndrome-trellis code的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包