学习&转载文章:安全多方计算(1):不经意传输协议
在安全多方计算系列的首篇文章(安全多方计算之前世今生)中,我们提到了百万富翁问题,并提供了百万富翁问题的通俗解法,该通俗解法可按图1简单回顾。
图1 百万富翁问题通俗解法
百万富翁问题通俗解法场景中,我们可以将Alice和Bob的诉求总结如下:
Alice:有9个装有物品的箱子,Bob只能打开其中一个箱子看到物品,看不到其他箱子内的物品。
Bob:不希望Alice知道自己打开的是哪个箱子。
百万富翁问题通俗解法可以通过密码学中的n选1的不经意传输协议(Oblivious Transfer,OT)完美解决。
通过百万富翁问题通俗解法场景描述,对OT协议解决的问题可抽象为:Alice拥有\(n\)条消息\({m_1,…,m_n}\),Bob想知道其中一条消息\(m_i\);通过执行OT协议,Bob可以正确获得想要知道的消息\(m_i\),且无法获得其它\(n-1\)条消息,而Alice无法知道Bob获得的是哪条消息。
OT协议按研究类别区分,可以分为以下3种OT协议:
受篇幅所限,本文仅介绍2选1与n选1的OT协议,OT扩展协议则在后续系列文章中进行介绍。
自1981年提出以来,OT协议有多种多样的实现形式,其中最容易理解的是基于RSA公钥算法实现的n选1的OT协议[1]。
此处不讲解RSA原理,只介绍RSA加解密过程和用到的参数,便于密码学知识储备不足的读者理解后面的OT协议。
RSA密钥参数:\(N=p*q\),\(L=(p-1)*(q-1)\)其中\(p\)和\(q\)为大素数。
RSA公私钥对:生成\(d\)和\(e\),满足\(d\)与\(L\)互质,\(e\)与\(L\)互质,且\(d*e(mod L)=1\),则令\((d,N)\)为公钥,\(e\)为私钥。
则RSA算法对明文\(m\)(\(m\)为大整数)的加解密过程如图2所示。
图2 RSA算法加解密计算过程
基于RSA公钥算法实现的n选1的OT协议执行过程如图3所示。
图3 基于RSA公钥算法实现n选1的OT协议执行过程
协议执行过程分为4个步骤:
将图1中的百万富翁问题和图3中的n选1的OT协议结合,我们可以对图1中的操作步骤做如图4的改造:
Step1:Alice构造9条明文消息,序号\(<x\),消息为“0”;否则消息为“1”。
Step2:Alice与Bob执行9选1的OT协议,解密第7条消息,看到0,\(y<x\);看到1,\(y≥x\)。
图4 基于n选1的OT协议实现百万富翁问题
该协议执行过程可以满足OT协议中Alice和Bob的核心诉求,关键在于第2步和第3步。
第3步中,Alice利用\(n\)个私钥逐个尝试解密\(s\),得到\((key1,...,keyn)\),由于\(s\)是由Bob利用第\(t\)个公钥加密整数key计算得到的,因此只有keyt=key,但对于Alice来说,\((key1,...,keyn)\)都是大整数,根本无法区分哪个才是Bob掌握的key,实现了Bob的诉求,即Alice无法知道Bob选择的是哪条消息。
对于Bob来说,拿到了\(n\)个密文消息\((M1,...,Mn)\),但是自己只有一个key,此key只能解密消息\(Mt\),对于其他\(n-1\)条消息则无法解密,实现了Alice的诉求,即Bob只能正确得要Bob想要得到1条消息,无法正确得到其他\(n-1\)条消息。
如果\(n=2\),则该n选1的OT协议就退化成了2选1的OT协议。
虽然基于RSA实现的n选1的OT协议简单易懂,但是却存在如下缺陷:
为了提高安全性和计算效率,还有基于其他密码学方法的OT协议,如基于离散对数的OT协议,将在本文第四节和第五节中进行介绍。(如果您仅希望简单了解OT协议的原理和能解决的问题,则读到此处足矣,本文后面的内容适合有一定密码学基础读者。)
为了优化OT协议计算效率和安全性,学者一般对2选1的OT协议和n选1的OT协议分开进行研究。对于2选1的OT协议,Tung Chou[2]于2015年基于离散对数问题,在DH密钥协商协议的基础上设计的2选1的OT协议,被认为是一个简单清晰的2选1的OT协议。
离散对数问题通俗理解:有限域\(F_p\)(\(p\)为大素数,\(F_p\)中元素共\(p-1\)个整数,取值\([1,p-1]\))上的大整数幂乘取模容易计算,即\(a*b mod p=c,a,b\in F_p\),而计算对数是很困难的,即 \(log_a^c(mod p)=b\)。
基于离散对数实现2选1的OT协议执行过程如图5所示:
图5 离散对数实现2选1的OT协议执行过程
协议执行过程分为4个步骤:
该协议的核心步骤是步骤2和步骤3,对这两步中的参数B、C0、C1进行展开,展开后如图6所示。
图6 2选1的OT协议部分参数展开
从图6的展开式可知,无论\(\sigma =0\)还是\(\sigma =1\),\(C0\)和\(C1\)始终只有一个为\(g^{ab}\),而另一个对于Bob而言则不可计算(Bob不知道\(a\)的值),\(g^{ab}\)的计算实质上就是DH密钥协商协议。
对于Alice来说,仅知道\(B、A、g\),不知道\(b\)的情况下,由于离散对数问题难解,因此是无法推断出\(\sigma =0\)还是\(\sigma =1\)。
与2.2的协议相比,该协议不存在Bob选择特殊的\(b\)会导致密文消息\(M0\)和\(M1\)同时正确解密这一缺陷(只能正确解密其中一个)。
本章节将以Wen-Guey Tzeng[3]提出的高效n选1的OT协议为例,讲解如何基于离散对数实现基本的n选1的OT协议。
基于离散对数实现n选1的OT协议执行过程如图7所示。
图7 离散对数实现n选1的OT协议执行过程
协议执行过程分为4个步骤:
对于第4步Bob的操作,我们把消息\(m_t\)泛指为\(m_x\),则对\(m_x\)的计算公式展开后如图8所示。
图8 消息mx的计算公式展开
从图8可以看出,要想获得消息\(m_x\),要么令\(x=t\),此时消息为Bob想要获得的消息;要么计算出\(h^{(t-x)*k_x}\),由于\(k_x\)是Alice的秘密数字,因此保证了Bob不可能正确解密除消息\(m_t\)之外的其余\(n-1\)条消息。
对于Alice来说,虽然知道\(y,g,h\),但是不知道\(r\)的情况下,由于离散对数问题难解,因此是无法推断出\(t\)的正确值。
与2.2的协议相比,该协议不存在Bob选择特殊的\(r\)会导致\(n\)条消息同时正确解密这一缺陷,同时也不存在需要产生\(n\)对公私钥这一耗时操作。
本文介绍了OT协议和3个基于密码学实现的OT协议实例,并结合百万富翁问题的通俗解法看到了OT协议的应用实例,这样的实例很难看出OT协议的重要性。
其实OT协议是安全多方计算中很重要的一个协议,在安全多方计算系列的首篇文章(安全多方计算之前世今生)中,我们提到,安全多方计算的通用技术路线可以用混淆电路解决,而混淆电路的构建离不开OT协议。因此,下期文章将会讲解如何通过OT协议实现混淆电路,以及如何实现基于混淆电路的通用安全多方计算路线。
[1] https://en.wikipedia.org/wiki/Oblivious_transfer
[2] Chou T , Orlandi C . The Simplest Protocol forOblivious Transfer[C]// International Conference on Cryptology and InformationSecurity in Latin America. Springer International Publishing, 2015.
[3] Tzeng W G . Efficient 1-out-of-noblivious transfer schemes with universally usable parameters[J]. IEEETransactions on Computers, 2004, 53(2):p.232-240.