本文介绍了使用WASM实现BBS+签名(一种短而匿名的群签名)的技术方案。BBS+签名基于双线性映射,允许群组成员在不暴露签名者身份的情况下进行签名,同时保证签名有效性、匿名性、可追溯性、不可链接性和抗合谋性。文章还提供了使用Crypt-WASM集成JavaScript的示例代码,展示了如何生成密钥对、签名消息和验证签名。
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)
如果 U 是 G 1 上的一个点,V 是 G 2 上的一个点,我们得到:
e( aU, bV)= e( U, V) ^{ab}
在 BBS 中,使用椭圆曲线对,我们有 G1 和 G2,它们是 BN256 曲线,它们映射到 GT,GT 也在 BN256 曲线之上。这是配对函数。
使用群签名,我们创建一个具有已定义私钥的群成员身份。这些被定义为成员,并且从签名的公钥来看,无法从签名中看到任何成员的签名。
使用群签名时,使用群管理器,该管理器负责代表成员签署内容。群签名的主要特点是:
使用群签名,我们创建一个群私钥,该私钥与每个成员的私钥不同。然后,群私钥可以生成私钥,也可以用于揭示消息的签名者。有了这个,我们还必须撤销成员的私钥,这是通过公开声明撤销来完成的。然后,这也可以创建一个新的群私有地址,该地址撤销成员的私钥。
在这种情况下,我们将使用 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!