代理重加密（英语：Proxy re-encryption）是由馬特·布拉澤等人提出的一种密码体制。其目标是安全地将密文从一个密钥重新加密到另一个密钥，而无需依赖可信任的第三方。
具体来说，其允许半可信第三方（代理服务器），将委托者公钥加密的密文转换为受委托者公钥加密的另一密文，使其可以被受委托者解密。同时不会向代理服务器泄露加密消息或委托者/受委托者的私钥。


历史 1998年：馬特·布拉澤等人提出了首个双向、多跳代理重加密方案。该方案基于ElGamal算法，并在离散对数困难假设下证明其选择明文攻击（CPA）安全性。然而，该方案无法抵抗合谋攻击，即代理和重加密后的密文接收者可以联合获取原始密文拥有者的私钥。
2003年：提出了一种基于密钥共享机制的单向代理重加密方案，将用户的私钥分成两部分，一部分交给代理，另一部分交给重加密后的密文接收者。尽管解决了代理独立分配解密授权的问题，但该方案未能实现密钥优化和抗合谋攻击。
2005年：首次形式化了代理重加密及其安全模型，并使用双线性对构造了一个单向代理重加密方案，实现了主密钥安全并能够抵抗合谋攻击。然而，该方案只能实现CPA安全，无法满足实际应用需求。
2008年：提出了首个在标准模型下证明RCCA安全的一向代理重加密方案。同年，一个独立于双线性对且CCA安全的双向代理重加密方案被提出，解决了冉·卡内蒂提出的公开问题 。
2010年：提出了无证书环境下的代理重加密概念，并构造了相应方案。
2013年：首次在标准模型下基于格问题（LWE）构造了K-PRE方案，能够应对量子计算威胁。
2018年：首次提出了PRE+概念，并构造了具体方案。该方案通过主体生成重加密密钥的操作，实现了基于消息级别的细粒度委托和不可转移属性。


组成 代理重加密方案一般划分为五个算法部分，分别为密钥生成算法、重加密密钥生成算法、重加密算法、加密算法、解密算法。
涉及三种对象，即委托者，第三方代理，受委托者。


分类 根据代理重加密密钥的性质，代理重加密分为双向和单向两种。在双向代理重加密中，代理服务器利用重加密代理钥可以将委托者的密文转换成针对受委托者的密文，也可以将受委托者的密文转换成针对委托者的密文, 但这需要委托者和受委托者的私钥；在单向代理重加密中，代理服务器利用重加密密钥只能将委托者的密文转换成针对受委托者的密文，只需委托者的私钥，但无法进行反向转换。
根据密文是否可以被多次转换，代理重加密还分为多跳和单跳两种。多跳代理重加密允许密文被多次转换，而单跳代理重加密只允许密文被转换一次。


使用场景 代理重加密可以用于多种场景，如数据内容共享、加密电子邮件转发、分布式文件系统、云计算等。


= 云端数据内容共享 =
假设数据所有者（如爱丽丝）打算将存储在云中的敏感数据共享给另一个授权用户（如鲍勃）。理想情况下，除了鲍勃之外，任何人都无法访问请求的数据。
爱丽丝可以在上传共享数据到半信任的云服务器之前，用她自己的公钥加密敏感数据。在收到鲍勃的数据共享请求后，爱丽丝使用自己的私钥和鲍勃的公钥生成一个代理重加密密钥，并将该密钥发送给半信任的云服务器。有了这个代理重加密密钥，云服务器可以将用爱丽丝公钥加密的密文转换成用鲍勃公钥加密的密文。转换后的密文只能由鲍勃解密，而云服务器无法得知明文或爱丽丝和鲍勃的私钥。最终，鲍勃可以使用自己的私钥下载并解密请求的数据。


