上次写了椭圆曲线密码学的基础知识椭圆曲线密码学简介(一),这次写一下椭圆的应用--签名和验签。
1 为什么要做数字签名下图是非对称加解密(如 RSA 或 ECC 等),Bob使用 Alice 的公钥(Public Key)对消息进行加密,然后将加密后的信息发送给 Alice,Alice 收到消息后使用私钥(Private Key)对消息进行解密,即可得到 Bob 想发送给她的信息,这就是非对称加解密的基本流程。其中 Public Key 是公开,私钥只有 Alice 自己知道,想要通过公钥和密文很难得到原始消息。
这里有个隐患,即加密文发送过程中,如果被拦截并修改再继续发送,那么 Alice 收到密文解密后得到的就不是 Bob 想发给她的消息。另外由于 Public Key 是公开的,因此如果有人想冒充 Bob 给 Alice 发消息,Alice 也没有办法识别。因此要解决 2 个问题,才能保证信息的完整和正确的传输:
Bob 身份的认证;
Bob 发送的消息的完整性(integrity);
使用数字签名的方法可以解决上述两个问题。
2 什么是数字签名数字签名(Digital Signature),又称公钥数字签名 ,是由信息发送者产生的别人无法伪造的一段消息(字符串),这段消息是发送消息者身份的一个证明(类似于身份证和指纹等)。在数字签名技术中,主要包含两种行为:
生成数字签名,也称签名;
验证数字签名,也称验签;
生成数字签名由消息发送者完成,验证数字签名由消息接收者完成。与前面写 Hash 时提到的 MAC 和 HMAC 不同(消息发送者和接收者使用相同的 secret key),数字签名对签名密钥和验证密钥进行了区分,签名密钥只能由签名的人持有,而验证签名则是任何需要验证签名的人都可以持有。上图公钥密码学中,使用公钥进行加密,使用私钥进行解密(RSA 也可以私钥加密,公钥解密)。数字签名中使用公钥来验证签名,使用私钥来生成签名。
3 数字签名的方法一般有 2 种数字签名和验证签名的方法,
直接对消息进行签名;
对消息的 Hash 值进行签名;
直接对消息进行签名比较容易理解,但是一般消息都较大,直接对消息进行加密(对消息进行签名)非常耗时间,因此一般不会使用这种方法。第二种方法,对消息进行Hash 运算得出 Hash值,然后再 Hash值进行加密(对Hash 值进行签名),就会快很多。下图为 Alice 签名,Bob 验证签名的例子:
Alice 用单向散列函数(Hash)计算出消息散列值;
Alice 用自己的私钥对散列值进行加密。用私钥加密散列值得到的密文就是 Alice 对这条散列值的签名。只有 Alice 才有私钥,其他人无法生成相同的签名。
Alice 将消息和签名发送给 Bob;
Bob 用 Alice 的公钥对收到的签名进行解密。如果签名是用 Alice 的私钥加密的,那么用 Alice 的公钥才能正确解密,否则不能正确解密。
Bob 将签名解密后得到的散列值与 Alice 直接发送的消息的散列值进行对比。如果两者一致,则验证成功,否则不成功。
Q1: 密文为什么能作为签名使用?A1: 数字签名是利用了没有私钥的人无法生成使用该私钥的密文这个性质来实现的。这里使用私钥加密生成的密文不是为了保证消息的机密性,而是用于代表只有持有该私钥的人才能够生成的信息。Q2: 数字签名能保证机密性吗?A2: 从上面的签名的图中可以看出,消息(Message)没有经过加密就发送了,因此数字签名不能保证消息的机密性。其实数字本来就不是用来保证机密性的,如果需要保证消息的机密性,需要将消息加密以后再发送。Q3: 签名会不会被重复使用?A3: 可以拦截数字签名附在别的消息后面发送,但是验证签名会失败。签名和消息之间是有对应关系的,消息不同签名也不同,因此签名无法重复使用。
5 数字签名的使用安全信息公告
如果某些组织要在网上发一些公告,怎么确认这些消息是否为该组织发布并且没有被修改呢? 信息的发布一般是为了让别人知道,因此一般不使用加密的方法。可以对信息文件附上数字签名一起,这样就可以验证消息的合法性。
软件下载
从网上下载软件时需要判断软件是否可用,因为下载的软件可能被执行一些恶意修改。为了防止这样的问题,软件开发者可用对软件加上数字签名,这样在软件下载后验证数字签名即可识别软件是否被篡改。
公钥证书
验证数字签名时需要合法的密钥,如何知道得到的公钥是否合法呢? 可以将公钥当作消息对其加上数字签名。这样对公钥施加数字签名得到的就是公钥证书。
6 ECDSA 和 SM2 签名和验签ECDSA (Elliptic Curve Cryptography Digital Signature Algorithm),椭圆曲线数字签名算法。
数字签名
下图是 SM2 和 ECDSA数字签名的流程。与前面介绍一致,对消息 M 哈希值进行签名,签名最终结果为(r, s)。SM2 和 ECDSA 数字签名计算过程略有不同,详见下图中的虚线框。SM2 和 ECDSA 数字签名算法主要差异为如下三点:1) 签名过程 SM2 需要将用户信息生成的参数 ZA 加入签名过程;SM2 椭圆曲线公钥密码算法第二部分中对用户其他信息定义。
2) 计算 r 时,SM2 会将哈希值 e 引入计算,ECDSA 只引用 kG 计算结果的 x 坐标值;3) 计算 s 时,SM2 和 ECDSA 完全不同,ECDSA 在此步骤中引用哈希值 e;
验证签名
下图是 SM2 和 ECDSA 的验证签名流程,输入均为签名的结果(r, s),通过验签流程计算,得出的结果 R 如果和输入的 r 相等,则验证签名通过,否则验证失败。SM2 和 ECDSA验证签名的差异:1) SM2 验证签名需将用户信息生成的参数 ZA引入计算;2) 哈希值 e 的引用位置不同;3) 主要计算步骤(图中虚线框)不同;
SM2 和 ECDSA 差异
下图为 SM2 签名算法和 ECDSA 的差异点总结:其中 SM2 的签名和验证签名中的密码杂凑函数必须使用 SM3。详见参考 2 中的 SM2 椭圆曲线公钥密码算法标准第二部分。关于 SM3 的介绍参考Hash算法和使用简介。
7 参考图解密码技术/(日) 结城浩著;周自恒译文,人民邮电出版社 2015.1
SM2 椭圆曲线公钥密码算法: https://www.oscca.gov.cn/sca/xxgk/2010-12/17/1002386/files/b791a9f908bb4803875ab6aeeb7b4e03.pdf