首页 能链洞察 区块链百科

数字签名 | 基于RSA的签名方案

数字签名 | 基于RSA的签名方案

发布时间:2020.07.08

在数字时代中,数字化文档的认证性、完整性和不可否认性,是实现信息化安全的基本要求。数字签名则是满足上述要求的主要方式之一,亦是现代密码学的研究内容之一。

 

数字签名有哪些形式?基于密码学的数字签名优势几何?有哪些常用的数字签名实现方案?使用过程中又潜藏何等风险?我们将先从理解概念为始,再为大家逐步深入介绍。


 

一、公钥密码体制

 

通过前章数字签名概念原理篇的介绍,我们可以看到公钥密码体制(即非对称密码体制)是整个密码学发展史上最伟大的一次革命,并已成为确保信息安全传输的关键技术。

 

在此之前,对称密码体制(即加密与解密密钥相同)虽一定程度上能解决保密通信问题,但随着计算机和网络的飞速发展,其局限性就逐渐显现出来

 

(1)密钥分发:通信双方如何安全、高效的传输初始密钥;

(2)密钥管理:在有n个用户的通信网络中,每个用户与其他人分别共享一个密钥,即意味着需要管理n(n-1) /2个密钥总量,这存在巨大安全隐患;

(3) 数字签名:由于通信双方拥有同样的密钥,任何一方都以此生成消息认证标签,实际上便是无法实现数字签名功能。

 

正是对称密码体制存在的这些局限性以及实际应用需求,非对称密码体制应运而生,其基本思想便是在加密/解密时,分别使用两个不同的密钥:其中公钥可对外公开,而私钥只有所有者知道。这个设想提出后,引起了密码学的高度重视,多种公钥密码算法被相继提出。

 

二、RSA算法简介

 

RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(AdiShamir)和伦纳德·阿德曼(Leonard Adleman)联合提出的。

 

RSA可以说是第一个安全、实用的公钥加密算法,并已成为国际标准,也是目前应用最广泛的公钥加密体制之一。RSA的基础是数论的欧拉定理,其安全性依赖于大整数因子分解的困难性。

数字签名
 

因为加解密次序可换,RSA公钥加密体制既可用于加密,也可用于设计数字签名。在这里要提醒大家注意的是,公钥、私钥均可用来加密与解密。

 

若为了实现加密传输,则可用收信方公开的公钥加密文件,由此仅唯一拥有私钥的收信方才可以解密文件;若是为了实现数字签名,则可用自己的私钥进行数字签名,接收者可以用对应的公钥解密以确认签名来源。

数字签名

 

三、基于RSA的签名方案

 

密钥生成算法

密钥生成算法即为用户生成加解密算法中使用的公钥私钥对,RSA签名方案的密钥生成和RSA加密算法相同。

① 选取两个安全大素数p和q(“大”指其长度要足够长,目前推荐长度为至少1024比特);

② 计算乘积n=p×q,φ(n)=(p-1)(q-1),其中φ(n)为n的欧拉函数;

③ 随机选取整数e(1<e<φ(n))作为公钥,要求满足gcd(e,φ(n))=1,即e与φ(n)互素;

④ 用Euclid扩展算法计算私钥d。

 由此,签名者的公钥为(n,e)私钥为d,而p、q两个素数为秘密参数,如不再需要可销毁,但绝不能泄露。

 

签名算法

假设待签名的消息为m∈Zn,首先利用一个安全的Hash函数h来生成消息摘要h(m),然后签名者A可以用下面的算法计算签名s=h(m)d(mod n)。在这个过程中,需要用到私钥d,得到的s即为消息m的签名,并将(s,m)发送给接收方B。

 

验证算法

签名接收者B收到消息m和签名s后,首先利用上述Hash函数h计算消息摘要h(m),然后检验等式h(m)mod n ≡ se(mod n)是否成立;即消息经哈希后的数值,与签名s经公钥解密后的哈希值是否一致。若成立,则签名有效;否则,签名无效。

 

 

四、RSA的签名方案解析

 

我们都知道,密码学是保障信息安全的核心,那么 RSA 算法是如何保证安全性的呢?在 RSA 算法中,公钥(n , e)是公开的,要破解RSA算法意味需要计算出私钥d。

数字签名

由上述公式可以看出,密码破解的实质问题是:找到p与q的值。但是,当p和q是大素数时,通过它们乘积n去分解因子 p 和 q,这是一个公认的数学难题。简单理解,即我们知道100,根本无法推出这是哪两个数的乘积。

 

另一方面,我们在签名时使用了Hash函数生成消息摘要,较之对消息本身进行签名,具有更好的抗攻击性。如果不使用Hash函数,我们对消息m1、m2的签名分别是s1、s2。假如攻击者获得了这两个签名,便可伪造假消息的有效签名也是s1、s2。使用安全的Hash函数就可以避免类似这样的攻击,从而提高签名体制的安全性。另外,对于文件较大的消息而言,经由Hash算法可以映射为固定长度再签名,大大提高签名和验证的效率

 

实际上,RSA密码算法依赖的仍是一种数学运算。为了保证安全性,其私钥往往很大,因此签名/解密时计算较慢;公钥可通过一些特殊形式压缩,验证和加密速度相对快一些。在RSA算法提出后,已有一些新的突破性算法,使得安全性及运算速度均有一定提高,我们下回分解