### 1. 需求背景
* 隐私数据或者文件加密链上存储
* 隐私数据或者文件加密链下存储，链上哈希验证
* 用户查看授权及权限管理

### 2. 代理重加密原理

* Nucypher中的应用

![](resource/eTlUccW.png)

#### 2.1 数据加密

![](resource/pre-encrypt.jpg)

* Alice生成一个随机数dek，作为对称加密秘钥： dek = random()
* 使用对称加密秘钥dek加密待分享的数据d： c = encryptSym(dek, d)
* 使用Alice的非对称公钥加密对称加密秘钥dek： edek = encryptPke(pkA, dek)
* 加密数据c+加密的秘钥edek上传到云服务器

#### 2.2 重加密秘钥

![](resource/pre-delegation.jpg)

* Alice使用自己的私钥和Bob的公钥为Bob生成对应的重加密秘钥： re = reKey(skA, pkB)
* 将重加密秘钥分发到重加密节点

#### 2.3 数据解密

![](resource/pre-decrypt.jpg)

* Bob在云服务器下载加密数据c+加密的秘钥edek
* 向重加密节点申请重加密
* 重加密节点秘钥转换：edek'=reEncrypt(reS->R, edek)
* 使用Bob私钥解密对称秘钥： dek=decryptPke(skB, edek') 
* 使用对称加密秘钥解密数据： d=decryptSym(dek, c)

### 3. 代理重加密和传统DH加密的区别

* 区别一
传统的DH加密原理是发送方和接受方选择独自的随机数，经过一定计算之后交换计算结果，然后双方生成同样的数作为对称加密共享秘钥。
DH加密结合云服务器存储也能解决隐私数据上链的问题，在共享用户数量，加密文件和秘钥稳定性不变的时候，两者区别不大，重加密甚至复杂度会相对高一点。
在共享用户数量不定，加密文件数量不定，或者对称秘钥频繁更新的场景，DH加密会增加客户端的加密工作量，而代理重加密则把这部分工作转化为重加密转移到云服务器完成。

* 区别二
传统加密方式没有秘钥管理，一次分享之后除非更换对称加密秘钥，否则被分享人一直具有解密权限
代理重加密有秘钥管理机制，分享者可以通过重加密节点可以对分享用户的访问时限和权限做控制


### 4. Nucypher中的秘钥分片

![](resource/EgjbaKq.png)

* 为防止重加密节点不按指定的策略，提前重加密，可以将重加密秘钥分片成多个分发到不同的节点，Bob在申请解密时同时想多个重加密节点申请重加密，获得固定数量的分片秘钥才可以用于解密。

* 秘钥分片的作用：允许在法定数量的节点上分离对重新加密操作的信任

* "m of n"方案：将“n”个密钥分配给网络上“n”个节点，需要“m”次重新加密（称为阈值）来访问某些数据。当这些节点收到重新加密的请求时，他们会执行加密操作用零知识证明的方法证明他们是正确的。如果他们没有正确地执行操作，那么使用以太坊上部署的智能合约来削减恶意执行操作的节点。

* Nucypher网络不是区块链网络，在以太坊区块链中仅仅通过智能合约来奖惩重加密节点。对于联盟链中存在可信中心化节点时，秘钥分片没有太大必要。

### 5. 整体结构

![](resource/pre.png)

### 6. 功能模块

![](resource/pre4.png)

### 7. 具体实现
#### 7.1 区块链(BlockChain)

#### 7.1.1 处理流程

![](resource/pre1.png)

#### 7.1.2 功能描述
* 节点注册：代理重加密节点通过智能合约，抵押一定代币，注册为代理重加密节点
* 节点注销：重加密节点注销，解锁剩余代币
* 数据owner注册：数据owner通过智能合约注册，根据当前节点数量锁定代理重加密奖励，关联所有代理重加密节点
* 节点重加密结果验证：合约对有疑问的解密分片校验，如果证明解密分片无效，扣除节点账户一定代币，奖励给交易发送方
* 节点激励：节点固定时间向合约发送交易，合约收到交易校验时节点账户之后，按规定的时间间隔将数据owner锁定的代币按配置分发到各个关联节点，类似挖矿

### 7.2 重加密客户端(PRE-Client)

#### 7.2.1 处理流程

![](resource/pre2.png)

#### 7.2.2 功能描述
* 数据owner： 加密；查询重加密节点信息；授权，生成秘钥共享分片；连接发送到所有重加密节点
* 授权用户： 申请重加密；解密
* 其他： 授权用户下载数据使用第三方下载客户端
  
### 7.3 重加密节点(PRE-Server)

#### 7.3.1 处理流程

![](resource/pre3.png)


#### 7.3.2 功能描述

* 重加密秘钥管理： 数据owner发起，增删授权人的重加密秘钥
* 重加密： 授权人发起，提供公钥签名，重加密节点验证签名，并且查找该授权人的重加密秘钥
* 节点激励触发： 节点每隔固定时间向合约发送交易，类似挖矿

