【广播加密】知识总结

广播加密

广播加密:一种将数据内容通过广播信道安全地分发给合法用户的安全机制。只有发送者选定的授权(或者合法)用户才能解密,得到明文信息。

广播加密方案需要解决的基本问题

  • 保密
  • 抗同谋:撤销用户即使联合起来,也无法获得广播明文。如果所有的撤销用户都联合起来也无法解密得到明文,那么就称该方案为可抗完全同谋。
  • 用户的动态加入和退出:保证前向安全,也就是说退出的用户无法利用他们所知道的密钥解密出后继的广播秘文;在某些情况下还需要保证后向安全,也就是说新加入的成员无法破解它加入之前的密文。

广播加密方案性能主要指标

  • 密钥存储量:主要是指接收用户需要存储的密钥大小和数量。
  • 通信开销:广播密文包的长度。
  • 计算量:加密、解密的计算开销。

前置知识

Diffie-Hellman问题和Diffie-Hellman假设

Diffie-Hellman假设有两种类型:1. 计算性Diffie-Hellman假设(CDH)2. 判定性Diffie-Hellman假设(DDH)

明显的,DDH假设中蕴含着CDH假设,也就是说DDH假设比CDH假设更强。

  • l − B D H E l-BDHE lBDHE困难问题

  • 双线性映射的DH置换假设

双线性映射

1 G 2 1_{G_2} 1G2 G 2 G_2 G2的单位元。

有状态广播加密 stateful broadcast

有状态广播加密方案:是针对有状态接收者的,指接收者可以保存接收信息,用户可以根据接收到的广播信息对存贮的密钥进行更新。

特点:由于密文是利用当前组用户共享的组密钥进行加密,当组用户发生动态变化时,即有用户的加入和退出,此时为了保证广播安全,组内所有的用户的密钥都必须更新,此时通信量较大。另外有状态加密要求所有用户一直处于在线状态。

  • 基于逻辑密钥树(LKH)的组播方案

    当前授权用户共享一个相同的对称密钥,称为组密钥。每个用户除了存储组密钥之外,还存储一系列的更新密钥。

    一棵高为 h h h的二叉平衡逻辑密钥树,它的授权用户个数 m m m 2 k − 1 2^{k-1} 2k1,每个授权用户保存的密钥数量为 h h h,组控制器保存的密钥数量是 2 k − 1 2^k-1 2k1。当有用户需要加入和退出,密钥更新需要的通信量是 O ( 2 r log ⁡ 2 m ) O(2r\log^2 m) O(2rlog2m) r r r是加入或者退出的用户数。

无状态广播加密 stateless broadcast

无状态广播加密方案:是指接受者不能改变其初始状态,仅按照初始设置的密钥处理接收到的广播数据,由于接收用户密钥不需要更新,因此不要求用户一直处于在线状态。

基于对称密钥的广播加密

在Revocation and Tracing Schemes for Stateless Receivers中提到,“子集覆盖”框架(Subset-Cover),由三个算法组成:

  1. 初始化:使每个用户属于若干个集合,该用户持有其所属所有集合对应的密钥。
  2. 广播加密:用Cover算法将授权用户集合划分为不相交的子集 { p i 1 , p i 2 , . . . , p i m } \{p_{i_1}, p_{i_2}, ..., p_{i_m}\} {pi1,pi2,...,pim},每个合法用户属于且仅属于这其中的某一个集合。广播方会选择会话密钥 K K K,分别用这些划分子集的密钥 { k i 1 , k i 2 , . . . , k i m } \{k_{i_1}, k_{i_2}, ..., k_{i_m}\} {ki1,ki2,...,kim}对会话密钥 K K K加密,而发送给的消息用会话密钥加密。 < [ i 1 , i 2 , . . . , i m , E k i 1 ( K ) , E k i 2 ( ) K , . . . E k i m ( K ) ] , E K ( M ) > <[i_1,i_2,...,i_m,E_{k_{i_1}}(K),E_{k_{i_2}}()K,...E_{k_{i_m}}(K)], E_K(M)> <[i1,i2,...,im,Eki1(K),Eki2()K,...Ekim(K)],EK(M)>,[]中是广播头,剩余部分是广播体。
  3. 用户端解密:每个合法用户接收到加密消息后,在广播头中寻找到用自身集合密钥所加密的数据,使用持有的密钥解密就可以获得会话密钥,并用会话密钥对消息解密。

