热点、深度、趋势全掌握,尽在BTC区块圈

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

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

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

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

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

累加器允许 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

使用本文
0
共享
上一篇

卡塔尔严格禁止加密货币交易但积极支持资产代币化创新

下一篇

Deadfellaz 将于 6 月 5 日推出 Ghost Machine NFT 系列

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

阅读下一页

作为区块链的 Rollups

本文介绍了以太坊的Rollups技术,Rollups是一种Layer2解决方案,通过将交易处理从主链转移到链下,从而提高交易速度和降低交易成本。