网络技术的迅猛发展促进了办公模式的改变,电子政务开始在政府的各行各业广泛的应用开来。数字签名作为一种法律承认的能够保证数据的完整性、机密性、抗否定性的信息安全技术,在安全、高效的利用网络进行办公中发挥了重要的作用。那么我今天就给大家介绍一下如何利用RSA加密算法来实现数字签名。

RSA加密算法实现数字签名的技术原理

实现数字签名的方法大体分三种:单项散列函数(HASH)签名、对称密钥系统签名、非对称密钥系统签名。其中单项散列函数(HASH)签名和对称密钥系统签名都存在密钥保存困难的问题,所以利用非对称密钥算法——RSA加密算法进行数字签名的技术被广泛的运用。

一、RSA加密算法

RSA加密算法作为最著名的非对称密钥算法,其原理是利用两个大质数与被加密原文模乘产生的积来进行加密金额解密。这两个质数无论是用哪一个与被加密的原文模乘.即对原文件加密,均可由另一个质数再相乘来进行解密,即:

EPubk(DPrik(m))=DPubk(EPrik(m))=m(1)

但是,若想用这个乘积来求出另一个质数,就要对大数进行质因子分解,分解一个大数的质因子是十分困难的,若选用的质数足够大,这种求解几乎是不可能的。在现实的应用中每个用户保存着一对密钥:公钥Pubk和私钥Prik。其中私钥Prik采用私密的安全介质保密存储起来,应不对任何外人泄露;公钥Pubk可以公开发表,通常存放在公共服务器上供人查询。

二、RSA加密算法实现数字签名的原理

当发方向收方通信时发方用收方的公钥Pubk对原文进行加密,收方收到发方的密文后,用自己的私钥Prik进行解密,其中他人是无法解密的,因为他人不拥有与加密公钥Pubk所对应的私钥Prik。

RSA加密算法在数字签名中则是私钥加密,公钥解密。即发送方先用HASH加密算法对文件M求散列值,即数字摘要H,然后利用自己的密钥Prik对数字摘要进行加密生成数字签名C,然后将M和C一起发送给接收方,接受方收到文件M1和数字签名C1,现在需要验证M和M1是否完全相同。接收方利用眦HASH函数对收到的文件M1进行求散列值,即数字摘要H1,利用发送方公开的公钥Pubk对数字签名C1进行解密得到数字摘要H2,比较H1和H2,如果相同,则说明在传输中文件没有发生变化,并且文件是由发送者发的。

先将文件用HASH加密算法计算出相对较短的摘要,然后对摘要进行签名可以缩短RSA签名过程,以适应现实应用需要,因为HASH函数具有以下性质:对于任意长度的信息m,经过HASH运算后,会生成一个固定长度的散列值,即:

h=H(m)

给定m,很容易计算出h;已知h,求m是很困难的:已知h=H(m),构造H(m’)=h很困难;h的每一比特与m的每一比特都相关,并有高度的敏感性,即每改变m的每一比特,都将对h产生明显影响。以上流程完成了数字签名的功能:防篡改和防抵赖。因为如果文件在传输过程中被篡改,根据HASH算法具有的“原文有任何改动,其哈希值就要发生剧烈变化”的特点,
H1和H2不会相同;如果发送者否定文件是他发的,那么根据RSA加密算法的“分解一个大数的质因子是十分困难的,若选用的质数足够大,这种求解几乎是不可能的”的特点,用发送方的公钥是绝对解密不了用其他人私钥加密的秘文的。

利用RSA加密算法实现公文流转的数字签名的过程

NET Framework将加密和数字签名算法组合到一起,并将它作为AsymmetricAlgorithm类的子类,利用抽象算法类 RSA 及其实现的对应方法可以简单的实现数字签名。

一、产生密钥对

首先实例化RSA算法引擎RSACryptoServiceProVider,导出密钥参数值。

RSACryptoServiceProvider rsa=new;

RSACryptoServiceProvider();

RSAParameters keys=rsa. _ExportParameters(true);

将导出的密钥参数值写入文件产生密钥对,并将密钥对保存为xml文件。其中私钥由发送文件方保存,公钥存放在公共位置以便接收方查询。

SaveToFile (address._PubK,pkxnil);
SaveToFile (address_PriK,psxNI);

二、 对文件进行数字签名

对文件进行数字签名分为两个部分,生成数字摘要和实现数字摘要的签名。

首先实例化RSAHandler类,将需要签名的文件以流读入,利用GetHashData函数对文件生成数字摘要。

RSAHandler rsahd=new RSAHandler();

Stream sm=new FileStrea:(file name,FileMode. Open,FileAccess. Read,FileShare. Read);

byte[]hashsm=rsahd, GetHashData(sm);

然后实例化签名类RSAPKCSISignatureFonatter,装入私钥,利用CreateSignature函数对数字摘要生成签名。

RSAPKCSISignatureFoniatter format=rsahd. CreateRSAFoniatter (address_PriK);

byte[]signdata=format. CreateSignature (hashsm);

三、验证数字签名

验证数字签名分为两个部分:对接收的文件重新生成数字摘要和将原数字签名解密成原数字摘要并比较这两个摘要。

1、重新生成数字摘要:

Stream newSm = new

FileStream(filename, FileMode. Open, FileAccess. Read,FileShare. Read);

byte[]newHashsm=rsahd. GetHashData(newsm);

2、检查数字签名:

首先实例化签名类RSAPKCSISignatureDeformatter,装入公钥,利用RSAPKCSISignature Deformatter类的VerifySignature函数,先将数字签名解密成数字摘要,然后与重新生成的数字摘要作比较,以确定文件是否被更改。

RSAPKCSISignatureDeforHiatter deformat=rsahd. CreateRSADefonatter(address PubK);

if (defonnat. VerifySignature (Convert. FronBase64String (newHashCode),

Convert, FromBase64String (dataSignCode)))

{...}

可以进行简单的验证:按照软件的流程对文件进行数字签名后,更改文件,程序会报“验证失败”;选择与加密私钥不对应的公钥解密也会得到同样的结果。

用RSA加密算法对文件和文件的数字签名进行加密,提高了数字签名验证效率,确保了电子公文在流转过程中的安全。

小知识之数字签名:

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。