完备子树法(Complete Subtree, CS)、子集差分法(Subset Difference, SD)、LSD(layered subset difference)、SSD(stratified subset difference)

完备子树 CS

定义(子集覆盖):用 N N N表示广播加密系统用户集合, T T T表示目标用户集合, R = N / T R=N/T R=N/T表示废除用户的集合。对 N N N的子集覆盖是指子集 S 1 , S 2 , . . . , S w S_1,S_2,...,S_w S1,S2,...,Sw(其中 S j ⊆ N , 1 < = j < = w S_j\subseteq N, 1<=j<=w SjN,1<=j<=w)满足:

  1. 每个自己 S j S_j Sj有一个相应的密钥 L j L_j Lj,用户 u ∈ S j u\in S_j uSj可以通过其秘密信息 k u k_u ku计算获得密钥 L j L_j Lj
  2. 对于每个废除集合 R ⊆ N R\subseteq N RN,存在不相交的子集 S i 1 , S i 2 , . . . , S i w S_{i1},S_{i2},...,S_{iw} Si1,Si2,...,Siw使得 N / R = ∪ j = 1 m S i N/R=\cup^m_{j=1}S_i N/R=j=1mSi

完备子树方法:用 N N N表示广播加密系统用户集合,其中废除用户集合为 R R R。总共用户数量 n n n为2的指数次方。完备子树法由初始化,广播加密,用户解密三部分算法组成如下:

  1. 初始化:建立一棵完全二叉树,以 n n n个用户作为叶子节点。该二叉树总共有 2 n − 1 2n-1 2n1个节点和 log ⁡ n + 1 \log n+1 logn+1条根节点通向叶子节点的路径。用 v i ( 1 < = i < = 2 n − 1 ) v_i(1<=i<=2n-1) vi(1<=i<=2n1)表示 2 n − 1 2n-1 2n1个节点。对于每个节点 v i v_i vi定义子集 S i S_i Si为所有以 v i v_i vi为祖节点的节点集合。每个节点 v i v_i vi都被分配一个随机均匀选择的密钥 L i L_i Li,所有的用户分配得到他自身节点到根结点路径上的所有节点的密钥。
  2. 广播加密:选择一会话密钥 K K K和废除用户集合 R R R作为输入。令 u 1 , u 2 , . . . u r u_1,u_2,...u_r u1,u2,...ur R R R中用户。接着建立斯坦纳树,也即连接根节点和废除用户的最小子树。子集 S i 1 , S i 2 , . . . S i m S_{i1},S{i2},...S_{im} Si1,Si2,...Sim为二叉树中根节点 v 1 . . . v m v_1...v_m v1...vm不在 S T ( R ) ST(R) ST(R)中但与 S T ( R ) ST(R) ST(R)中出度为1的节点相连的子树集合。然后广播者用一加密算法 E E E和密钥 L i 1 , L i 2 , . . . , L i m L_{i1},L_{i2},...,L_{im} Li1,Li2,...,Lim分别对会话密钥 K K K进行加密,将 ( i 1 , i 2 , . . . , i m , E L i 1 ( K ) , E L i 2 ( K ) ) , . . . , E L i m ( K ) (i_1,i_2,...,i_m,E_{L_{i1}}(K),E_{L_{i2}}(K)),...,E_{L_{im}}(K) (i1,i2,...,im,ELi1(K),ELi2(K)),...,ELim(K)发送到广播信道中。
  3. 解密:用户收到信息 ( i 1 , i 2 , . . . , i m , E L i 1 ( K ) , E L i 2 ( K ) ) , . . . , E L i m ( K ) (i_1,i_2,...,i_m,E_{L_{i1}}(K),E_{L_{i2}}(K)),...,E_{L_{im}}(K) (i1,i2,...,im,ELi1(K),ELi2(K)),...,ELim(K)。用户根据自己所属的自己 u ∈ S i j u\in S_{i_j} uSij找到 i j i_j ij,然后用密钥 L i j L_{i_j} Lij解密,获得会话密钥;否则,如果 u ∉ S i j u\notin S_{i_j} u/Sij计算将终止,因为该用户是废除用户而没有对应的解密密钥。

