门限签名技术

news2024/11/14 11:25:58

私钥永远不存在

(t, n) 门限签名方案 (TSS) 是一种密码协议,允许一组 n 个参与者共同签署文档或交易,其中 t + 1 个或更多参与者的任何子集都可以产生有效签名,但 t 的子集 或更少的人不能。 该方案旨在通过确保没有任何一方可以单方面生成签名来增强分布式系统的安全性和信任,从而防止未经授权的操作。 TSS 通过将控制权分散给多方(密钥从不存在)来增强加密密钥的安全性。

初步:多项式插值

(t-1) 次多项式由 t 个点唯一确定。 例如,两个点定义一条直线,三个点定义一条抛物线,等等。

如果所有点都按常数因子缩放,则插值多项式也按相同因子缩放。 它在 x = 0 处的 y 截距也是如此。

在上面的示例中,您有一个拟合点 {(1,2), (2,3), (3,5)} 的 2 次多项式 P(x),并且您将 y 值缩放 2,
您实际上 将 P(x)2 缩放以获得 {(1,4), (2,6), (3,10)} 的插值多项式。
它的 y 轴截距也按 2 缩放,从 2 变为 4

我们将在整篇文章中多次使用这一观察结果。

门限签名方案

想象一个场景,其中有一组 n 个参与者,标记为 P₁Pₙ 在此设置中,(t, n) 门限签名方案 (TSS)
授予 t + 1 个成员的任意组合协作生成签名的能力。 然而,任何小于或等于t个成员的群体都缺乏这种能力。

TSS 包括三个阶段:

1. 密钥生成

使用分布式密钥生成 (DKG) 协议,如我们之前的文章分布式密钥生成中所述。 共享的秘密是私钥 sk,任何一方都不知道。

假设 DKG 由参与者运行,表示为 P₁Pₙ,并导致每个用户 Pᵢ 收到单独的秘密共享 skᵢ 以及用于验证目的的共享公钥 pk
skᵢ 代表整个秘密 sk(t, n) Shamir 秘密份额。
请注意,此密钥生成是 TSS 的一次性初始设置阶段,这意味着一旦建立,这些私钥共享可重复用于多个操作。

共享公钥 pk 是所有份额承诺 (skᵢG) 插值的 0 截距,在可验证秘密共享 (VSS) 阶段广播。 要了解原因,请注意:

pk = skG

G 位于生成点且为常数。 sk 是所有 skᵢ0 截距,因此 pk 是所有 skᵢG0 截距。

2. 签名生成

签名生成分两步进行:

部分签名生成:每个参与者使用他在消息 M 上的份额 skᵢ 生成部分签名 σᵢ: σᵢ = S(skᵢ, M),S 是签名函数。

部分签名聚合:聚合这些部分签名将产生最终签名 σ。 最关键的是,这个过程保证了私钥永远不会出现,从而不会发生泄密的情况。

3. 签名验证

门限签名方案的验证与其非门限签名方案的验证相同。 任何有权访问公钥和消息的人都可以验证签名的有效性。

BLS 门限签名

有多种签名方案可以扩展到阈值版本,包括 ECDSA、Schnorr 和 BLS。 为了便于说明,我们选择BLS作为例子。

密钥生成

在阈值密钥生成结束时,每个用户 Pᵢ 获得密钥共享 skᵢ 和用于验证的公共公钥 pk

部分签名生成

此步骤与非阈值BLS相同。见 比特币上的 BLS 签名

Pᵢ 生成签名共享如下。

σᵢ = skᵢH(m)

m 是消息,H 是加密哈希函数。

事实证明 σ 是所有 σᵢ 的拉格朗日插值的 y 截距。

这是因为 σᵢskᵢ 的常数因子,即 H(m),由所有参与者共享。
由于 sk 是 DKG 中所有 skᵢ 的拉格朗日插值的 y 截距,因此 σ 是所有 σᵢ 的插值。

验证

聚合签名 σ 现在是聚合公钥 pkm 的有效签名。 签名验证与无阈值版本相同。 验证者检查以下等式:

e(H(m), pk) ?= e(σ, G)

pk 是聚合公钥,G 是生成点。

比较

门限签名是 DKG 和多重签名 (MultiSig) 技术集成的产物,融合了各自的优越特性。 这种融合产生了强大的加密解决方案,囊括了其前身的优点。

