头一次开始学密码学相关的东西,未来的主要研究方向包括了隐私计算,即隐私保护下的机器学习算法。
0 举个实际的例子
引用博客OT(Oblivious Transfer,不经意传输)协议详解提到的例子,我们这里考虑1-out-of-2 Oblivious Transfer的情况:
 某旅行社拥有A和B两个景点的旅游资料,小王想去A景点游玩,希望向旅行社购买相关资料。但是小王非常在意自己的个人隐私,不希望向旅行社泄露目的地是哪里。因此,双方希望这笔交易能够满足以下隐私条件:
 (1)小王不希望向旅行社泄露“我准备去A景点”这一信息;
 (2)旅行社只希望出售小王出钱购买的A景点资料,而不泄露小王未购买的B景点资料。
 在通常情况下(明文情况)下,这种隐私条件似乎是无法满足的:旅行社只要把景点A的资料给到小王,就必然知道“小王准备去A景点”这一信息;除非旅行社把所有的资料都直接给小王自行挑选,但是这样又泄露了旅行社的资料隐私。
 本文要介绍的Oblivious Transfer (OT),就可以让交易在这种“不可能的条件”下达成。简而言之,在OT协议中,旅行社把他拥有的所有资料使用某种双方协商同意的加密算法和参数进行加密,然后发送给小王,小王可以从密文中解密出A景点的资料,而无法解密出B景点的资料。
1 Standard Oblivious Transfer (OT)
下图表示OT的数据流动形式:
 
确定性功能:parties可以自己选择输入是什么,比如sender输入 m 0 m_0 m0和 m 1 m_1 m1,reciever输入 c c c,然后得到 m c m_c mc。

2 Random Oblivious Transfer (ROT)
下图表示ROT的数据流动形式:
 
随机性功能:均匀地选择 m 0 m_0 m0、 m 1 m_1 m1和 m c m_c mc,而不是像standard OT一样sender和receiver自己选择输入。

ROT的大致过程可以如下描述:
 
3 One Time Pad加密方式(一次性加密)
- 生成一个随机数random。
- 加密明文plaintext,得到密文ciphertext = plaintext ⊕ \oplus ⊕ random。
- 每次需要生产不同的random,以防止明文泄漏。
4 ROT => OT
Beaver Derandomization理论:通过预先的Random OT去大幅减少standard OT的计算开销。
 
大致计算过程如下:
 
x 0 ⊕ r 0 x_0\oplus r_0 x0⊕r0即是用随机数 r 0 r_0 r0加密真正的输入数据 x 0 x_0 x0,加密方法就是上面提到的one time pad进行XOR(异或)加密。
需要注意一点,如上图,online时OT的sender输入和offline时random OT的sender模拟输入一致时,加密方式时: x 0 ⊕ r 0 x_0\oplus r_0 x0⊕r0和 x 1 ⊕ r 1 x_1\oplus r_1 x1⊕r1。否则,应该是 x 1 ⊕ r 0 x_1\oplus r_0 x1⊕r0和 x 0 ⊕ r 1 x_0\oplus r_1 x0⊕r1。
这个过程也称作是2PC的offline/online方法:
- Offline:预处理阶段,还没有看到真实的输入,生成了很多random OTs。
- Online:sender和receiver真正开始交互阶段,OT输入是确定的,用Beaver的trick可以很cheap地 去随机化 offline OT。
稍微通俗一点讲就是,在OT真正看到输入数据之前,我们先用ROT做预处理,生成了很多random OTs,然后在看到真实输入数据时,仅通过简单的异或,极大加速了运算速度。
下图则是考虑到了online和offline时sender输入是否相同的情况,介入了新的
    
     
      
       
        d
       
      
      
       d
      
     
    d参数:
 
5 为什么直接做OT开销大?
上面并没有提到OT开销大的原因,实际上这就牵扯到实现OT的具体算法了,比如:基于DH密钥交换的OT、基于RSA加密的OT。笼统来说,具体的OT实现算法需要指数运算,所以计算开销较大。
 这里先简单了解下RSA加密解密的计算方式(不涉及具体原理):
 
6 OT的实现算法
基于RSA加密的OT
 初始化:
 (1)sender有两份数据
    
     
      
       
        
         M
        
        
         0
        
       
      
      
       M_0
      
     
    M0和
    
     
      
       
        
         M
        
        
         1
        
       
      
      
       M_1
      
     
    M1,同时拥有公钥(用于加密)
    
     
      
       
        E
       
      
      
       E
      
     
    E和私钥(用于解密)
    
     
      
       
        D
       
      
      
       D
      
     
    D,有随机数
    
     
      
       
        
         x
        
        
         0
        
       
      
      
       x_0
      
     
    x0和
    
     
      
       
        
         x
        
        
         1
        
       
      
      
       x_1
      
     
    x1。
 (2)receiver有随机数
    
     
      
       
        k
       
      
      
       k
      
     
    k和希望取数的索引
    
     
      
       
        i
       
      
      
       i
      
     
    i,同时拥有公钥(用于加密)
    
     
      
       
        E
       
      
      
       E
      
     
    E。