= 加密电子邮件系统 =
在一般的邮件加密中，发送给用户的电子邮件都会用用户的公钥加密，要阅读邮件必须先用用户的私钥解密。假设用户爱丽丝要出差一段时间，她希望秘书鲍勃在此期间帮助处理解密邮件。直接将爱丽丝的私钥交给鲍勃显然不是一个好的办法。
通过使用代理重加密技术，爱丽丝可以将代理重加密密钥交给邮件服务器。这样，邮件服务器在无法获知爱丽丝邮件内容的情况下，可以将这些邮件转换为针对鲍勃加密的邮件。鲍勃收到这些邮件后，只需使用他自己的私钥即可解密，从而帮助爱丽丝处理邮件。


运算实例 爱丽丝想将消息
  
    
      
        M
      
    
    {\displaystyle M}
  
通过代理重加密方式传递给鲍勃，如下是一个基于ElGamal加密算法的代理重加密方案：

初始设置
根据公钥（
  
    
      
        p
        k
      
    
    {\displaystyle pk}
  
）和私钥（
  
    
      
        s
        k
      
    
    {\displaystyle sk}
  
）生成规则：

  
    
      
        s
        k
        ←
        
          
            Z
          
          
            p
          
        
        ,
        
        p
        k
        =
        
          g
          
            s
            k
          
        
      
    
    {\displaystyle sk\leftarrow \mathbb {Z} _{p},\quad pk=g^{sk}}
  
。
假设爱丽丝和鲍勃已经生成了他们自己的密钥对，
  
    
      
        g
      
    
    {\displaystyle g}
  
 是该椭圆曲线
  
    
      
        G
      
    
    {\displaystyle G}
  
的生成元；
  
    
      
        p
      
    
    {\displaystyle p}
  
 是一个大质数，同时也是 
  
    
      
        G
      
    
    {\displaystyle G}
  
 的阶。

爱丽丝创建其私钥与公钥：
  
    
      
        s
        
          k
          
            A
          
        
        ,
        p
        
          k
          
            A
          
        
      
    
    {\displaystyle sk_{A},pk_{A}}
  

鲍勃创建其其私钥与公钥：
  
    
      
        s
        
          k
          
            B
          
        
        ,
        p
        
          k
          
            B
          
        
      
    
    {\displaystyle sk_{B},pk_{B}}
  

创建重加密密钥
爱丽丝使用鲍勃的公钥创建重加密密钥 
  
    
      
        
          rk
        
      
    
    {\displaystyle {\text{rk}}}
  
 ：

  
    
      
        
          rk
        
        =
        
          
            a
            
              H
              (
              (
              
                
                  pk
                
                
                  B
                
              
              
                )
                
                  
                    
                      sk
                    
                    
                      A
                    
                  
                
              
              )
            
          
        
        =
        
          
            a
            
              H
              (
              
                g
                
                  a
                  b
                
              
              )
            
          
        
      
    
    {\displaystyle {\text{rk}}={\frac {a}{H(({\text{pk}}_{B})^{{\text{sk}}_{A}})}}={\frac {a}{H(g^{ab})}}}
  

其中，
  
    
      
        H
      
    
    {\displaystyle H}
  
 是一个哈希函数，
  
    
      
        
          
            pk
          
          
            B
          
        
        =
        
          g
          
            b
          
        
      
    
    {\displaystyle {\text{pk}}_{B}=g^{b}}
  
 是鲍勃的公钥，
  
    
      
        
          
            sk
          
          
            A
          
        
        =
        a
      
    
    {\displaystyle {\text{sk}}_{A}=a}
  
 是爱丽丝的私钥。
因此，我们有：

  
    
      
        H
        (
        (
        
          
            pk
          
          
            B
          
        
        
          )
          
            
              
                sk
              
              
                A
              
            
          
        
        )
        =
        H
        (
        (
        
          g
          
            b
          
        
        
          )
          
            a
          
        
        )
        =
        H
        (
        
          g
          
            a
            b
          
        
        )
      
    
    {\displaystyle H(({\text{pk}}_{B})^{{\text{sk}}_{A}})=H((g^{b})^{a})=H(g^{ab})}
  

爱丽丝加密消息
爱丽丝将消息 
  
    
      
        M
      
    
    {\displaystyle M}
  
