非对称加密算法
RSA
RSA 算法基础
- 欧拉函数:任意给定正整数 n,在小于等于 n 的正整数中,有多少个数与 n 构成互质关系?计算这些值的方法叫做欧拉函数,以 \(\varphi(n)\) 表示。
- 欧拉定理:如果两个正整数 a 和 n 互质,则 n 的欧拉函数可以让下面的等式成立:
也就是说,a 的 \(\varphi(n)\) 次方被 n 除的余数为 1,或者说,a 的 \(\varphi(n)\) 次方减去 1,可以被 n 整除。
- 费马小定理:是欧拉定理的一个特殊情况,假设正整数 a 和质数 n 互质,因为质数 n 的 \(\varphi(n)\) 等于 n-1,则欧拉定理可以写成下面的公式:
- 欧拉函数之积:如果 n 可以分解成两个互质的整数之积,即 \(n = p_1 \times p_2\),则积的欧拉函数等于各个因子的欧拉函数之积
- 模反元素:如果两个正整数 a 和 n 互质,那么一定可以找到整数 b(a 的模反元素),使得 \(ab-1\) 被 n 整除:
显然,模反元素不止一个,而欧拉定理可以用来证明模反元素必然存在:
\(\begin{equation} a^{\varphi(n)}=a \times a^{\varphi(n)-1} \equiv 1(\bmod n) \end{equation}\)
密钥生成
RSA 算法的安全性基于两个大素数的乘积难以分解回原来的素数!
- 随机选择两个不相等的质数 p 和 q,比如 61 和 53,实际应用中,这两个质数越大,就越难破解
- 计算 p 和 q 的乘积 n
- 计算 n 的欧拉函数 \(\varphi(n)\):\(\varphi(n)=\varphi(p \times q)=\varphi(p) \times \varphi(q) = (p-1) \times (q-1)\)
- 随机选择一个整数 e,选择条件是 \(1 < e < \varphi(n)\),且 e 和 \(\varphi(n)\) 互质
- 计算 e 对于 \(\varphi(n)\) 的模反元素 d: \(ed \equiv 1(\bmod \varphi(n))\),这个式子等价于 \(ed - 1= k \times \varphi(n)\) (可以将 d 和 k 视为 x 和 y)
- 将 n 和 e 封装成公钥,n 和 d 封装成私钥
注意,公钥中包含 n,如果攻击者能够根据 n 反推出 p 和 q,就能计算出私钥,可以看出,RSA 的安全性是基于大整数因素分解及其困难这一假设。目前,大整数因数分解除了暴力破解,没有很好的解决方案。
加密与解密
- 加密:生成公私钥之后,我们就可以进行加密计算了,加密计算公式为:\(m^e \equiv c(\bmod n)\),其中 m 就是要加密的信息,c 就是计算生成的密文。
- 解密:解密使用计算公式:\(c^d \equiv m(\bmod n)\)
为什么用私钥解密就一定可以得到 m 呢?根据加密公式可知:\(c = m^e - kn\),将 c 代入解密公式可得 \(\left(m^e-k n\right)^d \equiv m(\bmod n)\),等同于求证 \(m^{e d}{\equiv m}(\bmod n)\),证明过程有点复杂,这里先略过。
基于 RSA 算法的盲签名
盲签名是一种在不让签名者获取所签署消息具体内容的情况下进行数字签名的技术。盲签名允许拥有消息的一方先将消息盲化,而后让签名者对盲化的消息进行签名,最后消息拥有者对签字除去盲因子,得到签名者关于原消息的签名。
盲签名的一个通俗的解释是:Alice 想让 Bob 在一张信件上签名,但是不想让 Bob 看到信件上面所写的字。于是,Alice 在信件上面放了一张复写纸,然后将信件和复写纸放到了信封中交给 Bob。Bob 在拿到信封之后直接在信封上面签字,这样字迹就通过复写纸写到了信件上。Alice 拿到信封之后就可以得到 Bob 签过字的信件。
基于 RSA 算法可以实现盲签名,假设 Alice 要让 Bob 对消息 \(m\) 进行盲签名,Bob 拥有私钥对 \((n, d)\) ,并共享了公钥对 \((n, e)\) ,其具体实现步骤如下:
- Alice 选取与 \(n\) 互质的盲因子 \(k\),然后计算 \(t=m k^e(\bmod n)\) ,并把 \(t\) 发送给 Bob。
- Bob 对 \(t\) 进行签名,即计算 \(t^d \equiv\left(m k^e\right)^d(\bmod n)\),并把计算结果发送给 Alice。
- Alice 计算盲因子 \(k\) 的逆元 \(k^{-1}\) ,并计算 \(s \equiv k^{-1} t^d(\bmod n)\),根据费马小定理,可得 \(t^d \equiv\left(m k^e\right)^d \equiv m^d k^{e d-1} k \equiv m^d k(\bmod n)\) ,进而可得 \(s \equiv k^{-1} m^d k \equiv m^d(\bmod n)\) 。
最终 Alice 获得了 Bob 的签名,但 Bob 并不知晓所签名的消息 \(m\) 的具体内容,即 Alice 获得了 Bob 的盲签名。
不经意传输(Oblivious Transfer)
公钥密码系统主要依赖三大数学难题:大整数因子分解难题、离散对数难题、椭圆曲线上的离散对数难题
详见 公钥密钥系统依赖的三大数学难题
也称茫然传输,提出了一种在数据传输与交互过程中保护隐私的思路。在不经意传输协议中,数据发送方同时发送多个消息,而接收方仅获取其中之一。 发送方无法判断接收方获取了具体哪个消息,接收方也对其他消息的内容一无所知。
二选一不经意传输:Alice 每次发送两条信息 \((m_1, m_2)\) 给 Bob,Bob 提供一个输入,并根据输入获得输出信息,并根据输出获得输出信息,在协议结束后,Bob 得到了自己想要的那条信息,而 Ailce 并不知道 Bob 最终得到的是哪条。
基于 RSA 加密算法:大数因数分解难题
大数因数分解难题涉及将一个大的合数分解为其素数因子, 详见 RSA 算法基础。
下面来看一种基于 RSA 加密算法的不经意传输协议的实现方式:
假设发送者 Alice 有 N 个电话号码 \(m_1, ..., m_N\),接受者 Bob 只能从中选取一个,但又不想让 Alice 知道他拿了哪一个号码。
- 发送者 Alice 生成一对 RSA 公私钥,并将公钥 (n, e) 发送给接受者 Bob
- Alice 方生成 N 个随机数 \(X_1, ..., X_N\),将它们发送给接收者 Bob
- Bob 方生成一个随机数 k 以及一个编号标识 b(也就是 Bob 选择了第 b 个电话号码),b 是 Bob 需要保密的信息
- Bob 方用接受到的公钥加密 k,同时用自己选中的 \(X_b\) 盲化后发送给 Alice:\(v = X_b+\left(k^e\right) \bmod n\)
- Alice 方并不知道 Bob 方究竟选择了哪个,她将 \(X_0, ..., X_N\) 中每个数据都拿去解密,获得了 \(k_0, ..., k_N\) 个解密结果:\(k_t=\left(v-X_t\right)^d \bmod n\)。显然,这 N 个结果中只有 \(k_b = k\)
- Alice 方对 N 个解密结果分别加上真实要发送的信息后发送给 Bob:\(m_t^{\prime}=m_t+k_t\),$m_t $ 是 Alice 需要保密的信息
- Bob 方根据自己选中的消息编号,只需要对第 b 个消息解密就可以获得自己选中的电话号码。对于其他消息,Bob 即使去解密也只能获得一个没有意义的随机值,而 Alice 方始终无法获知 Bob 究竟拿到了哪一个号码:\(m_b=m_b{ }^{\prime}-k\)
为便于理解,第四步和第五步的公式也可写为:
第四步:\(v = X_b+ \text{Encryption}(k)\)
第五步:\(k_t=\text{Decryption}(v-X_t)\),其中 \(k_b=\text{Decryption}(X_b+ \text{Encryption}(k)-X_b)= k\)
另一种类似的方式如下:将 Alice 方生成的 N 个随机数换成 N 对 RSA 公私钥
上图中同时使用 RSA 和 AES 对数据进行加解密,两者的区别如下:
RSA | AES | |
---|---|---|
类型 | 一种非对称加密算法,公钥用于加密,私钥用于解密 | 一种对称加密算法,使用相同的密钥来进行加密和解密 |
用途 | RSA 常用于加密小块数据,如数字签名、密钥交换等。由于非对称加密的计算开销较大,因此 RSA 一般用于加密小数据或者加密对称加密算法(如 AES)中的密钥 | AES 通常用于加密大量数据,如文件、通信数据等。对称加密算法具有较高的加密和解密速度,因此适合处理大量数据的加密工作 |
加密速度 | RSA 基于大整数的运算,其加密和解密过程较为耗时 | AES 的加解密过程基于固定长度的数据块和密钥,因此可以使用高度优化的算法和硬件实现 |
密钥长度 | RSA 的安全性依赖于大整数的因数分解问题,因此需要较长的密钥长度来保证足够的安全性。通常,RSA 密钥长度为 1024 位或更长 | AES 的安全性主要依赖于密钥长度,一般使用 128 位、192 位或 256 位的密钥。较长的密钥长度通常提供更高的安全性,但也增加了加密和解密的计算开销。 |
基于有限域的公钥运算:有限域的离散对数难题(DLP 问题)
大数离散对数难题涉及在一个大的有限群中找到离散对数的难度。
基于离散对数实现 2 选 1 的 OT 协议执行过程如下图所示:
基于离散对数实现 n 选 1 的 OT 协议执行过程如下图所示:https://blog.nsfocus.net/ot-1/
基于椭圆曲线的公钥运算:椭圆曲线的离散对数难题(ECDLP)
关于椭圆曲线密码学的知识点,请参考:公钥密码学依赖的三大数学难题
序号 | Sender | Share | Receiver |
---|---|---|---|
目标 | 输入:\((m_0, m1)\) 输出:\(Non\) | 输入:选择比特 b输出:\(m_b\) | |
1 | 生成随机的 ECC 密钥对 \((s\_sk, s\_pk)\)\(s\_pk\) 由 \(s\_sk\) 和基点 G 相乘得到 | Sender 将 \(s\_pk\) 发送给 Receiver \(\to\) |
接收 \(s\_pk\), 从 \(s\_pk\) 中提取椭圆曲线信息,生成新的 ECC 密钥对 \((r\_sk, r\_pk)\) |
2 | \(ck_0 = new\_pk * s\_sk \\ ck_1 = (new\_pk-s\_pk) * s\_sk\) | Receiver 将 \(new\_pk\) 发送给 Sender \(\leftarrow\) |
$if b=0, new_pk = r_pk\ if b=1, new_pk = r_pk + s_pk $ |
3 | \(cipher\_m_0 = Enc(ck_0, m_0)\\ cipher\_m_1 = Enc(ck_1, m_1)\) | Sender 将加密后的 \((m_0, m1)\) 发送给 Receiver \(\to\) |
计算 \(ck = s\_pk * r\_sk\)\(Dec(ck, cipher\_m_b)\),即 \(m_b\) |
证明过程如下:在第二步中
因此有:\(ck_b = r\_pk * s\_sk\),由 ECDH 密钥交换协议知:\(ck_b = r\_pk * s\_sk = s\_pk * r\_sk = ck\)
布隆过滤器(Bloom Filter)
布隆过滤器是由一个固定大小的二进制向量或者位图(Bitmap)和一系列映射函数组成的。在初始状态时,对于长度为 m 的位数组,它的所有位都被置为 0,如下图所示:
当有变量被加入集合时,通过 k 个映射函数将这个变量映射成位图中的 k 个点,把它们置为 1。
查询某个数据的时候,只要看这些点是不是都是 1 就可以大概率知道集合中是否包含该数据了:如果这些点中有任何一个是 0,被查询变量一定不在,如果都是 1,被查询变量很可能存在。
为什么是可能存在,而不是一定存在呢?因为映射函数本身就是散列函数,散列函数会有碰撞。
可以看出,布隆过滤器在空间和时间方面都有巨大的优势:
- 布隆过滤器存储空间和插入、查询时间都是常数
- 散列函数相互之间没有关系,方便并行实现
- 布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势
混淆电路(Grable Circuit)
“百万富翁”问题:加密学问题
假设有两个百万富翁,他们都想知道谁更富有,但他们都想保护好自己的隐私,都不愿意让对方或者任何第三方知道自己真正拥有多少财富。那么,如何在保护好双方隐私的情况下,计算出谁更有钱呢?
使用一个更加专业的说法:一组互不信任的参与方在需要保护隐私信息以及没有可信第三方的前提下进行协同计算的问题。
混淆电路(GC):一种将计算任务转化为布尔电路并对真值表进行加密打乱等混淆操作以保护输入隐私的思路。利用计算机编程将目标函数转化为布尔电路后,对每一个输出的真值进行加密,参与方之间在互相不掌握对方私有数据的情况下共同完成计算。
可计算问题可以转换为一个个电路,CPU 就是由加法电路、比较电路和乘法电路等组合而成的。一个电路由一个个逻辑门组成,比如与门、非门、或门、与非门等。每个逻辑门都有输入端和输出端。
在经典的混淆电路中,加密和扰乱是以门为单位的,每个门都有一张真值表,下图展示了与门的真值表:
不妨认为俩个富翁 Alice 和 Bob 的财富是用二进制表示的一个整数:
- Alice 方的财富值用 a 表示:\(a=a_4 a_3 a_2 a_1 a_0=01101\)
- Bob 方的财富用 b 表示:\(b=b_4 b_3 b_2 b_1 b_0=10100\)
下面以与门为例来说明混淆电路的工作原理,介绍如何使用混淆电路实现对 a 和 b 的与操作。
- Alice 方首先对与门的每根输入线(a 和 b)生成两个随机的标签来分别对应 0 和 1,其中,标签的比特位长度是 k,其取值是算法的安全参数,一般可以设为 128。
- Alice 方将与门真值表中的 0 和 1 替换成对应的标签,如下表所示:
- Alice 方将真值表输入线上的标签作为加密密钥对真值表输出线标签,并使用对称加密算法进行加密:
- Alice 方将真值表上的行顺序打乱,这样其他人就无法根据标签值知晓其对应真值表上的哪一行:
- 假设 \(a=a_4 a_3 a_2 a_1 a_0=01101\),Alice 对 5 个比特位都生成混淆后的与门真值表,并将它们发送给 Bob,下表展示了针对第 0 位比特生成的经混淆后的与门真值表,Bob 需要输入线上的标签值才能根据真值表进行计算,因此 Alice 方把值 a 的每个比特位对应的标签发送给 Bob:\(x_0^{a_4} 、 x_1^{a_3} 、x_1^{a_2}、 x_0^{a_1} 、 x_1^{a_0}\),因为标签值是随机生成的,因此 Bob 方无法从中获得任何信息。
- 真值表计算除了需要输入线上 a 的值,还需要输入线上 b 的值。但是,输入线 b 对应的标签都是由 Alice 方产生的,为此 Bob 需要从 Alice 处获取。假设 \(b=b_4 b_3 b_2 b_1 b_0=10100\),对于第 0 个比特位 \(b_0 = 0\),Bob 使用不经意传输协议,就可以从 Alice 处获取对应的标签 \(x_0^{b_0}\)。根据不经意传输协议,Bob 是无法获知 \(x_1^{b_0}\) 值的,Alice 也无法知晓 Bob 究竟获取了哪个标签。Bob 对每个比特位需使用不经意传输协议获取对应的标签值:\(x_1^{b_4} 、 x_0^{b_3} 、 x_1^{b_2} 、 x_0^{b_1} 、 x_0^{b_0}\)。
- 对于获取到的标签值,Bob 通过遍历从 Alice 处获得的对应的混淆后的与门真值表的每一行来尝试解密。比如针对第 0 位,对真值表中的每一行,Bob 尝试用 $x_1^{a_0} 、 x_0^{b_0} $ 去解密,直到解密成功,对每个比特位解密后,Bob 就可以获得 \(x_0^{c_4} 、 x_0^{c_3} 、 x_1^{c_2} 、 x_0^{c_1} 、 x_0^{c_0}\)。
- Bob 将解密获得的 \(x_0^{c_4} 、 x_0^{c_3} 、 x_1^{c_2} 、 x_0^{c_1} 、 x_0^{c_0}\) 发送给 Alice,Alice 就可以根据自己生成标签时的对应关系恢复出计算结果 00100,而这个结果正是 a 和 b 执行与操作的计算结果。
至此,Alice 与 Bob 在保护好各自数据的前提下完成了与操作。
两个数的比较操作可以通过多个异或门和与门来实现。
我们定义变量 \(c_i\):
以及其初始值 \(c_1=0\) 。在已知 \(a_i, b_i, c_i\) 的情况下, \(c_{i+1}\) 可以做如下推导:
注意:上述的混淆电路属于半诚实模型,电路本身还有很多优化空间。
秘密共享(Secret Sharing)
指将一个秘密分发给一组参与方,每个参与方只获取这个秘密的一部分,这样一个或少数几个参数方无法还原出原始数据(秘密),只有满足一定数量的参与方把各自的数据凑在一起,才能还原出真实数据。计算时,各参与方直接用它自己的本地数据进行计算,并且在适当的时候交换一些数据(交换的数据本身看起来也是随机的,不包含原始信息)。计算结束后,结果仍以秘密共享的方式分散在各参与方那里,并在使用方最终需要结果时将某些数据合起来。通过这种方式,秘密共享技术保证了计算过程中各个参与方看到的都是一些随机数,但最后仍得到了想要的结果。
秘密共享方案的三种实现技术:
- 有限域上的运算:基于超平面几何的秘密共享,包括 Blakley 方案和 Brickell 方案;
- 有限域上的运算:基于插值多项式的秘密共享,包括经典的 Shamir 阈值秘密共享方案;
- 环上的运算:Mignotte,Asmuth & Bloom 提出的基于中国剩余定理的秘密共享;
Shamir 门限秘密共享方案流程
- 将秘密信息 s 拆成 n 份,每个参与方获得一份,每一份被称作一个 Share。每个参与者秘密地保存好自己的 Share。
- 拆分时,预先设定至少 t (t <= n) 个参与者聚到一起才可以恢复 s。
- 需要恢复 s 时,至少有 t 个参与者聚到一起,他们拿出各自的 Share,通过计算恢复出 s。
Shamir 门限秘密共享方案原理
Shamir 门限秘密共享方案的实现原理是对于任意一个 \(t-1\) 次多项式函数,只需要获取其多项式曲线上的 t 个点就可以通过多项式插值(比如拉格朗日插值法)确定该多项式函数。而 Blakley 的解决方案基本思想是利用多维空间中的点:将共享的秘密看成 t 维空间中的一个点,每个子秘密为包含这个点的 \(t-1\) 维超平面的方程,构造 n 个这样的平面分发给 n 个参与方,任意 t 个 \(t-1\) 维超平面的交点刚好确定共享的秘密,而 \(t-1\) 个子秘密,即 \(t-1\) 个 \(t-1\) 维超平面仅能确定其交线,得不到共享秘密的任何信息。
针对下面这个多项式函数,我们具体介绍一下秘密分发的过程:
p 是一个大素数,其中 \(f(0)=a_0=s\)(s 是需要保护的秘密),且 \(s < p\),具体过程如下:
- 秘密拥有者秘密随机生成 \(t-1\) 个小于 \(p\) 的随机数 \(a_1, a_2, \ldots, a_{t-1}\) ,并随机选取 \(n\) 个互不相同的整数 \(x_1, x_2, \ldots, x_n\) 。
- 将 \(n\) 个整数代入多项式函数,计算得到 \(n\) 个值 \(s_1=f\left(x_1\right), s_2=f\left(x_2\right), \ldots, s_n=f\left(x_n\right)\) 。
- 将计算得到的 \(n\) 个值分别分发给 \(n\) 个参与方,即第 \(i\) 个参与方获得 \(\left(x_i, s_i\right)\) (作为该参与方需要严格保守的秘密)。
- 销毁 \(f(x)\) 。根据多项式函数的性质,少于 \(t\) 个参与方都无法恢复出这个多项式函数。而大于等于 $$ 个参与者通过其子秘密 \(s_i\) 和 \(x_i\) 通过拉格朗日插值定理可以恢复上面多项式 \(f(x)\),并且令 \(x=\) 实现秘密 s 的重构:
拉格朗日插值定理:通过给定的一组数据点,可以构造出一个多项式,该多项式通过这些点。
接下来以 \((3,4)\) -门限实例来说明 \(t\) 个参与方如何恢复秘密,这里假设秘密 \(s=2\), \(p=23\),构造的 \(f(x)\) 如下:
根据函数可知,这里 \(t\) 的取值为 3,另取 \(x_1=1 , x_2=2 , x_3=3 , x_4=4\),代入函数得 \(f(1)=7 , f(2)=16 , f(3)=6 , f(4)=0\) 。 随机选取其中 3 组数据 \((1,7) 、(3,6) 、(4,0)\) ,并使用拉格朗日插值公式进行恢复 :
经过上述计算,成功恢复出秘密 \(s\) 为 2 。
参考:秘密共享 — 隐私计算和区块链共识中的榫卯
通过秘密共享实现隐私计算的原理
如何利用秘密共享进行隐私计算呢?这里以 (2, 2)-门限的加法为例,假设 Alice 和 Bob 为输入方,Alice 拥有隐私输入 a,Bob 拥有隐私输入 b,Uzer 为结果使用方,设计两个计算方 CP1 和 CP2,计算过程如下:
再以乘法为例:
同态加密(Homomorphic Encryption)
HE 是一种特殊的加密方法,它允许直接对加密数据执行计算,如加法和乘法,而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的,拥有密钥的用户对处理过的密文数据进行解密后,得到的正好是处理后原文的结果。
根据支持的计算类型和支持程度,同态加密可以分为以下三种类型:
- 半同态加密(Partially Homomorphic Encryption, PHE):只支持加法或乘法中的一种运算。其中,只支持加法运算的又叫加法同态加密(Additive Homomorphic Encryption, AHE);
- 部分同态加密(Somewhat Homomorphic Encryption, SWHE):可同时支持加法和乘法运算,但支持的计算次数有限;
- 全同态加密(Fully Homomorphic Encryption, FHE):支持任意次的加法和乘法运算。
同态加密具有如下的特点:
- 计算复杂度小,通信量高,通信轮次少的特点
- 适合密文一次部署,多次计算的场景,大幅减少通信量
差分隐私(Differential Privacy)
差分隐私旨在提供一种当从统计数据库查询时,在保证查询结果一定精度的同时最大限度减少识别出某个样本的可能性。差分隐私的目的是用来对抗差分攻击,通常其应用场景是统计查询。
核心思想
这里以一个直观的例子来说明差分隐私的原理。
假设数据集 D 包含 Alice 的记录,而数据集 D' 中 Alice 的记录被替换为 Bob 的记录,其他记录与数据集 D 完全一致。假设从 D 和 D' 两个数据集中随机挑选一个数据集并提取一些信息 O 给到攻击者,如果攻击者无法识别这些信息是从哪个数据集中提取出来的,那么可以认为所发布的信息保护了 Alice 的隐私。差分隐私要求任何被发布的信息都应当与信息 O 类似,确保攻击者无法识别出任何具体的数据记录。
差分隐私技术的核心思想是对于任意两个相差一条记录的数据集 D 和 D',以及任意输出 O,要求添加了随机绕动的查询机制 M(一般是一些统计信息的查询,比如均值、方差)都能满足:
其中 P 是通过查询机制 M 获得输出 O 的概率,这意味着在数据集 D 中一条数据发生变化后通过 M 得到 O 的概率的变化会非常小,概率 P 的变化范围由公式中的 \(\epsilon\) 决定,这是称查询机制 M 满足 \(\epsilon\) 差分隐私。
直白一点来说,如果能设计一种算法,让攻击者在查询 100 条信息和去掉任意一条信息的其他 99 条信息时,获得相同值的概率非常接近,攻击者就没办法确定第 100 条信息了,这样我们就说第 100 条信息对应的个体得到了隐私保护。这样的算法就是差分隐私算法。差分隐私其实是一个框架,一个用于评估保护隐私的查询机制(算法)的框架。
差分隐私具有如下的特点:
- 计算和通信新能与直接明文计算几乎无区别
- 安全性以及精度损失由加的噪声决定
分类
根据原始数据的存储位置划分,差分隐私分为中心化差分隐私和本地化差分隐私:
- 中心化差分隐私:实现加入很小的噪声保护数据集中所有用户的隐私,但是需要所有用户将未经处理的原始数据直接存储在一个可信服务器上
- 本地化差分隐私:允许用户在本地随机化原始数据后再发送给服务器,使得用户得到了更强的隐私保护,但这一过程加入的噪声远大于全局差分隐私。注意,苹果公司在 ios 输入法中使用的差分隐私技术就属于此类。
经典算法
拉普拉斯机制
差分攻击:攻击者通过比较多次查询获得的不同结果来推算出部分原始明文数据。
差分隐私是如何进行隐私信息的保护,防止差分攻击呢?
差分隐私通常的做法是在查询结果中引入噪声。
对于数值型的查询结果,常用的方法是在查询结果中加入服从拉普拉斯分布的噪声,这种方法被称为拉普拉斯机制。
拉普拉斯分布的概率密度函数为:\(p d f(x)=\frac{1}{2 \lambda} \mathrm{e}^{\left(-\frac{|x|}{\lambda}\right)}\)
横轴表示随机变量,纵轴表示相对应的概率密度,那么对于数据库查询:select count(*) from D where type=“AIDS”,可以在查询结果中加入一个服从拉普拉斯分布的噪声(加入噪声后的查询结果将具备一定的随机性)。
根据差分隐私的理论,加入的噪声参数满足 \(\lambda = 1/\epsilon\),即能满足 ε-差分隐私。
随机化回答机制
如果要发布的数据不是数值型,那么需要用其他方法引入噪声。这里介绍一种用于数据采集的简单机制:随机化回答。
举例来说,假设一个小伙想在互联网上问一个敏感的是非题,比如“大家认为我和我的女朋友是否般配”。由于问题比较敏感,有些网友可能会不愿意给出真实的答案,这对结果统计可能没有什么意义。为了解决这个问题,如图 7-7 所示,我们可以让每个人在他的答案中加入随机噪声。
- 假设他的真实答案是“是”,掷一次骰子,如果掷出来的是 1,就回答真实答案是;如果掷出来是 2~6,就以投硬币的方式回答是或者否。
- 假设他的真实答案是“否”,也掷一次骰子,如果掷出来的是 1,就回答真实答案否;如果掷出来是 2~6,就以投硬币的方式回答是或者否。由于回答存在随机性,因此攻击者并不能从一个回答者的答案中反推出他的真实答案。只要根据 ε 来调整随机化的概率,即可满足 ε-差分隐私。
如何从随机化回答中获得统计信息呢?假设有 60 000 人按上面的规则进行了回复,其中有 28 000 个是,32 000 个否。可知,每个人以 5/6 的概率给的是假回复,即约有 50 000 人给出假回复,其中约有 25 000 个假是和 25 000 个假否。据此可以推算出来剩下的真实回复里约有 3000 个是和 7000 个否,即约有 70% 的人的答案为否。
零知识证明(Zero-Knowledge Proof,ZKP)
ZKP 指的是证明者能够在不向验证者提供任何有用信息的情况下,使验证者相信某个论断是正确的,允许证明者(Prover)、验证者(Verifier)证明某项提议的真实,却不必泄漏除了“提议是真实的”之外的任何信息。
交互式零知识证明
以数独游戏为例来展开介绍零知识证明。假设有两个人 Vicky 和 Patty,有一天,Patty 告诉 Vicky 自己花了半天时间解出了一道极难的数独游戏题,而喜欢挑战的 Vicky 自然也想尝试一下。但他又担心 Patty 是在拿无解的数独题目来开玩笑,希望 Patty 能证明题目有解。显然,如果 Patty 直接告诉 Vicky 答案,Vicky 也就无法自己独立完成题目,从而无法享受游戏的乐趣了。为此,两人设计了一种证明方案,方案分为以下几个阶段。
承诺阶段
首先,Patty 将写有答案的数独盘面按数字剪成小纸片,并按照原顺序摆放在桌子上,且题目中的原有数字正面朝上,答案部分正面朝下:
挑战阶段
Vicky 可以选择按行、列或者九宫格的方式要求 Patty 证明。比如 Vicky 选择按列方式挑战。
回应挑战阶段
Patty 将桌面上每一列的 9 张纸片装入一个盒子,并且打乱纸片顺序进行混淆,然后将所有盒子交给 Vicky,作为挑战的回应。
验证阶段
Vicky 打开盒子验证每个盒子里的 9 张纸片刚好是 1~9 这 9 个数字。这也意味着 Patty 在承诺阶段做出的承诺满足“每列 1~9 都出现并且只出现一次”这一要求,同时在一定程度上说明 Patty 做出的承诺很可能是题目的答案(因为在做出承诺的时候并不知道 Vicky 会选择哪种方式进行验证,随意给出的数字难以通过验证)。
重复阶段
尽管一次验证成功能在一定程度上说明 Patty 做出的承诺很可能是题目的答案。但是,Vicky 无法确信,因为存在 1/3 的概率 Patty 恰巧事先猜对了 Vicky 会选择按列进行验证,然后给出的承诺仅仅满足列的要求,不满足行的要求和九宫格的要求。因此 Vicky 可以要求再试几次,直到自己确信为止。
非交互式零知识证明
交互式零知识证明存在种种缺陷,如要求证明者时刻在线并等待挑战,验证者如需验证,需要与证明者进行多次交互。
为此,Patty 发明了一个非交互式数独零知识证明机器。该机器可以自动地随机选择按列、按行或者按九宫格收取纸片到盒子。Patty 为了证明自己没有作弊,把自己打开机器传送出盒子的动作拍摄成视频并放到网上。这样,Vicky 和 Tom 都可以在网上进行观看、验证。当然,有可能还是有人会认为机器有后门,那么 Patty 还需要将机器是如何制造、安装等别人可能怀疑的地方都通过视频放到网上。这一过程就可以称为“可信任的初始设置仪式”。
不经意伪随机函数 (Oblivious Pseudo Random Function OPRF)
核心思想
OPRF 的定义和安全性模型:OPRF 是一种两方协议,其中一方(发送方)持有一个伪随机函数(PRF)的密钥 k,另一方(接收方)持有一个输入 x。协议的目标是让接收方得到 PRF 在 k 和 x 上的输出 \(f(k, x)\),而发送方不得到任何信息。OPRF 的安全性要求满足正确性、单向性、隐私性和可验证性等属性。
OPRF 的基本构建模块:OPRF 的构造依赖于一些密码学原语,如伪随机函数、双线性映射、同态加密等。伪随机函数是一种可以用密钥和输入生成随机输出的函数,具有不可区分性和抗碰撞性等特点。双线性映射是一种可以在两个群之间进行映射的函数,具有可计算性和非退化性等特点。同态加密是一种可以在密文上进行运算的加密方式,具有可加性或可乘性等特点。
OPRF 的分类:根据底层 PRF 的类型可以分为四大类
- Naor-Reingold 型 OPRF:基于双线性映射的 PRF,可以实现单向性和可验证性。这类 OPRF 的优点是效率高,缺点是需要大量的公共参数和存储空间。
- Dodis-Yampolskiy 型 OPRF: 基于哈希函数和同态加密的 PRF,可以实现单向性和可扩展性。这类 OPRF 的优点是不需要公共参数和存储空间,缺点是效率低。
- Hashed Diffie-Hellman 型 OPRF:基于哈希函数和 Diffie-Hellman 协议的 PRF,可以实现单向性和可扩展性。这类 OPRF 的优点是效率高且安全性强,缺点是需要双线性映射或椭圆曲线群。
- 通用型 OPRF:这类 OPRF 基于任意的 PRF,它使用一种通用的构造方法将任意的 PRF 转化为一个 OPRF。这类 OPRF 的优点是适用范围广,缺点是效率低且安全性弱。
PRF 是一个确定性的函数,记为 F。我们称 F 是定义在 (k, X, Y)上的 PRF,其中 k 是密钥空间,X 是输入空间,Y 是输出空间。
它有两个输入,一个是密钥 k,另一个是数据块 \(x \in X\),输出 \(y = F(k, x) \in Y\) 也是一个数据块。
对于 PRF,其安全性要求:给定一个随机产生的密钥 k,函数 \(F(k, .)\) 应该看上去像一个定义在 X 到 Y 上的随机函数。
随机函数:给定集合 X 和 Y,定义在 X 到 Y 上的映射 \(f\):X \(\to\) Y,首先把所有定义在 X 到 Y 上的映射集中 i 起来,形成一个集合。这个集合里的每个元素都是一个类似 \(f\) 这样的映射,记为 Func[X, Y]。现在从 Func[X, Y] 中随机选择一个函数,这个函数就是“随机函数”。
注意,所谓的“随机函数”只是强调这个函数是被随机地选择出来的,与函数的输出是否随机没有关系。
举个例子:假设 Alice 有一些输入,Bob 有一个 key,OPRF 允许 Alice 将自己的输入与 Bob 的 Key 结合经过一系列运算转变成相应的数。在这个过程中,Alice 不能知道 Bob 的 key,Bob 也不知道最后的结果 \(f(k, x)\),每一个输入 \(x_i\) 都可以计算出一个不同于其他输入的数,这些数可以被看作是“伪随机数”
OPRF 在隐私保护技术中的应用
- OPRF 在隐私保护技术中的作用:可以用来实现一些隐私保护技术,如密码认证、密码存储、密码恢复、密码搜索、密码交换等,这些技术可以利用 OPRF 的单向性、可验证性和可扩展性等属性来保护用户的密码和数据。
- OPRF 在密码认证中的应用:可以用来实现一种安全的密码认证协议,这种协议可以让用户使用自己选择的密码来登录一个远程服务器,而不需要将密码或者其哈希值泄露给服务器或者其他攻击者。这种协议可以防止字典攻击,中间人攻击和离线攻击等。
- OPRF 在密码存储中的应用:可以用来实现一种安全的密码存储方案,让用户将自己的密码或其他敏感数据存储在一个云服务处,而不需要将明文或其哈希值泄露给云服务商或其其他攻击者,
- OPRF 在密码恢复中的应用: 可以用来实现一种安全的密码恢复机制,让用户在忘记自己的密码时,通过一个可信任的第三方来恢复自己的密码或其他敏感数据,而不需要将明文或其哈希值泄露给第三方或其他攻击者。
- OPRF 在密码搜索中的应用:可以用来实现一种安全的密码搜索技术,让用户在一个加密的数据库中进行关键字搜索,而不需要将关键字或其哈希值泄漏给数据库提供者或其他攻击者。
- OPRF 在密码交换中的应用:可以用来实现一种安全的密码交换协议,如隐私求交,让两个用户交换他们各自持有的一组元素(如联系人、喜好、历史记录等),而不需要将元素或其哈希值泄漏给对方或其他攻击者。
布谷鸟哈希(Cuckoo Hashing)
布谷鸟的行为:关键设计就是“踢出”(kicks out)这个动作
- 布谷鸟妈妈从不筑巢,它将自己的鸟蛋生在其他鸟类的巢穴里,要别的鸟给它孵蛋
- 新出生的布谷鸟会本能地将巢穴里的其他蛋踢出(kicks out)鸟巢,借巢长大
哈希的本质是从一个较大空间映射到一个较小的空间,因此在插入数据足够多之后,根据鸽巢原理,一定会存在位置冲突。常见的哈希表会通过链表、开放地址探测等方式来处理冲突。
单桶多函数的布谷鸟哈希,便是开放地址法处理冲突的一种哈希表,只不过有冲突后,不是通过线性寻找新的位置,而是通过额外哈希函数来寻找。布谷鸟哈希利用较少计算换取了较大空间,它具有占用空间小、查询迅速等特性。
核心思想
- 使用两个哈希函数 \(h_1(x)\) 、\(h_2(x)\) 和两个哈希桶 \(T_1\) 和 \(T_2\)
- 插入元素 x:
- 如果 \(T_1[h_1(x)]、T_2[h_2(x)]\) 有一个为空,则插入;两者都空,随便选一个插入
- 如果 \(T_1[h_1(x)]、T_2[h_2(x)]\) 都满,则随便选择其中一个(设为 y),将其踢出,插入 x
- 重复上述过程,插入元素 y(就是之前被踢出的倒霉蛋)
- 如果插入时,踢出次数过多,则说明哈希桶满了。则进行扩容,ReHash 后,再次插入
- 查询元素 x:
- 读取 \(T_1[h_1(x)]、T_2[h_2(x)]\) 和 x 比对即可
变种
布谷鸟哈希可以有很多变种,比如:
- 使用两个哈希函数和一个哈希桶
- 使用两个哈希函数和四路哈希桶
参考资料
- OT(Oblivious Transfer,不经意传输)协议详解
- 混淆电路介绍(二)逻辑电路
- 混淆电路介绍(三)混淆电路原理
- 《深入浅出隐私计算:技术解析与应用实践》
- 安全多方计算(5):隐私集合求交方案汇总分析
- 隐私计算关键技术:隐私集合求交(PSI)原理介绍
- https://github.com/delta-mpc/python-psi/blob/master/README_zh.md
- OPRF 原理
- 布谷鸟哈希和布谷鸟过滤器