书籍信息
书名:《深入浅出密码学》
作者:[ 美 ] 戴维 • 王(David Wong)
译者:韩露露 ,谢文丽 ,杨雅希
(1)密码学中的签名也称为数字签名或签名方案。
(2)数字签名的定义:
(2.1)只有签名者本人可以对任意消息生成签名;
(2.2)任何人都可以验证签名者对消息的签名;
(3)签名方案通常由3中不同的算法组成:
(3.1)密钥对生成算法:签名者使用该算法生成新的私钥和公钥(公钥可以共享出去);
(3.2)签名算法:该算法以私钥和消息为输入,输出消息的签名。
(3.3)验证算法:该算法以公钥、消息以及消息的签名为输入,输出验证结果(通过或不通过)【注意:有时我们也将私钥称为签名密钥,将公钥称为验证密钥】,其示意图如下:
(4)数字签名应用如此广泛的原因是其可提供如下三种特性:
(4.1)认证性(来源认证性):签名者身份的真实性(源认证,是谁发出来的)
(4.2)不可否认性:名行为的抗抵赖性
(4.3)完整性:如果有人篡改了消息,签名就会失效(即:验签通不过)
(5)数字签名的技术流程如下:
(5.1)信息发送者使用摘要算法对信息生成信息摘要;
(5.2)信息发送者使用自己的私钥对信息摘要进行签名(加密);
(5.3)信息发送者把信息本身和已签名的信息摘要一起发送出去;
(5.4)信息接收者使用相同的摘要算法对接收的信息本身生成新的信息摘要;
(5.5)信息接收者使用信息发送者的公钥对已签名的信息摘要进行验签(解密),获得信息发送者的信息摘要;
(5.6)信息接收者比较这两个信息摘要是否相同,如果相同则确认信息发送者的身份和信息没有修改过;否则,表示被修改过。
(6)数字签名(Digital Signature Algorithm)算法的标准
(6.1) 基于RSA的数字签名算法标准:
(a) RSA PKCS#1 v1.5:一个有漏洞的标准,目前RSA签名仍被广泛使用,这是因为该算法是第一个被标准化的签名方案,而现实世界中的应用程序很难更新到更优的算法。RSA签名与RSA加密的使用方式刚好相反,签名和验签过程如下:
- 在签名过程中,使用私钥(而非公钥)对消息进行加密【实际应用中通常是对消息的哈希值计算签名(如果使用PKCS#1 v1.5的标准,还需要根据其规定的签名填充方式对哈希值进行填充),因为哈希值占用的空间较少,RSA只能对小于其模数的消息进行签名,签名的结果用一个大整数表示,以便用于数学运算】,加密的结果是签名;
- 在验证过程中,我们使用公钥(而非私钥)对签名进行解密,如果解密的结果是原始的密文,说明这个签名是有效的。
(b) RSA-PSS(Probabilistic Signature Scheme)一个更优的(基于RSA)签名标准:其中PSS表示概率签名方案,PSS是可证明安全的,即任何人都不能在不知道私钥的情况下伪造签名。这是一种更安全的RSA数字签名方案,相对于RSA-PKCS#1 v1.5,它提供了更强的抗碰撞和抵抗选择明文攻击的能力。RSA-PSS使用了随机盐值、哈希函数和掩码生成函数,通过对哈希值进行适当的处理和加密,生成数字签名。
(c) RSA-FDH(Full Domain Hash): 这是一种将Full Domain Hash和RSA结合起来的数字签名方案。它的思想是先对消息进行哈希运算,然后将哈希值作为RSA加密的输入,并将RSA加密的结果作为数字签名。
上面是三种基于RSA的数字签名算法标准,尽管RSA-PSS算法和FDH算法都提供了安全性证明,并且在算法实现时不容易出错,但现今大多数协议仍然使用RSA PKCS#1 v1.5进行签名。这是另一个由于算法没有得到普遍认同而导致算法更新缓慢的例子。由于较旧的算法实现必须与较新的算法实现配合使用,因此很难完全删除或替换旧算法。接下来介绍最新的数字签名算法:
(6.2)椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm, ECDSA)
ECDSA中经常使用的椭圆曲线与ECDH密钥交换算法经常使用的曲线几乎相同,(ECDH密钥交换算法经常使用的曲线有 P-256, Curve25519,还有不太常使用的P-512和Curve448),但有一个例外:Secp256k1曲线。如今在实际应用中,ECDSA主要使用NIST的曲线P-256(有时也把P-256曲线称为Secp256r1,注意它与Secp256k1的命名区别)
(6.3)Edwards曲线数字签名算法——EdDSA
EdDSA常用的两条安全级别不同的曲线,这两条曲线属于扭曲的Edwards曲线(是一种在实现时可以进行有效优化的椭圆曲线)
(a)Edwards25519曲线:这条曲线是基于Daniel J.Bernstein提出的Curve25519(第五章)设计的。与Curve2519一样,Edwards25519的安全级别达到了128比特。
(b)Edwards448曲线: 其安全级别达到了224比特。
实例化EdDSA时通常使用的是Edwards25519曲线,将这个实例化的算法称为Ed25519,这个算法是应用最广泛的EdDSA实例,它指定使用Edwards25519曲线以及SHA-512哈希函数(使用Edwards448曲线的EdDSA实例简称为Ed448)
(7)上面已经介绍了现实世界中常用的签名算法,总结如下:
(7.1)RSA PKCS#1 v1.5算法仍在广泛使用,但该算法在实现上很容易出现错误,它的许多实现已被攻破,不推荐使用;
(7.2)RSA-PSS算法具有安全性证明,易于实现,但由于新的基于椭圆曲线的方案性能更好(支持更短密钥),因此RSA-PSS算法现在并不流行;
(7.3)ECDSA是RSA PKCS#1 v1.5的主要竞争对手,它在实现时主要使用NIST的P-256曲线,但在“加密货币”领域它主要使用Secp256k1曲线;
(7.4)EdDSA算法常使用Edwards25519曲线(该方案与曲线的结合称为Ed5519签名算法),现已被广泛采用,与ECDSA相比它更易于实现,推荐使用。
(8)数字签名的实际作用:公钥基础设施PKI