进行加密的得到密文，密文是：

  
    
      
        
          C
          
            A
          
        
        =
        (
        
          g
          
            r
          
        
        ,
        M
        ⋅
        
          g
          
            a
            r
          
        
        )
      
    
    {\displaystyle C_{A}=(g^{r},M\cdot g^{ar})}
  

其中 
  
    
      
        r
      
    
    {\displaystyle r}
  
 是一个随机数。
代理进行重加密
代理使用重加密密钥 
  
    
      
        
          rk
        
      
    
    {\displaystyle {\text{rk}}}
  
 对 
  
    
      
        
          C
          
            A
          
        
      
    
    {\displaystyle C_{A}}
  
 进行重加密：

  
    
      
        
          C
          
            B
          
        
        =
        (
        (
        
          g
          
            r
          
        
        
          )
          
            rk
          
        
        ,
        M
        ⋅
        
          g
          
            a
            r
          
        
        )
        =
        
          (
          
            
              g
              
                
                  
                    a
                    r
                  
                  
                    H
                    (
                    
                      g
                      
                        a
                        b
                      
                    
                    )
                  
                
              
            
            ,
            M
            ⋅
            
              g
              
                a
                r
              
            
          
          )
        
      
    
    {\displaystyle C_{B}=((g^{r})^{\text{rk}},M\cdot g^{ar})=\left(g^{\frac {ar}{H(g^{ab})}},M\cdot g^{ar}\right)}
  

鲍勃解密过程

鲍勃使用他的私钥 
  
    
      
        b
      
    
    {\displaystyle b}
  
 解密：
计算

  
    
      
        x
        =
        (
        
          C
          
            B
            ,
            1
          
        
        
          )
          
            H
            (
            (
            
              
                pk
              
              
                A
              
            
            
              )
              
                
                  
                    sk
                  
                  
                    B
                  
                
              
            
            )
          
        
        =
        
          
            (
            
              g
              
                
                  
                    a
                    r
                  
                  
                    H
                    (
                    
                      g
                      
                        a
                        b
                      
                    
                    )
                  
                
              
            
            )
          
          
            H
            (
            (
            
              g
              
                a
              
            
            
              )
              
                b
              
            
            )
          
        
        =
        
          
            (
            
              g
              
                
                  
                    a
                    r
                  
                  
                    H
                    (
                    
                      g
                      
                        a
                        b
                      
                    
                    )
                  
                
              
            
            )
          
          
            H
            (
            
              g
              
                a
                b
              
            
            )
          
        
        =
        
          g
          
            a
            r
          
        
      
    
    {\displaystyle x=(C_{B,1})^{H(({\text{pk}}_{A})^{{\text{sk}}_{B}})}=\left(g^{\frac {ar}{H(g^{ab})}}\right)^{H((g^{a})^{b})}=\left(g^{\frac {ar}{H(g^{ab})}}\right)^{H(g^{ab})}=g^{ar}}
  

提取消息:

  
    
      
        M
        =
        
          
            
              C
              
                A
                ,
                2
              
            
            x
          
        
        =
        
          
            
              M
              ⋅
              
                g
                
                  a
                  r
                
              
            
            
              g
              
                a
                r
              
            
          
        
        =
        M
      
    
    {\displaystyle M={\frac {C_{A,2}}{x}}={\frac {M\cdot g^{ar}}{g^{ar}}}=M}
  

由此，鲍勃成功解密了原始消息 
  
    
      
        M
      
    
    {\displaystyle M}
  
。


注释 参考 综合参考 周德华. 代理重加密体制的研究. 代理重加密体制的研究（博士论文） (上海交通大学).   [2024-06-13]. （原始内容存档于2024-06-13）. 
David Nunez. Umbral: a threshold proxy re-encryption scheme (PDF). 2018  [2024-06-13]. （原始内容存档 (PDF)于2024-03-31）. 
Zachary Scott. Re-encryption (PDF). Lecture 17: Re-encryption (技术报告) (600.641 Special Topics in Theoretical Cryptography).   [2024-06-13].