在介绍SM2协同签名之前,先介绍下门限签名机制,提到门限签名就不得不提区块链,在与区块链的结合应用中,门限签名的优势在于签名的生成是通过链下的 MPC 协议产生的,其结果是更加安全,避免了合约被黑客攻击的风险。因为门限签名与合约模块是完全解耦的,合约不需要理解签名的协议,它只要确认签名的有效性,这与传统的合约验签模式完全一致的。此外,合约的设计策略可以更加灵活,因为除了验签外的大部分流程都搬到了链下,使用方可以根据场景制定自己的碎片管理策略。
0x01 什么是门限签名
门限签名(Threshold Signature Scheme,TSS)是数字签名的一个重要分支,它是一种基于安全多方计算(Secure Multi-Party Computation,MPC)的密码学技术,也是 MPC 密钥管理的重要研究方向。
门限签名的一个主要优势是增强了安全性和灵活性。它可以用于多方协作的环境,其中签名的生成需要多个独立的实体同意。与传统的单一签名密钥不同,门限签名不依赖于单个实体的安全性。即使其中一些参与者的密钥被泄漏或被攻击,只要达到门限要求的参与者仍然安全,签名仍然有效。
门限签名的应用领域包括安全多方计算、分布式密钥生成、多方认证等。这种签名方案在构建安全和弹性的分布式系统中具有重要的实际应用。
门限签名特点是一个签名一定是由一个私钥产生,然而这个私钥不会被任何人完整掌握,而是会以某种方式分成很多碎片,这些碎片可以被多人同时持有,然后通过 MPC 协议,保证这些碎片不需要全部被拼起来就可以直接产生一个合法的签名。
0x02 什么是SM2协同签名
我对于SM2协同签名的理解是基于国产密码算法中门限签名的一种特殊形式,签名过程中只有两方(发起方与协作方)参与,由两方协商生成一个用于验证签名的公钥,双方各持部分签名私钥,任何一方无法生成完整的签名,从而保障了在移动终端、云服务、个人计算机、智能手表、智能卡等设备上无法保障私钥安全性从而导致关键动作签名被伪造。
在协同签名过程中有如下术语:
协同数字签名
由两个参与方通过协议交互和使用各自掌握的用户部分私钥完成某输入消息的数字签名计算的过程。
部分私钥
协同数字签名过程中由发起方和协作方分别专用的秘密数据项。
用户公钥
用户私钥对应的公钥,在本文件中是由两个参与方共同掌握的用户私钥对应的公钥。
密钥对协同生成
用户私钥对应的公钥,在本文件中是由两个参与方共同掌握的用户私钥对应的公钥。
发起方
在协议的操作过程中发送首轮信息的参与方,一般为签名方(用户)的代理。
协作方
在协议的操作过程中协助发起方完成密钥对生成或签名的参与方。
0x03 协同签名的几种方式
3.1 一般协同机制签名
一般协同签名机制适用于协作方不需要知道消息内容,但是又可以对签名信息摘要做审计的场景。在一般协同签名机制中,发起方向协作方发送消息的摘要,协作方计算部分签名后返回给发起方,发起方再计算并输出最终的签名。
3.2 需要消息确认的协同签名机制
需要消息确认的协同签名机制适用于在协作方确认消息内容的场景。在需要消息确认的协同签名机制中,发起方向协作方发送消息本身,协作方检查消息内容并进行确认,然后才计算部分签名并返回给发起方,发起方再计算并生成最终的签名。
3.3 盲协同签名机制
盲协同签名机制适用于不希望协作方知道消息内容或追踪签名的场景。盲协同签名机制中,消息内容对协作方不可见。在签名被发起方公开后,协作方不能追踪签名。
0x04 协同密钥对生成算法
发起方和协作方协同密钥对生成的具体运算步骤如下:
发起方:
A1:发起方向协作方发送协同密钥对生成请求。
协作方:
B1:产生随机数d2∈[1,n-1];B2:计算椭圆曲线点P2=[d2]G,协作方的密钥对为(d2,P2);B3:将P2发送给发起方。
发起方:
A2:验证P2是否满足椭圆曲线方程,若不满足则协同生成密钥对失败;A3:产生随机数d1ϵ[1,n-1];A4:计算椭圆曲线点P1=[d1]G ,发起方的密钥对为(d1, P1);A5:计算椭圆曲线点PA=[d1]P2-G,用户A的公钥为PA。
0x05 一般协同签名协议
具体运算步骤如下:
发起方:
A1:计算消息摘要e=Hv(ZA||M),按GM/T 0003.1—2012第1部分4.2节中定义的方法将e的数据类型转换为整数,其中ZA需按照GM/T 0003.2—2012第2部分5.5节中定义的方法计算得到;A2:产生随机数k1∈[1,n-1];A3:计算椭圆曲线点Q1=[k1]P2;A4:将e, Q1发送给协作方。
协作方:
B1:验证Q1是否满足椭圆曲线方程,若不满足则终止协同签名流程;B2:产生随机数k2∈[1,n-1];B3:计算椭圆曲线点(x1,y1)=[k2]G+Q1,按GM/T 0003.1-2012第1部分4.2节中定义的方法将x1数据类型转换为整数;B4:计算r=(e+x1) mod n,若r=0或r+k2=n,则返回B2;B5:计算s2=(d2-1⋅(r+k2)) mod n;B6:将r, s2发送给发起方。
发起方:
A5:如果k1+s2=n则返回A2;A6:计算s=(d1-1⋅(k1+s2)-r) mod n,若s=0则返回A2;A7:使用公钥PA验证(r, s)是否为消息M的签名,如果不是则本次签名失败;否则输出(r, s)作为消息M的签名。
0x05 需要消息确认的协同签名协议
具体运算步骤如下:
发起方:
A1:产生随机数k1ϵ[1,n-1];A2:计算椭圆曲线点Q1=[k1 ]P2;A3:将M, ZA, Q1发送给协作方,其中ZA需按照GM/T 0003.2—2012第2部分5.5节中定义的方法计算得到。
协作方:
B1:验证Q1是否满足椭圆曲线方程,若不满足则终止协同签名流程;B2:检查消息M的内容并进行确认,若消息内容不正确则终止协同签名流程;B3:计算消息摘要e=Hv(ZA||M),按GM/T 0003.1-2012 第1部分4.2节中定义的方法将e的数据类型转换为整数;B4:产生随机数k2ϵ[1,n-1];B5:计算椭圆曲线点(x1, y1)=[k2]G+Q1,按GM/T 0003.1-2012第1部分4.2节中定义的方法将x1数据类型转换为整数;B6:计算r=(e+x1) mod n,如果r=0或者r+k2=n,则返回B4;B7:计算s2=(d2-1⋅(r+k2 )) mod n;B8:将r, s2发送给发起方。
发起方:
A4:如果k1+s2=n则返回A1;A5:计算s=(d1-1⋅(k1+s2)-r) mod n,若s=0则返回A1;A6:使用公钥PA验证 (r, s)是否为消息M的签名,如果不是则签名失败;否则输出(r, s)作为消息M的签名。
0x06 盲协同签名协议
具体计算流程如下:
发起方:
A1:发起方向协作方发起协同签名请求。
协作方:
B1:产生随机数k2ϵ[1,n-1];B2:计算椭圆曲线点Q2=[k2 ]G;B3:将Q2发送给发起方。
发起方:
A2:验证Q2是否满足椭圆曲线方程,若不满足则协同签名失败;A3:计算消息摘要e=Hv(ZA||M),按GM/T 0003.1-2012第1部分4.2节中定义的方法将e的数据类型转换为整数,其中ZA需按照GM/T 0003.2—2012第2部分5.5节中定义的方法计算得到;A4:产生随机数k1,k3ϵ[1,n-1];A5:计算椭圆曲线点(x1, y1 )=[k1]P2+Q2+[k3]G,按GM/T 0003.1-2012第1部分4.2节中定义的方法将x1数据类型转换为整数;A6:计算r=(e+x1) mod n,如果r=0或者r+k3=n,则返回A4;A7:计算r1=(r+k3) mod n;A8:将r1发送给协作方。
协作方:
B4:计算s2=(d2-1⋅(k2+r1)) mod n;B5:将s2发送给发起方。
发起方:
A9:计算s=(d1-1⋅(k1+s2)-r) mod n,如果s=0或s+r=n则返回A1;A10:使用公钥PA验证签(r, s)是否为消息M的签名,如果不是则签名失败;否则输出(r, s)作为消息签名M的签名。