**定理:**完全子树方法提供的用户集合 N N N的子集覆盖和广播加密方案,其广播头长度为 O ( r log ⁡ n r ) O(r\log \frac{n}{r}) O(rlogrn),用户存储开销为 O ( log ⁡ n ) O(\log n) O(logn)

子集差分 SD

CS方案的主要不足之处是集合 N / R N/R N/R被分成的子集数太多。为了减少被分割成的子集数,提出一种改进的SD方案,其被分割成的子集最多为 2 r − 1 2r-1 2r1,从而减少通信开销。

设全体用户的集合用 N N N表示,也就是说 u 1 , u 2 , . . . , u n u_1,u_2,...,u_n u1,u2,...,un是全体用户集合。被撤销的用户集合用 R R R表示,也就是说 u 1 , u 2 , . . . , u r u_1,u_2,...,u_r u1,u2,...,ur是被撤销的用户。

接收者(用户)被当作是完全二叉树的叶子节点,子集 S 1 , S 2 , . . . , S w S_1,S_2,...,S_w S1,S2,...,Sw是这样的集合:类似于集合 G 1 − G 2 G_1-G_2 G1G2的结果,其中满足 G 2 ⊂ G 1 G_2\subset G_1 G2G1 G 1 , G 2 G_1,G_2 G1,G2分别是包含一个完全二叉树的集合。因此,一个合法的集合 S S S可以由树上的两个节点 ( v i , v j ) (v_i, v_j) (vi,vj)来表示, v i v_i vi v j v_j vj的祖先。我们把这样的集合称之为 S i , j S_{i,j} Si,j,一个叶子节点 u u u属于 S i , j S_{i, j} Si,j当且仅当它以 v i v_i vi为根结点,不以 v j v_j vj为根结点。

密钥生成

