摘要
- 引入了抽象软件水印 的概念
- 基本思想:水印隐藏在程序代码里面,只有通过对代码具体语义的抽象解释才能把水印提取出来
- 即使只有一小部分程序,也能恢复水印
抽象水印
- 是静态水印:提取签名不需要执行程序(不需要特殊输入)
- 是动态水印:隐写签名隐藏在程序的具体语义中(可能是非标准的语义),但是执行隐写程序(或仅执行插入主体程序中的隐写标记)不会显示隐写签名
- 与现有静态/动态方法的不同点:隐写签名提取是通过对隐写程序的静态分析,即通过对其具体语义的抽象解释(由此获得这种水印方法的“抽象”限定符)
Method
1. Principals
选择某个抽象 以及抽象提取器
用隐写签名 给程序 打水印,生成隐写程序 ,而水印 由可以被抽象提取器 从它的抽象语义 $ \bar {R}_\alpha [wp]$ ,该语义完全由抽象 指定。通过保证 和 $\bar {\varepsilon}(Q) $ 机密,可以让(潜在攻击者)提取水印变得很困难。
2. 抽象软件隐写签名嵌入
2.1 签名
一个秘密的签名是一个任意大的自然数C, 实践中由于变量最大值的限制,C的取值总是存在一个上界。为了摆脱这种上界的限制,利用中国剩余定理 ,可以同构地嵌入 个密钥,使得:
故,密钥可以假设为一个元组
隐写签名嵌入的原理是向程序添加一个隐写标记以隐藏常量 ,知道 个隐写密钥 后,可以接连运行 次静态分析来得到秘密签名
2.2 隐写标记
分为三部分
- 声明部分:引入一个辅助的隐写变量
w
, 隐藏密钥 的值 - 初始化阶段:给
w
赋值w = P(1)
- 迭代阶段:
w = Q(w)
一旦初始化后,w
就成为常量,这一性质用于提取隐写签名
Q:Although it is constant in the value of will appear to be stochastic随机的 in successive executions of the stegomark iteration part (w).
2.3 隐写标记嵌入程序
嵌入的空间:Java 类中的方法
- 声明部分被放入方法 的声明中
- 初始化部分被嵌入到方法 初始基本块的随机位置
- 迭代部分被在之后被插入方法 的主体部分的随机位置(倾向于插入循环体)
2.4 混淆隐写标记
w = P(1)
w = Q(w)
P
Q
都是多项式函数(以二阶多项式为例,如有需要也可使用更高阶的多项式),其中:
、 为随机整数, 、 的取法保证了在模 后(?)
这一通过添加临时变量T完成上述计算
1 | W = 1 |
, 是不太大的非零随机数,的取值为:
来保证
同理可通过增加临时变量完成运算
3. 提取隐写标记
通过定义 ,使得$ \bar {R}_{αi} [P] $对 的所有方法 在 中执行恒定传播,静态分析将能够识别某个变量(即 W
)在初始化后在 中具有常量值 (或者最终如果死变量已被重用),从而表明方法 M
已被水印。
*关于$ \bar {R}{α} [P] \bar {R}{α} [P] P$可到达状态的近似值”,获取它的方法看不懂
返回的结果是方法 P
的局部整数变量的常量值
静态分析
graph TB a["从每个方法P获取具体语义"]-->b["抽象化:在对应于单个的抽象域中传播常数的连续(或同时或并行)静态分析"] b-->c["获取抽象语义"]-->d["应用静态分析验证水印"]