TSS vs. Multisig

与多重签名方法相比,门限签名方案(TSS)被认为可以生成更紧凑的签名,同时增强隐私保护。
此外,TSS 本质上将多重签名功能扩展到区块链技术,否则这些技术不直接支持这些功能,特别是在需要效率和自由裁量权的情况下。
至关重要的是,TSS 架构避免将私钥存储在服务器上,从而加强风险管理并促进参与者之间的责任划分。
这些突出的优势使 TSS 成为开发实时运行且不损害私钥机密性的安全热钱包的最佳解决方案。

多重签名

TSS vs. DKG

在 DKG 中,如果法定人数的参与者与其份额进行协作,则可以构建秘密。 在签名的上下文中,秘密是私钥。 可以先创建并用于签名。 然而,私钥的存在,即使是短暂的,也会造成单点故障,使其容易受到攻击。
在 TSS 中,私钥永远不存在,并且在签名过程中的任何时刻都没有人看到明文形式的私钥,从而使其免受此类攻击。

实现

我们在比特币上实施了 (3, 5) 门限签名方案。 我们选择 TSS 的 ECDSA 版本,因为比特币本身支持 ECDSA。
它基于库 tss-lib。

const (
	testParticipants = 5
	testThreshold    = 3
)

func setUp(level string) {
	if err := log.SetLogLevel("tss-lib", level); err != nil {
		panic(err)
	}
}


func main() {
	setUp("info")
	threshold := testThreshold

	// PHASE: load keygen fixtures
	keys, signPIDs, err := keygen.LoadKeygenTestFixturesRandomSet(testThreshold+1, testParticipants)

    pubKeyHex := publicKeyToHexCompressed(keys[0].ECDSAPub.ToECDSAPubKey())
    addrHex, _ := compressedPubKeyToAddress(pubKeyHex)
    fmt.Printf("Pub Key (x, y): %s %s\n", keys[0].ECDSAPub.X(), keys[0].ECDSAPub.Y())
    fmt.Printf("Pub Key (hex, compressed): %s\n", pubKeyHex)
    fmt.Printf("Address (hex): %s\n", addrHex)

	// PHASE: signing
	// use a shuffled selection of the list of parties for this test
	p2pCtx := tss.NewPeerContext(signPIDs)
	parties := make([]*LocalParty, 0, len(signPIDs))

	errCh := make(chan *tss.Error, len(signPIDs))
	outCh := make(chan tss.Message, len(signPIDs))
	endCh := make(chan *common.SignatureData, len(signPIDs))

	updater := test.SharedPartyUpdater
    msgData, _ := hex.DecodeString("f7ab4253b131f70e698051aa621d1ae09665500ef4580d0d2decbc0d4b863671") // TODO: Put tx sighash here
	// init the parties
	for i := 0; i < len(signPIDs); i++ {
		params := tss.NewParameters(tss.S256(), p2pCtx, signPIDs[i], len(signPIDs), threshold)
		P := NewLocalParty(new(big.Int).SetBytes(msgData), params, keys[i], outCh, endCh, len(msgData)).(*LocalParty)
		parties = append(parties, P)
		go func(P *LocalParty) {
			if err := P.Start(); err != nil {
				errCh <- err
			}
		}(P)
	}

	var ended int32
signing:
	for {
		fmt.Printf("ACTIVE GOROUTINES: %d\n", runtime.NumGoroutine())
		select {
		case err := <-errCh:
			common.Logger.Errorf("Error: %s", err)
			break signing

		case msg := <-outCh:
			dest := msg.GetTo()
			if dest == nil {
				for _, P := range parties {
					if P.PartyID().Index == msg.GetFrom().Index {
						continue
					}
					go updater(P, msg, errCh)
				}
			} else {
				if dest[0].Index == msg.GetFrom().Index {
					fmt.Printf("party %d tried to send a message to itself (%d)", dest[0].Index, msg.GetFrom().Index)
          exit(1)
				}
				go updater(parties[dest[0].Index], msg, errCh)
			}

		case <-endCh:
			atomic.AddInt32(&ended, 1)
			if atomic.LoadInt32(&ended) == int32(len(signPIDs)) {
				fmt.Printf("Done. Received signature data from %d participants", ended)
				R := parties[0].temp.bigR
                //r := parties[0].temp.rx

				modN := common.ModInt(tss.S256().Params().N)

				// BEGIN check s correctness
				sumS := big.NewInt(0)
				for _, p := range parties {
					sumS = modN.Add(sumS, p.temp.si)
				}
				// END check s correctness

        fmt.Printf("Sig (r, s): %s %s\n", R.X(), sumS)

				// BEGIN ECDSA verify
				pkX, pkY := keys[0].ECDSAPub.X(), keys[0].ECDSAPub.Y()
				pk := ecdsa.PublicKey{
					Curve: tss.EC(),
					X:     pkX,
					Y:     pkY,
				}
				ok := ecdsa.Verify(&pk, msgData, R.X(), sumS)
				fmt.Println(ok)
				// END ECDSA verify

				break signing
			}
		}
	}
}

