BBS+——使用WASM实现的短而匿名的群签名

本文介绍了使用WASM实现BBS+签名(一种短而匿名的群签名)的技术方案。BBS+签名基于双线性映射,允许群组成员在不暴露签名者身份的情况下进行签名,同时保证签名有效性、匿名性、可追溯性、不可链接性和抗合谋性。文章还提供了使用Crypt-WASM集成JavaScript的示例代码,展示了如何生成密钥对、签名消息和验证签名。

BBS+ — 使用 WASM 的简短且匿名的群签名

WASM (WebAssembly) 的强大之处让我完全折服,我从未想过我们可以在浏览器中实现基于配对的密码学,并在客户端以超快的速度运行它。Web 3.0 的梦想依然存在!

那么,我们是否可以为一组群成员生成一个数字签名,以便无法知道谁在组内进行了签名?这个问题在 2004 年通过 BBS 签名解决,B oneh, B oyen 和 S hacham 在这篇经典论文中定义了这一点[这里]:

双线性映射

该方法使用带有双线性映射的群签名方法。这产生的签名大小与 RSA 签名大小大致相同(大约 200 字节)。在椭圆曲线方法中,我们有两条曲线:G1 和 G2。如果我们在 G 1 上有 U 1 和 U 2 的点,在 G 2 上有 V 1 和 V 2 的点,我们得到双线性映射:

e( U 1+ U 2, V 1)= e( U 1, V 1)× e( U 2, V 1)

e( U 1, V 1+ V 2)= e( U 1, V 1)× e( U 1, V 2)

如果 UG 1 上的一个点,VG 2 上的一个点,我们得到:

e( aU, bV)= e( U, V) ^{ab}

在 BBS 中,使用椭圆曲线对,我们有 G1 和 G2,它们是 BN256 曲线,它们映射到 GT,GT 也在 BN256 曲线之上。这是配对函数。

群签名

使用群签名,我们创建一个具有已定义私钥的群成员身份。这些被定义为成员,并且从签名的公钥来看,无法从签名中看到任何成员的签名。

使用群签名时,使用群管理器,该管理器负责代表成员签署内容。群签名的主要特点是:

  • 可靠性和完整性 (Soundness and completeness)。这意味着始终可以检查有效签名,而无效签名将始终失败。
  • 不可伪造性 (Unforgeable)。这意味着我们只能在群成员参与的情况下创建签名。
  • 匿名性 (Anonymity)。这意味着不可能泄露消息的任何签名者。这只能通过群管理者的密钥来揭示。
  • 可追溯性 (Traceability)。这意味着群管理者可以使用其密钥来揭示签名者。
  • 不可链接性 (Unlinkability)。这意味着给定两个或多个已签名的消息,不可能追溯到它们是由同一成员签名的。
  • 联盟抵抗性 (Coalition resistance)。这意味着在没有一个成员的同意下,不可能创建签名。

使用群签名,我们创建一个群私钥,该私钥与每个成员的私钥不同。然后,群私钥可以生成私钥,也可以用于揭示消息的签名者。有了这个,我们还必须撤销成员的私钥,这是通过公开声明撤销来完成的。然后,这也可以创建一个新的群私有地址,该地址撤销成员的私钥。

示例代码

在这种情况下,我们将使用 Crypt-WASM 集成[这里]并与 JavaScript 集成[这里]:

<script type="module">
    function buf2hex(buffer) {
        var u = new Uint8Array(buffer),
            a = new Array(u.length),
            i = u.length;
        while (i--) // map to hex
            a[i] = (u[i] < 16 ? '0' : '') + u[i].toString(16);
        u = null; // free memory
        return a.join('');
    };

    (async function () {

        const docknetworkcryptoWasm = await import("https://cdn.jsdelivr.net/npm/@docknetwork/crypto-wasm@0.33.0/+esm");

        async function update() {

            // Load the WASM module
            // 加载 WASM 模块
            await docknetworkcryptoWasm.initializeWasm();

            const message1 = new TextEncoder().encode(document.getElementById("message1").value);

            const message2= new TextEncoder().encode(document.getElementById("message2").value);

            // Generate  random messages
            // 生成随机消息
            const messages = [\
                new TextEncoder().encode(message1),\
                new TextEncoder().encode(message2)\
            ];

            const label = new TextEncoder().encode("Label");
            const messageCount = messages.length;

            // Generate params deterministically using a label
            // 使用标签确定性地生成参数
            const sigParams = docknetworkcryptoWasm.bbsPlusGenerateSignatureParamsG1(messageCount, label);

            console.log('params is', sigParams);

            // Generate a new key pair
            // 生成一个新的密钥对
            const sk = docknetworkcryptoWasm.bbsPlusGenerateSigningKey();
            const pk = docknetworkcryptoWasm.bbsPlusGeneratePublicKeyG2(sk, sigParams);

            document.getElementById('PrivateKey').innerText = buf2hex(sk);
            document.getElementById('PublicKey').innerText = buf2hex(pk);

            const sig = docknetworkcryptoWasm.bbsPlusSignG1(messages, sk, sigParams, true);

            document.getElementById('Signature').innerText = buf2hex(sig);

            const isVerified = docknetworkcryptoWasm.bbsPlusVerifyG1(messages, sig, pk, sigParams, true);

            document.getElementById('Verified').innerText = isVerified;

        }

        document.getElementById("message1").addEventListener("input", update);
        document.getElementById("message2").addEventListener("input", update);
        document.getElementById("message1").innerText = "Hello";
        document.getElementById("message2").innerText = "Hello123";
        document.getElementById("genkey").addEventListener("click", update);

        update();
        message1.focus();

    })();
</script>

代码在这里:

使用 WASM 和 JavaScript 的 BBS+ 签名 \ \ 我们是否可以为一组群成员生成数字签名,然后使其无法知道是谁签名的…\ \ asecuritysite.com

在这种情况下,我们可以签署两条消息,然后验证它们:

结论

BBS — 以及一般的群签名 — 解决了在保护隐私权的同时,在我们交易中建立信任的问题。

参考文献

[1] Boneh, D., Boyen, X., & Shacham, H. (2004, August). Short group signatures. In Annual international cryptology conference (pp. 41–55). Berlin, Heidelberg: Springer Berlin Heidelberg.

  • 原文链接: medium.com/asecuritysite...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
asecuritysite
asecuritysite
江湖只有他的大名,没有他的介绍。