基于模分量的同态加密浅层学习总结(部分)
前言
刚接触到同态加密没多久,前置知识自己几乎没有,只能是平时磕磕绊绊学习了一段时间.这篇文章相当于对最近学习的部分知识进行总结,也用于和组内同学进行交流,认识粗浅,疏漏不通之处恳请指正.
讲解部分的基本逻辑参照前辈论文<基于模分量同态的视频盲处理方法研究与实现>
一 预备知识
中国剩余定理:
我的讲解没有网上的大神讲的好,大家可参照这篇博客学习
https://www.cnblogs.com/MashiroSky/p/5918158.html
这个定理在解密过程中起到关键性作用,解密中直接使用了该定理.
同余定理:
给定一个正整数m,若两个整数a和b满足a-b能被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m).同余定理满足一些性质:自反性,对称性,传递性,同余式相加,同余式相乘......其中同余式相加相乘等具有同态性,为同态加密提供了理论依据,有的知识涉及离散数学,不过多赘述,下附博客一条,大家可以参考:
https://blog.csdn.net/qq_36345036/article/details/77407069
下附部分性质,大家一眼可知其中奥秘:
- 自反性:a≡a (mod m)
- 对称性: 若a≡b(mod m),则b≡a(mod m)
- 传递性: 若a≡b(mod m),b≡c(mod m),则a≡c(mod m)
- 同余式相加:若a≡b(mod m),b≡c(mod m),则a ± c≡b ± d(mod m)
- 同余式相乘:若a≡b(mod m),b≡c(mod m),则ac≡bd(mod m)
模投影定理:有些类似于三维坐标向量投影,例如将3个两两互素的正整数a,b,c作为坐标轴,组成坐标系Oabc,则任何一个正整数N在该坐标系下对a,b,c分别进行取模运算,取模结果记作N(a1,b1,c1),则在范围[0, abc]下,已知a1,b1,c1和坐标系Oabc,可以计算出N的唯一确定值.N(a1,b1,c1)中的a1,b1,c1所组成的集合也被称为一组模基.
这里就可以见到格密码的影子了,当”维数”变得很高时,即使用的模基很多的时候,只知道部分参数要想逆推出明文就变成了一件极其困难的事情(是一个数学困难问题),这也是格密码抗量子计算机攻击的资本.
二 模分量同态部分
1.客户端加密
输入: 明文m0, 模基个数n, 冗余个数m, 密钥S
输出: 密文E, 模基B
(1)生成答数: m’ = am0 + η (a >> η)(对于每一个m0, η都不同)
其中a为放大倍数,η为添加的随机数噪声,即放大并添加噪声
(2)设置模基B(投影基, 可类比坐标轴)
B = {b1, b2, b3, ... ,bn}
(b1, b2, b3, ... ,bn为两两互素的模基元素)
(3)计算真实模分量集M:
M = {m1, m2, m3, ... ,mn}, mi = m’ mod bi , i = 1, 2, ..., n.
将m’ 对与各个模基进行“拆分”(变成模分量)
注意, 这里的m与输入的冗余个数m无关,仅用来代表元素
(4)设置初始冗余集R’:
R’ = {r’1, r’2, r’3, ... ,r’m}
此处的m为冗余个数, 可以自行设定, 但过高会降低服务端计算效率, 过低会降低保密性能(下文会讲解原因), 所以应根据情况合理考虑.
(5)计算冗余集R:
- R =
- Ri = {ri1, ri2, ri3, ... ,rim}, i = 1, 2, ... , n
- rij = (ar’j + η) mod bi, j = 1, 2, ... , n
这其实是做了一个矩阵, 冗余是多出来的意思, 如字面意思就是用多出来的一些无关项来做混淆, 把有效信息插入其中以防破解. rij那一行就是生成生成冗余项的算法, 利用之前设置的初始冗余集R(R好像是通过当前时间戳来生成的)来生成. 算法跟生成答数再计算生成真实模分量的算法很相似, 所以可以起到混淆的作用. 对每一个模分量, 都有m-1个冗余项进行混淆, Ri就是每一个模分量配套的冗余集, 之后会用真实模分量替换掉Ri中的一个冗余项, 即”插入真实模分量”. 对所有真实模分量进行完插入混淆操作后, 就得到了一个mn的集合----冗余集R, 这就是密文.
(6)设置密钥S:
S = {S1, S2, ...Si, ... , Sn}, 0<= Si<= m, i = 1, 2, ... , n
Si每一个真实模分量在Ri中的位置
(7)根据密钥S将真实模分量覆盖到冗余集R中,得到大小为n*m的密文E(m0)
- E(m0) = E1, E2, ... , En
- Ei =
- 当j != Si 时, eij = rij;
- 当j == Si 时, eij = mi.
(其中i = 1, 2, ... , n, j = 1, 2, ... , m)
2.盲计算: 可以进行加同态, 乘同态及其扩展性质, 依赖于同余定理
例:
输入: 密文x = E(X), y = E(Y), z = E(Z)
输出: 计算结果calculate(x, y, z)
注意字母大小写区别, 下文解密会用
3.解密过程
输入: 服务器的计算结果calculate(x, y, z), 模基集B, 密钥S
输出: 还原后的计算结果Decrypt(calculate(X, Y, Z))
(1)客户端依据密钥S将真实模分量集M对应的计算结果d取出
注意参考同余定理,
比如----同余式相加:若a≡b(mod m),b≡c(mod m),则a ± c≡b ± d(mod m)
可见明文经过计算所得的结果需要取模后才与密文经计算后的结果相等
(2)利用中国剩余定理可解出原始数据的f运算结果f(X, Y, Z)
Bs = b1b2...bi , (i = 1, 2, ... , N; N代表模基个数)
Bi = Bs/bi
Bi^(-1)是Bi关于模基bi的乘法逆元
这里需要注意, 首先B = {b1, b2, b3, ... ,bn}, bi是模基
然后是逆元的知识:
当a, b关于模n互为模逆元时, b mod n = 1/a mod n
上述Bi和Bi^(-1)满足: BiBi^(-1) ≡ 1 mod Bs, 这个式子是用中国剩余定理解密的关键.
密文经中国剩余定理处理后的结果为:
(d1B1B1(-1)+d2*B2*B2(-1)+...+dNBNBN^(-1)) mod BS
由于加密时有放大和加噪的操作, 且放大倍数a远大于噪声η, 所以我们只需要将上述式子除以a^t即可得到结果, 其中t是多项式的次数, 对应盲乘法运算
(3)论文中有一个正负判断的操作, 由于今日忙于社会实践, 还没来得及深思, 后续努力补上, 在此致歉.
4.回答组内同学的部分问题
(1)服务方也会拿到真假位置模板, 岂不是没有安全性了?
这里应该是看错了, 首先只有客户才有真假位置模板(密钥S), 库应用方和应用用户方都不是服务方. 在加密和计算过程中, 用户要产生公共参数和秘密参数(即位置模板S), 但服务方只会用到公共参数, 它是对所有数据, 即整个密文, 包含了真实值和冗余值, 进行计算, 最后一并返还. 所以在文章开始才会说要谨慎选择冗余数m, 其会影响到服务方的计算速度和整个过程的安全性.
(2)这个同态加密算法中有电路(深度)的思想吗?
论文中我已看到部分还没有发现有讲电路深度的内容. Gentry的方法中之所以有考虑电路深度, 是因为在玩”套娃”. 每进行一次计算(特别是乘法), 噪声被放大, 为了消除噪声影响, 他在每次计算后使用了一个同态解密电路进行降噪, 得到一个低噪的新鲜密文, 再拿新鲜密文去计算再降噪. 所以产生了增强电路----由同态解密电路和运算电路组成. 而每次运算都伴随着加解密, 势必需要一对公私钥序列, 电路的每一层对应序列中的每一对, 这样密钥数量就与电路的深度形成了线性依赖关系. 由此继续思考, 就会发现电路深度中存在的问题, 进而想办法压缩电路深度......这里就不细说了.
与Gentry的方法相比, 论文中提到的方法好像只有”一层”, 所以就不管这个问题...吧?
(我只是一个刚学密码和计算机的普通学生是真的菜啊我很多都没看完没看懂大家不要再叫我陈指导了啊啊啊啊)
(3)密文中的冗余量是怎么产生的?
我记得代码中是通过时间戳来确定一个冗余初始集R’(写这个文章的时候恰好在外面手上没代码), 然后用R’中的元素通过一个跟m’ = am0 + η基本一致的算法进行计算来得到冗余量的. 可以回看上文, 有过叙述.