完整代码

单次运行会产生以下交易:

  • 部署交易ID:
    3c0d8b44f8740a0c45162fa6bb6835808b9b04a884853fcb597af1a0812d6345

  • 支出交易ID:
    cfc1704361367d902da142c3307c4d0ef9cfe6c6e5d882af258c3a1964ebe9b5

地址和签名看起来与正常生成的相同,未使用 TSS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Paddle使用问题No module named ‘paddle.fluid’

这是Paddle版本的问题&#xff0c;从飞桨框架 2.5 版本开始&#xff0c;已经废弃了 paddle.fluid 。 ​解决方案&#xff1a;修改paddle版本 pip install paddlepaddle2.4.0

Prompt工程与实践

Prompt工程与实践 一、Prompt与大模型 1.1 大模型的定义 大模型本质上就是一个概率生成模型&#xff0c;该模型的模型参数足够大&#xff0c;并且在训练过程中阅读了非常多的各个领域的语料。这个时候&#xff0c;如果通过一个正确的、有效的指令去引导这个模型&#xff0c;…

算法-从归并排序到归并分治

文章目录 前言介绍1 . 简单的归并排序2 . 数组的最小和问题3 . 逆序数对问题4 . 翻转对数量的计算 前言介绍 归并排序是Merge sort&#xff09;是一种有效、稳定的排序算法&#xff0c;它采用了分治法&#xff08;Divide and Conquer&#xff09;的典型应用,何为分治 ? 即把多…

【Linux】Linux基本指令2

我们接着上一篇&#xff1a;http://t.csdnimg.cn/bSJx8 我们接着完善ls指令 我们可以直接匹配对应格式的文件匹配出来 1.man指令&#xff08;重要&#xff09;&#xff1a; Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助…

【贪心算法】C++解决回文串、增减字符串匹配、分发饼干、跳跃游戏、加油站问题

1. 前言 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法。贪心算法通常用来解决最优化问题&#xff0c;其核心思想是通过局部最优解逐步推导出全局最优解。 在贪心算法中&#xff0c;我们并不总是考虑到未来可能发生的…

【PingPong_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

如何下载b站(哔哩哔哩bilibili)的学习视频教程

方法1&#xff1a; 打开粘贴视频链接下载即可哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑哔哩哔哩高清视频解析下载工具是一个免费的B站视频在线解析提取工具,支持提取B站APP和bilibili网站上的任何视频,提取出来的视频无水印.我们可以借助此下载器方便地将视频…

使用jdk自带jhat工具排查OOM问题

