Page 443 - 《软件学报》2025年第4期
P. 443
陶静怡 等: 基于区块链和去中心化可问责属性认证的众包方案 1849
同时执行 zk-SNARKs 的初始化算法生成参数 crs . 将公共参数 GP = {p,G,g,crs,H ,H,H 1 ,H 2 ,F} 公开上链.
*
R
*
*
(2) UserSetup(GP) → GID,S u . 用户注册时, 选择秘密值 S u ←{0,1} , 计算用户的唯一标识 GID = H (S u ) , 由智
能合约保证 GID 在区块链上全局唯一.
n 个成员组成, 门限值为 t. 首先, 机构的每个成员
(3) AASetup(n,t,aid,GP) → PK,{SK i }. 属性授权机构 aid 由
R R R R
′
′
′
Member i 选择 α i ←Z p ,y i ←Z p 和 f i ←Z p [x], f i ←Z p [x] 满足 deg(f i ) = t −1,deg( f i ) = t −1 且 f i (0) = α i , f i (0) = y i . 则机构
n n
∑ ∑
′
的私钥为 SK = {OSK = α i ,ASK = y i } . 接着针对全部 n 个成员生成秘密 share ij = {f i (GID j ), f i (GID j )} , 并
i=1 i=1
n−1 个成员发送了对
将其通过可信信道秘密分享给 Member j , j ∈ [1,n], j , i , 自己保留 share ii . 所有成员都给其他
应的秘密, 也拥有了 n 个不同成员生成的秘密. Member i 接收到 n 个不同成员生成的秘密 share ji , j ∈ [1,n] , 可以计
∑ n ∑ n
′
算得到部分机构私钥 OSK i = f j (GID i ),ASK i = f j (GID i ) 和部分机构公钥 OPK i = e(g,g) OSK i ,APK i = g ASK i .
j=1 j=1
智能合约选取 t 个部分机构公钥生成属性机构公钥 PK = {OPK,APK} 并公开上链.
∏ ∏ t GID j ∏ ∏ t GID j
t t
OPK = OPK i j=1, j, GID j −GID i , APK = APK i j=1, j,i GID j −GID i .
i=1 i=1
R R
,
(4) TracerSetup(n,t,GP) → TPK,{TSK i }. 追踪者协作分享秘密, Tracer i 选择 z i ←Z p θ i ←Z p [x] , 满足 deg(θ i )=t−1
∑
n
TSK i = θ j (GID i ),TPK i = g TSK i .
且 θ i (0) = z i . 将 θ i (GID j ) 发送给 Tracer j , j ∈ [1,n], j , i. Tracer i 计算部分公私钥为
j=1
智能合约挑选 t 个追踪者生成的部分公钥 TPK i 可以生成追踪组公钥 TPK 并公开上链.
∏ t ∏ t GID j
TPK = TPK i j=1, j,i GID j −GID i .
i=1
3.2 属性申请阶段
KeyGen(aid, x,GID,{SK i },GP) → K x,GID ,K ′ x t 个属性权威
x,GID . 用户的身份标识为 GID , 向属性权威申请属性 ,
R
的成员协作生成属性密钥, 成员 i 选择 β i ←Z p , 计算用户关于属性 x 的部分属性密钥:
partK x i ,GID = g OSK i H(GID) APK i F(x) , partK ′ = g .
β i
β i
x i ,GID
智能合约通过 t 个部分属性私钥计算用户 GID 的属性密钥:
∏ ∏ t GID j ∏ ∏ t GID j
t t
′
′
K x,GID = partK x i ,GID j=1,j,i GID j −GID i , K x,GID = partK x i ,GID j=1,j,i GID j −GID i .
i=1
i=1
用户可以通过 e(g,K x,GID ) = OPK ·e(APK,H(GID))·e(K ′ ,F(x)) 验证属性密钥正确性.
x,GID
3.3 任务发布阶段
|Ω| |Ω| 为访问策略中所涉及属性
Encrypt(M,(A,ρ),{PK j } ,GP) → C. 请求者制定访问策略对任务内容进行加密,
j=1
R R
l
s
v
对应的属性机构公钥的数量. 首先选择一个随机数 s←Z p 和随机向量 v←Z , 其中 是向量 的第 1 个元素. 再选
p
R
R
l
择随机向量 w←Z , 其中第 1 个元素为 0. 最后对于矩阵 A 中的每一行 A k , 选择一个随机数 r k ←Z p , 则可以使用如
p
下公式加密任务信息 M 得到密文 C = {C 0 ,{C 1,k ,C 2,k ,C 3,k ,C 4,k ∀k}} , 其中,
s
C 0 = M ·e(g,g)
.
A k ·v A k ·w
C 1,k = e(g,g) e(g,g) ,C 2,k = g ,C 3,k = g g ,C 4,k = F(δ(k))
α ρ(k) r k −r k y ρ(k) r k r k
δ 将 A 的每一行映射为一个属性字符串. 请求者发布任务号 tid , 访问策略, 任务密文, 奖励信息, 签名和时间
限制, 并把押金传入合约.
3.4 提交认证阶段
∑
(1) Decrypt(C,{K x,GID ,K ′ },GP) → M . 符合策略的工作者首先需要计算 ω k ∈ Z p ,∀k , 使得 ω k A k = (1,0,...,0) .
x,GID
k
之后针对每一行 k , 计算:
′
C 1,k ·e(K δ(k),GID ,C 2,k )·e(H(GID),C 3,k )·e(K δ(k),GID ,C 4,k ) = e(g,g) A k ·v ·e(H(GID),g) A k ·w .
∏ A k ·v A k ·w ω k s
接下来针对每行获得的值进行乘方和累乘, 可以得到: k (e(g,g) ·e(H(GID),g) ) = e(g,g) 最终可以求得
s
明文 M = C 0 /e(g,g) .