本文介绍了BLS门限签名,它允许将私钥拆分为多个共享,并设置一个阈值,只有达到该阈值数量的共享才能用于签名。文章通过一个示例展示了如何使用Zig语言实现BLS门限签名,其中将私钥拆分为五个共享,并允许任意三个共享组合生成有效签名。

我想说,在网络安全方面,影响最大的三篇论文是:
对于“新方向”这篇论文,我们仍然使用 Diffie-Hellman 方法进行密钥交换,而 RSA 论文则带来了近 50 年的 RSA 公钥签名和加密。 但对我来说,第三篇论文和另外两篇一样好,Adi Shamir 在论文中概述了如何将私钥分成多个份额 (n),然后定义一个阈值 (t) 以恢复原始密钥。 这定义了一个 (t,n) 阈值系统。 最棒的是,它是完全安全的,并且在少于 t 个份额的情况下无法重建密钥。
所以,让我们看一个 Shamir 阈值方法的实际例子,其中我们有一个公共消息,并且我们定义了可以一起签名消息的份额数量。
使用 BLS 签名最强大的要素之一是,我们可以将私钥分成多个份额,然后使用这些份额来创建签名阈值。 在下文中,我们将密钥分成三份,分别给 Bob、Alice 和 Carol,并定义任意两个份额可以组合在一起对消息进行签名。 为此,Bob 和 Alice 使用密钥的拆分创建签名,然后创建他们自己的签名(Sig1 和 Sig2)。 然后将这些签名聚合在一起以生成最终签名 (Sig)。 然后,Victor 可以对照相关的公钥验证此签名:

以下代码使用 Zig Version 0.15.1 编译 [ here]。 在此代码中,我们可以让五个签名中的任意三个组合在一起以创建有效签名 [ here]:
const std = @import("std");
const bls = @import("bls.zig");
pub fn main() !void {
var message: []u8 = undefined;
var stdout_buffer: [4096]u8 = undefined;
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
const stdout = &stdout_writer.interface;
const args = try std.process.argsAlloc(std.heap.page_allocator);
defer std.process.argsFree(std.heap.page_allocator, args);
// Check if there are any arguments
// 检查是否有参数
if (args.len > 1) {
message = args[1];
}
const main_key = bls.generateBLS();
const private_key = main_key.private_key;
const threshold: u32 = 3;
const m_shares: u32 = 5;
// Generate shares
// 生成份额
const shares = try bls.ThresholdBLS.generateShares(std.heap.page_allocator, threshold, m_shares, private_key);
// Generate signatures (3 from 5)
// 生成签名 (5 选 3)
const signature1 = try bls.signBLS(message, shares[0].private_share);
const signature2 = try bls.signBLS(message, shares[1].private_share);
const signature3 = try bls.signBLS(message, shares[2].private_share);
// Aggregate three signatures
// 聚合三个签名
const signatures = [_][bls.BLS_SIGNATURE_SIZE]u8{ signature1, signature2, signature3 };
const aggregate_sig = try bls.aggregateSignatures(std.heap.page_allocator, &signatures);
// Check signature against the public key
// 检查签名与公钥是否匹配
const rtn = main_key.verify(message, aggregate_sig);
try stdout.print("BLS12-381 Threshold Signatures (3 from 5). Message: {s}\n", .{message});
try stdout.print("\nMaster Key private: {x} \n", .{private_key});
try stdout.print("Master Key public {x}\n", .{main_key.public_key});
for (shares, 0..) |share, i| {
try stdout.print("\n{d} Index: {d} Public share: {x}, Private share: {x}\n", .{ i, share.index, share.public_share, share.private_share });
}
try stdout.print("\nRecovered signature: {x} \n", .{aggregate_sig});
if (rtn == true) try stdout.print("\nSignature verified\n", .{});
try stdout.flush();
}
一个示例运行 [ here]:
BLS12-381 Threshold Signatures (3 from 5). Message: hello
Master Key private: a5fb156db72749b884ad40eb76367f4bef87ae907511157c11feffd9ba2ebc0c
Master Key public d2a9826400858e4a0170a166902a3e738fc370f918fad05ceee83c1fcc678703c5e3b2a9dffd972227cd0f229482f65d
0 Index: 1 Public share: dc69880288dd03f407e0819ccfeec0dd439e00f689ac020f53f0c455476ac0470451e35ff6f744cf53a65bdfe0fe7a4b, Private share: 481e69302b47133646c43a541f908edbd602e5850fe56ff62c2e4618060e0422
1 Index: 2 Public share: c657a1a243749af5dbf0471d302ce2c960e1ea507a3e4462d71f431d2e0c0a8d96d004a85aa2a7e5384733c3a89d657d, Private share: eb31036d4b6006fb2faabcb45838c64bbb7e669d9c2a98983cac8bee724be302
2 Index: 3 Public share: ea0b54790ee1434712fdfb1c649563ced49e6396f63b3b17ef8016a600b3b73f6abbe21115c9503fc2458391aa9e9304, Private share: 7fce03276453f23d05209b2b9e42b740c8a540ef77c8af7072f79676cca9b238
3 Index: 4 Public share: dcc2ccbd223933526a6835c4d36bf772b451c81612e7050c29a0ae3b7bff3c72f041cd7bfdde1a09814603940977fd88, Private share: 9ed5c9bff34a0762ae5c61902cbb031bbee9a847413ed42a693b9a9cd7e60816
4 Index: 5 Public share: 876cc7ca3301d2a9fdb8023d8d640f20b2f38da2ba796b0bc3a6fd4d868e2a4eba94976b53f8d4488479e25b5c3552c6, Private share: 2d3ea0b923c89dfbcbf87c243b1e02760638ba4b9d34fb9e357fa780cc786f15
Recovered signature: a82189effc6680d2e66c3d2b9b4b79e836e8321e6e994389e7a8173fe83d3c47e758d300d52e73476bd0acccec0151b8d9893ebd90875634fc1f884765bfee2d5e3598a3107e5dc777a0bdbba47745502602b44811847d5e5d141ba65e176570
Signature verified
好了,你不觉得这很美妙吗?
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!