使用jdk自带jhat工具排查OOM问题 OOM java.lang.OutOfMemoryError: Java heap space排查步骤 编写一个测试类 public class TestJVM {Testpublic void test1() throws InstantiationException, IllegalAccessException {List<A> list new ArrayList<>();for (i…

ArcGIS不同图斑设置不同的透明度

对于设置一个图层的整体的透明度&#xff0c;我们在 ArcGIS制作带蒙版的遥感影像地图http://mp.weixin.qq.com/s?__bizMzIzNjM2NTYxMg&mid2247509080&idx1&sn38dccf0a52bb3bb3758f57114ee38b72&chksme8da161bdfad9f0d363da90959a8524dcf2b60d0e8d999f8ebeef0…

OrangePi Alpro开箱体验 ubuntu 与 openEuler 实时性对比

OrangePi Alpro开箱体验 & ubuntu 与 openEuler 实时性对比 1 介绍1.1 概述1.2 OrangePi Kunpeng Pro vs OrangePi AIpro 2 开箱3 芯片介绍OrangePi AIpro(8T)Atlas 200I DK A2 4 开机连接鼠标、键盘、显示器桌面查看系统信息配置网络查看IP远程SSHWinSCP 5 GPIO Toolgpio_…

MATLAB分类与判别模型算法:基于LVQ神经网络的乳腺肿瘤诊断分类程序【含Matlab源码 MX_003期】

说明 实现基于LVQ&#xff08;Learning Vector Quantization&#xff0c;学习向量量化&#xff09;神经网络的乳腺肿瘤诊断分类任务。LVQ是一种监督学习算法&#xff0c;通常用于模式识别和分类任务。 算法思路介绍&#xff1a; 导入数据&#xff1a; 加载名为"data.mat&…

C++学习~~对于二进制文件的读写命名空间再认识异常处理

目录 1.将数据以二进制形式放到磁盘 2.将上述的数据读入内存并且显示在显示器上面 3.异常处理机制 4.抛出异常的应用实例 1.将数据以二进制形式放到磁盘 &#xff08;1&#xff09;使用student定义结构体数组stud,并对其进行初始化&#xff0c;创建输出文件流对象outfile,这…

朋友圈定时发送设置

人日常中不可缺少的一件事&#xff0c;同时也是企业用来触达客户的重要渠道&#xff0c;下面一起来了解下微信朋友圈怎么定时发送呢&#xff1f;

音乐传奇告别之作:《杰作》未解之谜❗❗

坂本龙一的《杰作》不仅是一部音乐会纪录电影&#xff0c;更是他赠予世界的一封深情告别信。 这部影片精心收录了这位音乐巨匠生前最后一场钢琴独奏音乐会的珍贵瞬间&#xff0c; 其中涵盖了《圣诞快乐&#xff0c;劳伦斯先生》、《末代皇帝》、《水》等二十首令人陶醉的经典…

设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 职责链模式&#xff08;Chain …

手推车式电缆故障定位系统

武汉凯迪正大一体化电缆故障高压发生器用于测试各种型号的380V,600V,10kV,35kV,110kV,220kV,380kV电压等级的铜铝芯电力电缆、同轴通信电缆和市话电缆的各类故障&#xff0c;如电缆全长、开路、短路、断线、低阻故障、高阻故障、高阻泄露、高低阻抗接地、接地故障、铠装接地故障…

数据集——高分辨率图像分割成大小均匀图像(附Python代码)

将高分辨率图像分割成大小均匀的图像用于训练&#xff0c;可以提高训练效率&#xff0c;提高模型性能&#xff0c;并提供更大的灵活性。 目录 一、大小均匀图像用于训练优势二、代码2.1 代码参数修改2.2 代码2.3 输出2.4 分割结果 三、总结 一、大小均匀图像用于训练优势 内存…

3步操作助您轻松实现苹果手机照片一键传输至电脑

对于很多使用苹果手机的用户来说&#xff0c;随着手机中照片和视频数量的不断积累&#xff0c;如何将这些珍贵的回忆从手机转移到电脑&#xff0c;以便更好地保存、整理和分享&#xff0c;成为了一个值得关注的问题。那么&#xff0c;苹果手机怎么把照片导入电脑呢&#xff1f;…

职校老师的工资待遇怎么样

工资水平一直是教师们关注的焦点&#xff0c;毕竟&#xff0c;工资不仅关系到个人的生活品质&#xff0c;还影响着教师的职业满意度和工作动力。职校教师的工资待遇究竟是怎样的呢&#xff1f; 职校教师的工资水平受多种因素影响&#xff0c;包括地区、学校类型、个人资历和教学…

Qt 配置Eigen矩阵库 - 并简单测试

Qt 配置Eigen矩阵库 - 并简单测试 引言一、在Qt中配置Eigen二、低通Demo源码三、参考链接以及其他 引言 Eigen是一个开源的C模板库&#xff0c;提供了线性代数和矩阵运算的功能。它被设计为一个高性能、可扩展和易用的库&#xff0c;可以用于科学计算、机器学习和计算机图形学等…