寻求无需可信第三方的双玩家零知识卡牌洗牌初始化方案
无可信第三方的双玩家零知识卡牌洗牌协议方案
核心优化思路
把原协议中第三方负责的「盐值选取、双重加密、洗牌」核心操作,拆分为双玩家协作的可验证流程:
- 用承诺+公开验证实现可随机洗牌,确保双方无法篡改牌序且能互相验证合法性
- 用双盲密钥映射替代第三方的双重加密,确保只有拿到对应密钥组合才能解密牌面
- 盐值由双方共同生成并验证,避免单方控制
初始化(洗牌)流程
密钥与盐值准备
- 玩家1生成52对非对称密钥对(
PK1-1~PK1-52,SK1-1~SK1-52),生成随机盐值S1,将所有PK1-*和Hash(S1)(盐值的哈希)发送给玩家2 - 玩家2生成52对非对称密钥对(
PK2-1~PK2-52,SK2-1~SK2-52),生成随机盐值S2,将所有PK2-*和Hash(S2)发送给玩家1 - 双方交换完公钥和盐哈希后,各自公开原始盐值
S1、S2,对方验证哈希一致性,确认盐值未被篡改。最终全局盐值S = S1 || S2(字符串拼接)
- 玩家1生成52对非对称密钥对(
第一轮加密与乱序
- 玩家1将52张原始卡牌(A♣~K♠)分别与
S拼接后,用自己的52个公钥PK1-*加密,得到加密集合E1 = {Enc(PK1-i, Card_j + S)},每个Card_j对应唯一的PK1-i(随机映射,玩家1自行记录映射关系但不公开) - 玩家1对
E1进行随机乱序,得到乱序集合E1_shuffled,发送给玩家2
- 玩家1将52张原始卡牌(A♣~K♠)分别与
第二轮加密与可验证洗牌
- 玩家2收到
E1_shuffled后,对每个加密项用自己的52个公钥PK2-*二次加密,得到E2 = {Enc(PK2-k, E1_shuffled_i)},每个E1_shuffled_i对应唯一的PK2-k(随机映射,玩家2自行记录) - 玩家2生成1-52的随机置换
π,先对π生成承诺Commit(π)(用哈希承诺或对称加密承诺均可),将承诺发送给玩家1 - 玩家1确认收到承诺后,玩家2将
E2按照π排序得到最终洗牌牌堆Deck,同时公开置换π和Deck - 玩家1验证:
- 承诺
Commit(π)与公开的π一致,确认置换未被篡改 Deck中的每个元素确实是E2中对应位置的元素按π排列的,确认洗牌操作合法
- 承诺
- 玩家2收到
密钥映射的加密共享
- 玩家1将自己的密钥映射表(
PK1-i → Card_j + S)用玩家2的公钥加密,生成加密分片发送给玩家2;玩家2同理,将自己的密钥映射表(PK2-k → E1_shuffled_i)用玩家1的公钥加密后发送给玩家1 - 双方各自保存自己的私钥集合,以及对方加密后的映射分片,确保只有抽牌时配合才能解密牌面
- 玩家1将自己的密钥映射表(
抽牌流程(以玩家1抽牌为例)
- 玩家2从
Deck顶部取加密项D_top,通过自己的映射表找到对应的私钥SK2-k,将SK2-k发送给玩家1,同时标记该私钥已使用 - 玩家1用
SK2-k解密D_top,得到E1_shuffled_i,然后遍历自己的私钥SK1-*尝试解密,直到得到Card_j + S - 玩家1用全局盐值
S移除偏移,得到真实卡牌Card_j,同时标记对应的SK1-*已使用 - 玩家1打出该牌时,公开
SK1-*和SK2-k,玩家2验证:- 用
PK1-i加密Card_j + S,得到的结果与E1_shuffled_i一致 - 用
PK2-k加密E1_shuffled_i,得到的结果与D_top一致 - 确认两张密钥均未被重复使用,验证卡牌合法性
- 用
公平性保障
- 盐值防篡改:通过「哈希前置公开+事后验证」,确保双方无法私自修改盐值,避免单方控制卡牌偏移
- 洗牌可验证:玩家1能确认玩家2的洗牌操作是随机且未篡改的,无法故意安排牌序
- 牌面双盲性:双方单独无法获取对方的密钥映射关系,无法提前解密任何牌面
- 密钥去重:双方各自记录已使用的私钥,确保每张牌仅被抽取一次
内容的提问来源于stack exchange,提问作者JP.
相关产品推荐
相关产品推荐

