使用 WASM 的累加器:浏览器中的密码学配对

本文介绍了使用 WebAssembly (WASM) 在浏览器中实现基于双线性映射的累加器(Accumulator)的方法,累加器允许将值添加到固定长度的摘要中,并提供已添加值的证明,而无需泄露累加值中的实际内容。文章展示了如何使用docknetworkcryptoWasm库来创建累加器、添加和移除元素,并生成和验证成员资格证明,附有代码示例和在线演示链接。

基于 WASM 的累加器:浏览器中的密码学配对

我们泄露了太多的个人隐私信息。在大多数情况下,当我们登录系统时,我们必须向系统透露我们的密码。如果有人监听通信,他们可能会泄露我们的密码。那么,我们为什么不能在不泄露信息的情况下,直接证明我们知道某些东西呢?好吧,零知识证明(ZKPs)旨在做到这一点。在这种情况下,我们将研究一种使用双线性映射的累加器方法,该方法最初由 Lan Nyugen 在 [1] [ here] 中提出:

累加器允许 Bob 将值添加到固定长度的摘要中,并提供已添加值的证明,而无需在累加值中泄露它们。在这种情况下,我们将把一条消息添加到一个给定消息的累加器中,然后我们将删除它,以表明累加器恢复到其原始状态。 在此,Bob 可以在不实际向 Alice 透露某些信息的情况下证明他知道这些信息,并且 Bob 可以提供证明。 在这种情况下,我们将使用 crypto-wasm 库,并将消息添加到累加器中,以证明我们知道该消息,而无需实际泄露它。 在生成证明后,我们将从累加器中删除该消息,并证明它已恢复为其原始值。 总的来说,我们可以添加和删除任意数量的元素,并在单轮中提供多个证明。

创建累加器

我们可以先集成 WASM 库:

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

接下来,我们使用 BLS 曲线(BLS 12381)创建一个累加器。 为此,我们生成一个公钥和一个私钥,如下所示:

await docknetworkcryptoWasm.initializeWasm();

const params = docknetworkcryptoWasm.generateAccumulatorParams();

const sk = docknetworkcryptoWasm.generateAccumulatorSecretKey(params);
const pk = docknetworkcryptoWasm.generateAccumulatorPublicKey(sk, params);

然后,我们可以创建我们的累加器,然后使用以下代码将我们的元素添加到累加器中:

var accumulator = docknetworkcryptoWasm.positiveAccumulatorInitialize(params);

const e1 =docknetworkcryptoWasm.accumulatorGetElementFromBytes(message1);
accumulator = docknetworkcryptoWasm.positiveAccumulatorAdd(accumulator, e1, sk)

const e2 = docknetworkcryptoWasm.accumulatorGetElementFromBytes(message2);
accumulator = docknetworkcryptoWasm.positiveAccumulatorAdd(accumulator, e2, sk)

这些元素使用私钥(sk)添加到累加器中。 接下来,我们可以创建数据包含在累加器中的见证,使用私钥:

const witness1 = docknetworkcryptoWasm.positiveAccumulatorMembershipWitness(accumulator, e1, sk);
const witness2 = docknetworkcryptoWasm.positiveAccumulatorMembershipWitness(accumulator, e2, sk);

最后,任何人都可以使用公钥证明该实体在累加器中:

var rtn1 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e1, witness1, pk, params);
var rtn2 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e2, witness2, pk, params);

如果该实体在累加器中,这将返回一个 true 值。 我们可以使用以下代码删除实体:

accumulator = docknetworkcryptoWasm.positiveAccumulatorRemove(accumulator, e1, sk);
accumulator = docknetworkcryptoWasm.positiveAccumulatorRemove(accumulator, e2, sk);

完整的代码在这里:

    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() {

            await docknetworkcryptoWasm.initializeWasm();

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

           //  const label = new TextEncoder().encode("Label");
            //      const params = docknetworkcryptoWasm.generateAccumulatorParams(label); // Deterministic
            const params = docknetworkcryptoWasm.generateAccumulatorParams();

            const sk = docknetworkcryptoWasm.generateAccumulatorSecretKey(params);
            const pk = docknetworkcryptoWasm.generateAccumulatorPublicKey(sk, params);

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

            var accumulator = docknetworkcryptoWasm.positiveAccumulatorInitialize(params);

            const e1 =docknetworkcryptoWasm.accumulatorGetElementFromBytes(message1);
            accumulator = docknetworkcryptoWasm.positiveAccumulatorAdd(accumulator, e1, sk)

            const e2 = docknetworkcryptoWasm.accumulatorGetElementFromBytes(message2);
            accumulator = docknetworkcryptoWasm.positiveAccumulatorAdd(accumulator, e2, sk)

            const witness1 = docknetworkcryptoWasm.positiveAccumulatorMembershipWitness(accumulator, e1, sk);
            const witness2 = docknetworkcryptoWasm.positiveAccumulatorMembershipWitness(accumulator, e2, sk);

            document.getElementById('Witness').innerText = "Witness 1: "+buf2hex(witness1)+"\n";
            document.getElementById('Witness').innerText +="Witness 2: "+ buf2hex(witness2);

            var rtn1 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e1, witness1, pk, params);
            var rtn2 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e2, witness2, pk, params);
            document.getElementById('Verified').innerText = "Verified 1: " + rtn1+"\n";
            document.getElementById('Verified').innerText += "Verified 2: " + rtn2;

            // Now we will move the elements
            accumulator = docknetworkcryptoWasm.positiveAccumulatorRemove(accumulator, e1, sk);
            accumulator = docknetworkcryptoWasm.positiveAccumulatorRemove(accumulator, e2, sk);

             rtn1 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e1, witness1, pk, params);
             rtn2 = docknetworkcryptoWasm.positiveAccumulatorVerifyMembership(accumulator, e2, witness2, pk, params);

            document.getElementById('Verified').innerText += "\nVerified 1 (after removal): " + rtn1 + "\n";
            document.getElementById('Verified').innerText += "Verified 2 (after removal): " + rtn2;

        }

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

        update();
        message1.focus();

    })();

如果我们不想要随机密钥,我们可以使用以下代码生成确定性密钥对:

const label = new TextEncoder().encode("Label");
const params = docknetworkcryptoWasm.generateAccumulatorParams(label); // Deterministic

演示如下:

使用带有 JavaScript 的 WASM 的累加器 \ \ 累加器允许 Bob 将值添加到固定长度的摘要中,并提供已添加值的证明,而无需…\ \ asecuritysite.com

参考文献

[1] Nguyen, L. (2005). Accumulators from bilinear pairings and applications. In Topics in Cryptology–CT-RSA 2005: The Cryptographers’ Track at the RSA Conference 2005, San Francisco, CA, USA, February 14–18, 2005. Proceedings_ (pp. 275–292). Springer Berlin Heidelberg.

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

0 条评论

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