G G G是一个伪随机序列生成器, S e e d Seed Seed为种子输入序列,输出序列长度为 S e e d Seed Seed的三倍。任取密钥树中的一个节点 v i v_i vi v 2 i , v 2 i + 1 v_{2i}, v_{2i+1} v2i,v2i+1是其左右孩子。为 v i v_i vi分发一个随机序列 S e e d i Seed_i Seedi。将 S e e d i Seed_i Seedi送入伪随机序列生成器生成 G L ( S e e d i ) , G M ( S e e d i ) , G R ( s e e d i ) G_L(Seed_i), G_M(Seed_i), G_R(seed_i) GL(Seedi),GM(Seedi),GR(seedi)向下传递。其中 G L ( S e e d i ) G_L(Seed_i) GL(Seedi)传递给左孩子, L A B E L i , 2 i = G L ( S e e d i ) LABEL_{i,2i}=G_L(Seed_i) LABELi,2i=GL(Seedi),再将 L A B E L i , 2 i LABEL_{i,2i} LABELi,2i送入 G G G,子集 S i , 2 i S_{i,2i} Si,2i的密钥 L i , 2 i = G M ( L A B E L i , 2 i L_{i,2i}=G_M(LABEL_{i,2i} Li,2i=GM(LABELi,2i。继续向下传递,直到完全覆盖以 v i v_i vi为根的完全二叉树。寄诶单 v i v_i vi和任意一个子孙节点 v j v_j vj,对于集合 S i , j S_{i,j} Si,j都可以得到对应的子集密钥 L i , j = G M ( L A B E L i , j ) L_{i,j}=G_M(LABEL_{i,j}) Li,j=GM(LABELi,j)

L A B E L i , j = G L ( G R ( G R ( L ) ) ) L i , j = G M ( L A B E L i , j ) LABEL_{i,j}=G_L(G_R(G_R(L))) \\ L_{i,j}=G_M(LABEL_{i,j}) LABELi,j=GL(GR(GR(L)))Li,j=GM(LABELi,j)

由于使用了伪随机序列生成器 G G G,每个用户无需存储其所属的所有子集的子集密钥以构成初始密钥,仅需存储一部分 L A B E L LABEL LABEL便可通过G生成其所需的所有的子集密钥。不妨将用户 u u u所属的子集表示为 S i , j S_{i ,j} Si,j,节点 v i v_i vi必然在用户节点到加密树的根节点的路径上,节点 v j v_j vj必然是节点 v i v_i vi的子孙节点且不在这条路径上,节点 v j v_j vj中有部分节点与这条路径相邻(又称为“悬挂”在这条路径上)。用户的初始密钥 I u I_u Iu仅仅由 v i v_i vi在这些节点上生成的 L A B E L LABEL LABEL组成。

v i v_i vi为根的完全二叉树的高为 k k k,对应 v i v_i vi用户需要保存 k k k L A B E L LABEL LABEL v i v_i vi取遍所有的可能的点 k k k 1 1 1取道 log ⁡ N \log N logN,再加上无撤销用户特殊情况, I u I_u Iu中包含的 L A B E L LABEL LABEL的总数为:
∑ k = 1 log ⁡ N k + 1 = 1 2 log ⁡ 2 N + 1 2 log ⁡ N + 1 \sum^{\log N}_{k=1}{k+1}=\frac{1}{2}\log^2N+\frac{1}{2}\log N+1 k=1logNk+1=21log2N+21logN+1
伪随机序列生成器 G G G的引入使得用户的初始密钥长度由 O ( N ) O(N) O(N)缩减为 O ( log ⁡ 2 N ) O(\log^2 N) O(log2N)

子集差分的方法:

子集差分方法是将 N / R N/R N/R分成不同的子集 S i 1 , j 1 , S i 2 , j 2 , . . . , S i m , j m S_{i_1,j_1}, S_{i_2,j_2},...,S_{i_m,j_m} Si1,j1,Si2,j2,...,Sim,jm的过程。设 S T ( R ) ST(R) ST(R)表示由集合 R R R和根结点所产生的(直接)斯坦纳树。初始使树 T T T等于 S T ( R ) ST(R) ST(R),然后反复从 T T T中移除节点直到 T T T只剩下一个节点:

  1. T T T中寻找两个叶子节点 v i , v j v_i,v_j vi,vj,满足 v i , v j v_i,v_j vi,vj最近的相同的根结点 v v v不包含 T T T中此子树的其他叶子节点。设 v l , v k v_l,v_k vl,vk v v v的两个孩子节点,且满足 v i v_i vi v l v_l vl的子孙, v j v_j vj v k v_k vk的子孙。如果只剩下一个叶子节点,那么 v i = v j v_i=v_j vi=vj v v v就是 T T T的根结点, v l = v k = v v_l=v_k=v vl=vk=v
  2. v l ≠ v i v_l\neq v_i vl=vi,就把子集 S l , i S_l,i Sl,i加入;同样的,当 v k ≠ v j v_k\neq v_j vk=vj,就把子集 S k , j S_k,j Sk,j加入。
  3. T T T中所有的子孙节点删除掉,并使 v v v为一个叶子节点。

子集差分方法的评价

对于完备子树方法CS来说,其最大的缺点是分割的集合可能很大,而对于子集差分方法没有这个缺点。子集差分方法要求接收用户的存储容量分别是 log ⁡ N \log N logN 1 2 log ⁡ 2 N \frac{1}{2}\log^2 N 21log2N,其中 N N N是总的用户数。要想撤销 r r r个用户,需要存储的消息是 r log ⁡ N r\log N rlogN,需要的密钥是 2 r 2r 2r个。

分层子集差分 LSD

SD方案在用户总数很大并且只有少数撤销用户的情况下十分有效,但是SD方案用户存储的密钥量不但与N有关并且比CS更大。而LSD方案在保持SD方案密钥管理块长度和解密操作时间复杂度数量级不变的情况下,将用户的初始密钥量减少到 O ( l o g 1 + ϵ ( N ) ) ( ϵ > 0 ) O(log^{1+\epsilon}(N))(\epsilon>0) O(log1+ϵ(N))(ϵ>0)

在SD方案中,设用户u属于集合 S i , j S_{i,j} Si,j,用户的初始密钥 I u I_u Iu的长度与节点 v i , v j v_i, v_j vi,vj间的距离有关。LSD方案的基本思想是对密钥树分层,从而将划分子集 S i , j S_{i, j} Si,j的节点 v i , v j v_i,v_j vi,vj的距离控制在任意两层之内,达到缩短 I u I_u Iu的目的。

LSD方案有Basic LSD和General LSD两个版本,General LSD是Basic LSD的扩展,Basic是General的一个特例。

Basic LSD方案

Basic所做的工作就是,按照SD方案得到划分子集 S i , j S_{i,j} Si,j,如果划分子集是用差分子集则保留不变,否则就根据上述引理将其拆分 S i , j = S i , k ∪ S k , j S_{i,j}=S_{i,k} \cup S_{k,j} Si,j=Si,kSk,j v i , v k v_i, v_k vi,vk在同一层, v k v_k vk是特殊节点。显然,通过这种方法可以将两个节点之间的距离控制在 log ⁡ N \sqrt {\log N} logN 以内。

可以将用户u所属的子集表示为 S i , j S_{i,j} Si,j,在LSD方案中 S i , j S_{i,j} Si,j是有用差分子集。根据定义存在两种情况:

  1. 节点 v i , v j v_i,v_j vi,vj在同一层内

    每一层的高度都是 log ⁡ N \sqrt {\log N} logN ,从上文SD方案中可以知道每一层中用户需要保存的LABEL数量为 O ( ( log ⁡ N ) 2 ) = O ( log ⁡ N ) O((\sqrt{\log N})^2)=O(\log N) O((logN )2)=O(logN)。整个加密树一共有 log ⁡ N \sqrt{\log N} logN 个层,因此在节点 v i , v j v_i,v_j vi,vj在同一层内的时候,用户保存的LABEL的数量为 O ( log ⁡ 3 2 N ) O(\log ^{\frac{3}{2}}N) O(log23N)

  2. v i v_i vi是特殊节点

    作为特殊节点,与 v i v_i vi对应的节点 v j v_j vj,可以是 v i v_i vi的任意一个子孙节点,数量为 O ( log ⁡ N ) O(\log N) O(logN)。对于用户节点而言,其先祖节点中特殊节点的个数为 log ⁡ N \sqrt{\log N} logN 。因此当 v i v_i vi是特殊节点时,用户保存的LABEL的数量为 O ( log ⁡ 3 2 N ) O(\log ^{\frac{3}{2}}N) O(log23N)

Basic对SD方案进行了改进,使用户的初始密钥量由 O ( log ⁡ 2 N ) O(\log^2 N) O(log2N)减少为 O ( log ⁡ 3 2 N ) O(\log ^{\frac{3}{2}}N) O(log23N)。而 log ⁡ N \sqrt{\log N} logN 的取值也很容易可以证明是最佳取值。

General LSD方案

为了更好的理解,可以从理论上抽象为一个凸轮问题,同时提出一个简单有效的基于编码的序列转化的解决方案。取任意一个叶子节点到根结点的路径来分析:

D D D是一个差分子集可拆分的最大个数(Basic中 D = 2 D=2 D=2):
b = O ( log ⁡ 1 / D N ) b=O(\log ^{1/D} N) b=O(log1/DN)
路径上的每一个节点都可以用一个 D D D位的以 b b b为基的数来表示,根结点到叶子节点从上往下从可以表示的最小的数开始依次递增。当存在一个子集需要被拆分,实际上就是设计一个编码序列转化方法把从表示节点的 v i v_i vi的数字一步步转化成表示 v j v_j vj的数。比如,考虑将十进制表示法中的 i = 825917 i=825917 i=825917更改为 j = 864563 j=864563 j=864563的问题,最简单的解决方案是允许任意单位的位数转换,比如:
825917 → 865917 → 864917 → 864517 → 864567 → 864563 825917 → 865917 → 864917 → 864517 → 864567 → 864563 825917865917864917864517864567864563

根据上述的定义,编码序列转化进行差分子集划分的方法同样适用于Basic,在Basic中 D = 2 D=2 D=2,任何编号以0结尾的节点都是特殊节点。在General中,不但存在普通节点和特殊节点,特殊节点中也有等级的划分:编号以0结尾的节点是特殊节点,出现连续0个数越多,说明其特殊的等级越高。在我门前面的例子里,这些有用的转换允许广播公司将 S i , j S_i,j Si,j拆分成以下部分:
825917 → 825920 → 826000 → 830000 → 864563 825917→825920→826000→830000→864563 825917825920826000830000864563
从广播者的角度来看,前三个转化属于第一类型(跳转到层的末尾并且增加节点的特殊等级),最后一个转换属于第二类型(跳转到层的中间)。

在General中,用户的初始密钥中包含的LABEL数量级为 O ( log ⁡ 1 + 1 / D N ) O(\log^{1+1/D} N) O(log1+1/DN),理论上来说,只要 D D D的取值足够大,就可以使得用户的初始密钥量缩减为 O ( log ⁡ 1 + ϵ N ) ( ϵ > 0 ) O(\log^{1+\epsilon} N)(\epsilon >0) O(log1+ϵN)(ϵ>0)

基于公钥的广播加密

基于公钥的广播加密方案的安全性基本上都是**基于BDH假设(bilinear diffie-hellman assumption)**及其广义变形,比如BDHE假设、第一个实用的基于身份加密(Identity Based Encryption, IBE)。

  • 多公钥广播加密

    将“子集覆盖”对称广播加密转换为公钥广播加密,即将原方案中划分成的每个子集所对应的密钥转化为一对公钥/私钥,广播方会在广播时会选择一会话密钥,分别使用公钥非对称加密,然后使用会话密钥对称加密密文。

    为了减少大量公钥带来的存储开销,在CS方法中使用了基于身份的公钥加密,在更高效的SD和LSD方法中,使用了分层结构的基于身份的公钥加密算法。

    基于身份加密的基本思想是公钥可以是任何唯一的字符串,发布房不再需要发布大量的用户公钥,用户也不需要存储大量公钥,私钥存储量、通信开销和对称密钥相同。

  • 固定公钥广播加密

    比如BGW方案。

  • 动态公钥广播加密

    在系统出事建立时,广播用户的总数是不定的,可以动态的发生变化。

公开密钥广播加密方案 BGW

BGW1方案:该方案由系统建立、加密、解密三个算法构成,具体实现如下:

  1. 系统建立 Setup ( λ , n ) (\lambda,n) (λ,n)

    给定一个安全参数 λ \lambda λ,接收者集合大小为 n n n。输出 ( P K , D K , M K , F ) (PK,DK,MK,F) (PK,DK,MK,F) F = ( p , g , G , G T , e ( . , . ) ) F=(p,g,G,G_T,e(.,.)) F=(p,g,G,GT,e(.,.))是一个双线性构造,其中 ∣ p ∣ = λ |p|=\lambda p=λ e : G × G → G T e:G\times G\rightarrow G_T e:G×GGT是一个双线性映射, g g g G G G的生成元,阶是 p p p

    P K = ( g , g 1 , . . . , g n , g n + 2 , . . . , g 2 n , v ∈ G 2 n + 2 ) PK=(g, g_1,...,g_n,g_{n+2},...,g_2n,v\in G^{2n+2}) PK=(g,g1,...,gn,gn+2,...,g2n,vG2n+2)是系统公钥。其中 g i = g α i ∈ G g_i=g^{\alpha^i}\in G gi=gαiG v = g γ v=g^{\gamma} v=gγ γ \gamma γ随机选取 γ ∈ Z p \gamma\in Z_p γZp

    D K = ( d 1 , d 2 , . . . , d n ) DK=(d_1,d_2,...,d_n) DK=(d1,d2,...,dn) d i = g i γ ∈ G , ( i = 1 , 2 , . . . , n ) d_i=g_i^{\gamma}\in G,(i=1,2,...,n) di=giγG,(i=1,2,...,n)。其中 d i d_i di是接收者 i i i的解密私钥,由秘密中心分发给接收者 i i i

    M K = ( γ , α ) MK=(\gamma, \alpha) MK=(γ,α)是由密钥分发中心随机生成的主密钥,对接收者和广播中心保密。

  2. 加密 Encrypt(PK,S)

    给定加密公钥 P K PK PK和接收者用户合集 S S S。输出 ( H e r , S K ) (Her,SK) (Her,SK),其中 H d r = ( C 0 , C 1 ) , C 0 = g t , c 1 = ( v ∏ j ∈ S g n − 1 − j ) t Hdr=(C_0,C_1),C_0=g^t,c_1=(v\prod_{j\in S}g_{n-1-j})^t Hdr=(C0,C1),C0=gt,c1=(vjSgn1j)t t t t随机选取 t ∈ Z p t\in Z_p tZp

    协商的会话密钥为 S K = e ( g n + 1 , g ) t SK=e(g_{n+1},g)^t SK=e(gn+1,g)t

  3. 解密 Decrypt ( S , i , d i , H d r , P K ) (S,i,d_i,Hdr,PK) (S,i,di,Hdr,PK)

    输入密文头 H d r Hdr Hdr、公钥 P K PK PK、授权用户集合和用户子集的私人密钥 d i d_i di,如果该用户是授权用户,则可以计算出 K = e ( g i , C i ) / e ( d i ∏ j ∈ S , j ≠ i g n − 1 − j − i , C 0 ) K=e(g_i,C_i)/e(d_i\prod_{j\in S, j\neq i}g_{n-1-j-i}, C_0) K=e(gi,Ci)/e(dijS,j=ign1ji,C0)。可以验证解密计算中得到的 K K K就是加密过程中所产生的共同密钥。

该方案的用户私钥是群 G G G中的一个元素,长度仅为1, H d r Hdr Hdr长度仅为2。同时,广播中心在计算会话密钥时,因为 e ( g n − 1 , g ) e(g_{n-1},g) e(gn1,g)可以被预计算,加密过程不需要进行对计算。因此该方案有良好的计算效率。

对于大量的接收者,解密时间由 ∣ S ∣ − 2 |S|-2 S2组运算(计算 ∏ j ∈ S , j ≠ i g n − 1 − j − i \prod_{j\in S, j\neq i}g_{n-1-j-i} jS,j=ign1ji)来主导。然而,我们同时可以观察到,如果接收者之前已经计算了数值 w = ∏ j ∈ S ′ , j ≠ i g n − 1 − j − i w=\prod_{j\in S', j\neq i}g_{n-1-j-i} w=jS,j=ign1ji,其中 S ′ S' S是和 S S S相似的,那么接收者就可以只通过 δ \delta δ组运算来计算 ∏ j ∈ S , j ≠ i g n − 1 − j − i \prod_{j\in S, j\neq i}g_{n-1-j-i} jS,j=ign1ji,其中 δ \delta δ S ′ S' S S S S的差的大小。在面临大量的接收者时,这个方法是十分有效的。

BGW2方案:在BGW1方案中,当广播用户数为 n n n的时候,公钥长度 2 n + 1 2n+1 2n+1,在需要公钥长度仅可能短的应用背景下,方案就会显得不太实用。所以提出了一个更一般的BGW方案。

假设广播用户数量为 n n n,系统用户集合为 { u 1 , u 2 , . . . , u n } \{u_1,u_2,...,u_n\} {u1,u2,...,un}。可以把用户按照每组为 B B B个用户分组。令 n = A B n=AB n=AB,则我们就可以把所有的用户数分成 A A A组,每组 { u i 1 , . . . , u i B } \{u_{i1},...,u_{iB}\} {ui1,...,uiB}看作是一个独立的广播组,并且让不同的分组公用一套相同的 { g , g 1 , . . . , g B , g B + 2 , . . . , g 2 B } \{g,g_1,...,g_B,g_{B+2}, ..., g_{2B}\} {g,g1,...,gB,gB+2,...,g2B},这样就能大大减少系统的公钥数。具体实现如下:

  1. 系统建立Setup ( λ , n ) (\lambda,n) (λ,n)

    给定一个安全参数 λ \lambda λ,接收者集合大小为 n n n。令 ⌈ n / B ⌉ \lceil n/B \rceil n/B G G G是一个双线性映射群,阶为 p p p。该算法随机选取一个生成元 g ∈ G g\in G gG α ∈ Z p \alpha \in Z_p αZp,计算 g i = g α i g_i=g^{\alpha ^i} gi=gαi,其中 i = 1 , 2 , . . . , B , 2 B , . . . , 2 B i=1,2,...,B,2B,...,2B i=1,2,...,B,2B,...,2B。然后随机选取 γ 1 , . . . , γ A ∈ Z p \gamma_1, ...,\gamma_A\in Z_p γ1,...,γAZp,并且令 v 1 = g γ 1 , . . . , v A = g γ A ∈ G v_1=g^{\gamma_1}, ..., v_A=g^{\gamma_A}\in G v1=gγ1,...,vA=gγAG。现在,这该系统的公钥设置为 P K = ( g , g 1 , . . . , g B , g b + 2 , . . . , g 2 B , v 1 , . . . , v A ) ∈ G 2 B + A PK=(g,g_1,...,g_B,g_{b+2}, ...,g_{2B},v_1,...,v_A)\in G^{2B+A} PK=(g,g1,...,gB,gb+2,...,g2B,v1,...,vA)G2B+A,将其公开。

    用户 i ∈ { 1 , . . . , n } i\in \{1,...,n\} i{1,...,n}的私人密钥的设定过程为:把 i i i记为 i = ( a − 1 ) B + b i=(a-1)B+b i=(a1)B+b,其中 1 < = a < = A , 1 < = b < = B 1<=a<=A, 1<=b<=B 1<=a<=A,1<=b<=B(可以令 a = ⌈ i / B ⌉ , b = i m o d    B a=\lceil i/B \rceil, b=i \mod B a=i/B,b=imodB);用户 i i i的私人密钥设置为 d i = g b γ a ∈ G d_i=g^{\gamma_a}_b\in G di=gbγaG,注意 d i = v a ( α b ) d_i=v_a^{(\alpha^ b)} di=va(αb)。系统将密钥 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn秘密分发给对应的用户。

  2. 加密 Encrypt ( P K , S ) (PK,S) (PK,S)

    对于 l = 1 , . . . , A l=1,...,A l=1,...,A,定义子集 S ^ l , S l \hat S_l, S_l S^l,Sl
    S ^ l = S ∩ { ( l − 1 ) B + 1 , . . . , l B } , S l = { x − l B + B ∣ x ∈ S ^ l } ⊆ { 1 , . . . , B } \hat S_l=S\cap\{(l-1)B+1,...,lB \}, S_l=\{ x-lB+B|x\in \hat S_l \} \subseteq \{1,...,B\} S^l=S{(l1)B+1,...,lB},Sl={xlB+BxS^l}{1,...,B}
    也就是说, S ^ l \hat S_l S^l包含 S S S落在长度为 B B B的第 l l l个区间内的所有用户。而 S l S_l Sl包含这些用户相对于区间开始的索引。

    然后,随机选取 t ∈ Z p t \in Z_p tZp,令会话密钥为 K = e ( g B + 1 , g ) t ∈ G K=e(g_{B+1}, g)^t \in G K=e(gB+1,g)tG,其中 e ( g n + 1 , g ) e(g_{n+1}, g) e(gn+1,g)可以通过 e ( g n , g 1 ) e(g_n, g_1) e(gn,g1)来得到。最后,系统输出 ( H d r , K ) (Hdr,K) (Hdr,K),其中 H d r = ( C 0 , C 1 , . . . , C A ) ∈ G A − 1 , C 0 = g t , C 1 = ( v ∏ j ∈ S 1 g g B + 1 − j ) t , . . . , C A = ( v ∏ j ∈ S A g g B + 1 − j ) t Hdr=(C_0,C_1,...,C_A)\in G^{A-1}, C_0=g^t, C_1=(v\prod_{j\in S_1}g_{g_{B+1-j}})^t, ..., C_A=(v\prod_{j\in S_A}g_{g_{B+1-j}})^t Hdr=(C0,C1,...,CA)GA1,C0=gt,C1=(vjS1ggB+1j)t,...,CA=(vjSAggB+1j)t

  3. 解密Decrypt ( S , i , d , H d r , P K ) (S,i,d,Hdr,PK) (S,i,d,Hdr,PK)

    输入密文头 H d r Hdr Hdr、公钥 P K PK PK、授权用户集合和用户子集的私人密钥 d i d_i di,其中 i = ( a − 1 ) B + b , 1 < = a < = A , 1 < = b < = B i=(a-1)B+b, 1<=a<=A, 1<=b<=B i=(a1)B+b,1<=a<=A,1<=b<=B,如果该用户是授权用户,则可以计算出 K = e ( g b , C a ) / e ( d i ∏ j ∈ S i , j ≠ b g B − 1 + b , C 0 ) K=e(g_b, C_a)/e(d_i\prod_{j\in S_i, j\neq b} g_{B-1+b}, C_0) K=e(gb,Ca)/e(dijSi,j=bgB1+b,C0)。可以验证在解密计算中得到的 K K K就是加密过程中所产生的共同密钥。

在该方案中,如果我们令 B = n B=n B=n,那么这个方案就变成了 B G W 1 BGW1 BGW1方案。在该方案中,用户私钥长度仍然为1,由于把用户分为 A A A组从而使广播消息密文头长度变成了 A + 1 A+1 A+1。但是系统公钥长度缩短为 2 B + A 2B+A 2B+A次。

我们对于 B B B的选择取决于应用。在某些情况下,我们希望 B = n B=n B=n用来获得尽可能小的密文;在其他情况下,我们选择 B = n B=\sqrt n B=n 来最小化密文和公钥的串联。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值