算法步骤:
 (1)receiver首先对
    
     
      
       
        k
       
      
      
       k
      
     
    k进行加密:
    
     
      
       
        E
       
       
        (
       
       
        k
       
       
        )
       
      
      
       E(k)
      
     
    E(k),然后加上sender所对应的随机数:
    
     
      
       
        E
       
       
        (
       
       
        k
       
       
        )
       
       
        +
       
       
        
         x
        
        
         i
        
       
      
      
       E(k)+x_i
      
     
    E(k)+xi,把这个结果发送给sender。 保证sender看不到receiver选的索引
     
      
       
        
         i
        
       
       
        i
       
      
     i是多少,因为
     
      
       
        
         
          x
         
         
          i
         
        
       
       
        x_i
       
      
     xi和
     
      
       
        
         E
        
        
         (
        
        
         k
        
        
         )
        
       
       
        E(k)
       
      
     E(k)揉在了一起
 (2)sender分别用
    
     
      
       
        E
       
       
        (
       
       
        k
       
       
        )
       
       
        +
       
       
        
         x
        
        
         i
        
       
      
      
       E(k)+x_i
      
     
    E(k)+xi减去自己的两个随机数,并解密:
    
     
      
       
        
         k
        
        
         0
        
       
       
        =
       
       
        D
       
       
        (
       
       
        E
       
       
        (
       
       
        k
       
       
        )
       
       
        +
       
       
        
         x
        
        
         i
        
       
       
        −
       
       
        
         x
        
        
         0
        
       
       
        )
       
      
      
       k_0=D(E(k)+x_i-x_0)
      
     
    k0=D(E(k)+xi−x0)和
    
     
      
       
        
         k
        
        
         1
        
       
       
        =
       
       
        D
       
       
        (
       
       
        E
       
       
        (
       
       
        k
       
       
        )
       
       
        +
       
       
        
         x
        
        
         i
        
       
       
        −
       
       
        
         x
        
        
         1
        
       
       
        )
       
      
      
       k_1=D(E(k)+x_i-x_1)
      
     
    k1=D(E(k)+xi−x1)。 这里要么
     
      
       
        
         
          k
         
         
          0
         
        
        
         =
        
        
         k
        
       
       
        k_0=k
       
      
     k0=k要么
     
      
       
        
         
          k
         
         
          1
         
        
        
         =
        
        
         k
        
       
       
        k_1=k
       
      
     k1=k
 (3)sender将
    
     
      
       
        
         k
        
        
         0
        
       
      
      
       k_0
      
     
    k0和
    
     
      
       
        
         k
        
        
         1
        
       
      
      
       k_1
      
     
    k1加上自己的原数据:
    
     
      
       
        
         M
        
        
         0
        
        
         ′
        
       
       
        =
       
       
        
         M
        
        
         0
        
       
       
        +
       
       
        
         k
        
        
         0
        
       
      
      
       M_0'=M_0+k_0
      
     
    M0′=M0+k0和
    
     
      
       
        
         M
        
        
         1
        
        
         ′
        
       
       
        =
       
       
        
         M
        
        
         1
        
       
       
        +
       
       
        
         k
        
        
         1
        
       
      
      
       M_1'=M_1+k_1
      
     
    M1′=M1+k1,把这两个结果发送给receiver。 这里要么
     
      
       
        
         
          M
         
         
          0
         
         
          ′
         
        
        
         =
        
        
         
          M
         
         
          0
         
        
        
         +
        
        
         k
        
       
       
        M_0'=M_0+k
       
      
     M0′=M0+k要么
     
      
       
        
         
          M
         
         
          1
         
         
          ′
         
        
        
         =
        
        
         
          M
         
         
          1
         
        
        
         +
        
        
         k
        
       
       
        M_1'=M_1+k
       
      
     M1′=M1+k 保证receiver看不到sender的具体数据是多少,因为
     
      
       
        
         
          M
         
         
          i
         
        
       
       
        M_i
       
      
     Mi和
     
      
       
        
         
          k
         
         
          i
         
        
       
       
        k_i
       
      
     ki揉在了一起
 (4)receiver计算结果
    
     
      
       
        
         P
        
        
         i
        
       
       
        =
       
       
        
         M
        
        
         i
        
        
         ′
        
       
       
        −
       
       
        k
       
      
      
       P_i=M_i'-k
      
     
    Pi=Mi′−k。这里要么
     
      
       
        
         
          P
         
         
          0
         
        
        
         =
        
        
         
          M
         
         
          0
         
        
       
       
        P_0=M_0
       
      
     P0=M0要么
     
      
       
        
         
          P
         
         
          1
         
        
        
         =
        
        
         
          M
         
         
          1
         
        
       
       
        P_1=M_1
       
      
     P1=M1,即只能够解密receiver想要的那一项数据
蓝色字体表示对双方信息安全保障的解释,红色字体表示对加密过程中取值的解释。
参考资料:
 OT(Oblivious Transfer,不经意传输)协议详解
 RSA介绍
 OT Extension —— Beaver De-randomization Theorem
 密码学学术讲座 | Mike Rosulek教授开讲不经意传输及其扩展
 Techniques in OT extension: https://nishkum.github.io/files/OT_extension.pdf



















