AS(5):RSA-PSS算法介绍在2018年发布的TLSv1.3(TLS:TransportLayerSecurity,传输层安全,TLSv1.3对应RFC8446)中,它支持的数字签名算法有:RSASSA-PKCS1-v1_5、RSASSA-PSS、ECDSA(EllipticCurveDigitalSignatureAlgorithm,椭圆曲线签名算法)、EdDSA(Edwards-CurveDigitalSignatureAlgorithm,爱德华兹曲线签名算法)。这些算法已经是标准(或事实上的标准),但从某种意义上说,这些算法也代表了美国的签名算法流派。除美国外,俄罗斯于1994年发布了数字签名算法标准GOSTR34.10-94,2001年发布了椭圆曲线数字签名算法标准GOSTR34.10-2001,GOSTR34.10-2001更新为GOST2012年R34.10-2012。韩国于1998年发布了韩国基于证书的数字签名算法KCDSA和EC-KCDA,相应的标准在[88,89]中发布。德国于2005年发布了德国椭圆曲线数字签名算法标准EC-GDSA。中国于2012年发布了SM2椭圆曲线数字签名算法标准,2016年发布了SM9身份密码数字签名算法标准。作为重要的国际标准化组织,ISO/IEC还发布了一系列数字签名算法标准:ISO/IEC9796、ISO/IEC14888、ISO/IEC20008、ISO/IEC18370、ISO/IEC23264等。弱水三千,一勺就够了。由于文章的主题和篇幅,本文只介绍RSASA-PSS算法。PSS(ProbabilisticSignatureScheme,概率签名方案)是一种用于私钥签名的填充方法。RSASA(RSASignatureAlgorithm,RSA数字签名算法)目前支持两种算法:RSASSA-PKCS1-v1_5、RSASSA-PSS。出于安全考虑,目前RSASSA-PKCS1-v1_5的使用场景只是为了兼容(参考《童话里都是骗人的》、《梦被批得离离散散》、《蜀道难,难于上青天》),目前主流推荐使用RSASSA-PSS算法。PSS方案最早由Bellare和Rogaway提出。PSS与OAEP(最佳非对称加密填充)非常相似。当然,OAEP也是这两位大师提出来的(OAEP见《蜀道难,难于上青天》)。MihirBellare是加州大学圣地亚哥分校(UCSD,UniversityofCalifornia,SanDiego)计算机科学与工程系教授。Bellare于1986年获得了加州理工学院的学士学位,并获得了博士学位。1991年获得麻省理工学院博士学位。1991年至1995年,Bellare是IBM的研究员Bellare是HMAC、RSA-OAEP、RSA-PSS和OCB的共同开发者。Bellare是ACM和IACR的会员。他获得了ACMParisKanellakis理论与实践奖、RSA数学会议奖、David和LucillePackard基金会科学与工程奖学金和NSF职业奖(他获得了ACMParisKanellakis理论与实践奖、RSA数学会议奖,大卫和露西尔帕卡德基金会科学与工程奖学金,以及美国国家科学基金会职业奖)。PhillipRogaway是加州大学戴维斯分校(UCD,UniversityofCalifornia,Davis)计算机科学系教授。Rogaway毕业于加州大学伯克利分校(UCB,UniversityofCalifornia,Berkeley),1991年赴麻省理工学院计算理论组(MIT'sTheoryofComputationgroup)攻读博士学位。获得博士学位后,Rogaway在IBM担任安全架构师,然后于1994年在UCD工作。Rogaway曾获得Levchin奖(2016年)、PET奖(2015年)、IACR研究员(2012年)、ACMParisKanellakis奖(2009年)),RSA数学奖(2003)(Levchin奖(2016),PET奖(2015),IACRFellow(2012),ACMParisKanellakis奖(2009),RSA数学奖(2003)).图1Bellare(左)和Rogaway(右)RSA数字签名算法(RSASA)的本质仍然是RSA加密/解密算法,如图2所示。图2RSA数字签名算法示意图从图可以看出2、RSSSA分为两步。1)对待签名的M进行哈希处理得到H2)用RSA私钥加密H由于是RSA加密,无法避免RSA的致命问题——选择密文攻击很容易破解(请参考《童话里都是骗人的》),这导致了RSA填充算法。RSASSA-PKCS1-v1_5使用RSA_PKCS1_PADDING_v1_5填充算法,而RSASSA-PSS的填充算法类似于RSA_PKCS1_OAEP_PADDING填充算法。下面我们介绍一下RSASSA-PSS算法。1.RSASSA-PSS填充算法RSASSA-PSS算法的本质是在RSA算法的基础上叠加了一种填充算法(为了表述方便,这种填充算法也可以称为RSA-PSS填充算法,或RSA-PSS编码),如图3所示。图3RSA-PSS数字签名算法示意图3、在Hash之后,RSA之前,RSASA-PSS算法插入一个RSA-PSSpadding算法。RSA-PSS的具体算法如图4所示。图4RSA-PSS填充算法示意图4、RSA-PSS填充算法分为四步。下面我们分别介绍这四个步骤。1.1将M转换为M1从图4可以看出,M1=p1||哈希||saltp1是8个字节的0。mHash=Hash(M),M为待签名的消息,当前选择的Hash算法为SHA-1。SHA-1的输出是20字节,所以mHash的长度hLen=20salt(salt值)是一个伪随机数,它的长度(记为sLen)一般等于hLen,目前选择sLen=hLen1。2构造DBDB(DataBlock)的构造方法是DB=p2||saltp2的值等于几个字节的0x00后跟1个字节的0x01。这几个字节记录为xLen,则xLen等于xLen=emLen-sLen-hLen-2其中emLen是图4中EM的长度。salt的值等于1.1节中描述的salt的值。特别强调,两者必须相等,否则无法验证数字签名(详见下文第三节:RSASSA-PSS数字签名验证)1.3对于MGFMGF(MaskGenerationFunction,掩码生成)的介绍function),请参考《蜀道难,难于上青天》,此处不再赘述。另外,RSA-PSS使用的MGF函数的输出也是MGF1。对于图4,MGF对应的输入输出为mask=MGF1(mgfSeed,maskLen,hash)其中mgfSeed=Hash(M1),Hash函数选择SHA-1maskLen=emLen-hLen-1hash函数选择SHA-11.4的值构造EMEM(EncodedMessage)等于,EM=maskedDB||H||bc其中,maskedDB=DBxormaskH=Hash(M1)bc=0xBC其中,bc的长度为1字节,H的长度为hLen,maskedDB(记为mdbLen)的长度为mdbLen=emLen-hLen-1其中emLen的长度是EM的长度。由于接下来要对EM进行RSA加密计算,所以EM的长度只要满足RSA的要求即可。2.RSASA-PSS的签名算法填充RSA-PSS后,接下来的签名算法比较简单,EM=RSA-PSS(M)S=RSAEP(EM)RSA算法,请参考《RSA 基本算法》、《RSA 的计算方法》,这里就不赘述了。3.RSASA-PSS签名验证RSASA-PSS签名验证分为以下几个步骤。3.1解密RSASA-PSS签名验证,首先解密,EM=RSADP(S),即得到签名S后,运行RSA解密算法得到解密信息EM。3.2拆分EM得到EM之后,接下来就是拆分验证,maskedDB,H,bc=Split(EM)最右边的字节是bc,然后从bc往左数hLen个字节就是H,剩下的就是maskedDB.如果最右边的字节不是0xBC,则签名验证停止(数字签名无效)。3.3计算salt得到H后,可以计算mask,mask=MGF1(H,maskLen,hash)因为maskedDB=DBxormask,所以,DB=maskedDBxormask得到DB后,可以除p2,salt=拆分(DB)其中salt是DB最右边的sLen字节,其余是p2。如果p2的值不等于几个字节的0x00后面跟着1个字节的0x01,则验证停止(数字签名无效)。3.4验证Hash通过接收到的M,计算HashmHash=Hash(M),然后构造M1M1=p1||M1)比较H1和H,如果相等,则签名验证通过。如果不相等,则签名是非法的。其中,H为步骤3.2得到的哈希值。经过以上四步,就完成了RSASA-PSS的数字签名验证。
