RSA加密算法在數(shù)字簽名中的應(yīng)用

網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展促進(jìn)了辦公模式的改變,電子政務(wù)開始在政府的各行各業(yè)廣泛的應(yīng)用開來(lái)。數(shù)字簽名作為一種法律承認(rèn)的能夠保證數(shù)據(jù)的完整性、機(jī)密性、抗否定性的信息安全技術(shù),在安全、高效的利用網(wǎng)絡(luò)進(jìn)行辦公中發(fā)揮了重要的作用。那么我今天就給大家介紹一下如何利用RSA加密算法來(lái)實(shí)現(xiàn)數(shù)字簽名。

RSA加密算法實(shí)現(xiàn)數(shù)字簽名的技術(shù)原理

實(shí)現(xiàn)數(shù)字簽名的方法大體分三種:?jiǎn)雾?xiàng)散列函數(shù)(HASH)簽名、對(duì)稱密鑰系統(tǒng)簽名、非對(duì)稱密鑰系統(tǒng)簽名。其中單項(xiàng)散列函數(shù)(HASH)簽名和對(duì)稱密鑰系統(tǒng)簽名都存在密鑰保存困難的問(wèn)題,所以利用非對(duì)稱密鑰算法——RSA加密算法進(jìn)行數(shù)字簽名的技術(shù)被廣泛的運(yùn)用。

一、RSA加密算法

RSA加密算法作為最著名的非對(duì)稱密鑰算法,其原理是利用兩個(gè)大質(zhì)數(shù)與被加密原文模乘產(chǎn)生的積來(lái)進(jìn)行加密金額解密。這兩個(gè)質(zhì)數(shù)無(wú)論是用哪一個(gè)與被加密的原文模乘.即對(duì)原文件加密,均可由另一個(gè)質(zhì)數(shù)再相乘來(lái)進(jìn)行解密,即:

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

但是,若想用這個(gè)乘積來(lái)求出另一個(gè)質(zhì)數(shù),就要對(duì)大數(shù)進(jìn)行質(zhì)因子分解,分解一個(gè)大數(shù)的質(zhì)因子是十分困難的,若選用的質(zhì)數(shù)足夠大,這種求解幾乎是不可能的。在現(xiàn)實(shí)的應(yīng)用中每個(gè)用戶保存著一對(duì)密鑰:公鑰Pubk和私鑰Prik。其中私鑰Prik采用私密的安全介質(zhì)保密存儲(chǔ)起來(lái),應(yīng)不對(duì)任何外人泄露;公鑰Pubk可以公開發(fā)表,通常存放在公共服務(wù)器上供人查詢。

二、RSA加密算法實(shí)現(xiàn)數(shù)字簽名的原理

當(dāng)發(fā)方向收方通信時(shí)發(fā)方用收方的公鑰Pubk對(duì)原文進(jìn)行加密,收方收到發(fā)方的密文后,用自己的私鑰Prik進(jìn)行解密,其中他人是無(wú)法解密的,因?yàn)樗瞬粨碛信c加密公鑰Pubk所對(duì)應(yīng)的私鑰Prik。

RSA加密算法在數(shù)字簽名中則是私鑰加密,公鑰解密。即發(fā)送方先用HASH加密算法對(duì)文件M求散列值,即數(shù)字摘要H,然后利用自己的密鑰Prik對(duì)數(shù)字摘要進(jìn)行加密生成數(shù)字簽名C,然后將M和C一起發(fā)送給接收方,接受方收到文件M1和數(shù)字簽名C1,現(xiàn)在需要驗(yàn)證M和M1是否完全相同。接收方利用眥HASH函數(shù)對(duì)收到的文件M1進(jìn)行求散列值,即數(shù)字摘要H1,利用發(fā)送方公開的公鑰Pubk對(duì)數(shù)字簽名C1進(jìn)行解密得到數(shù)字摘要H2,比較H1和H2,如果相同,則說(shuō)明在傳輸中文件沒有發(fā)生變化,并且文件是由發(fā)送者發(fā)的。

先將文件用HASH加密算法計(jì)算出相對(duì)較短的摘要,然后對(duì)摘要進(jìn)行簽名可以縮短RSA簽名過(guò)程,以適應(yīng)現(xiàn)實(shí)應(yīng)用需要,因?yàn)镠ASH函數(shù)具有以下性質(zhì):對(duì)于任意長(zhǎng)度的信息m,經(jīng)過(guò)HASH運(yùn)算后,會(huì)生成一個(gè)固定長(zhǎng)度的散列值,即:

h=H(m)

給定m,很容易計(jì)算出h;已知h,求m是很困難的:已知h=H(m),構(gòu)造H(m’)=h很困難;h的每一比特與m的每一比特都相關(guān),并有高度的敏感性,即每改變m的每一比特,都將對(duì)h產(chǎn)生明顯影響。以上流程完成了數(shù)字簽名的功能:防篡改和防抵賴。因?yàn)槿绻募趥鬏斶^(guò)程中被篡改,根據(jù)HASH算法具有的“原文有任何改動(dòng),其哈希值就要發(fā)生劇烈變化”的特點(diǎn),
H1和H2不會(huì)相同;如果發(fā)送者否定文件是他發(fā)的,那么根據(jù)RSA加密算法的“分解一個(gè)大數(shù)的質(zhì)因子是十分困難的,若選用的質(zhì)數(shù)足夠大,這種求解幾乎是不可能的”的特點(diǎn),用發(fā)送方的公鑰是絕對(duì)解密不了用其他人私鑰加密的秘文的。

利用RSA加密算法實(shí)現(xiàn)公文流轉(zhuǎn)的數(shù)字簽名的過(guò)程

NET Framework將加密和數(shù)字簽名算法組合到一起,并將它作為AsymmetricAlgorithm類的子類,利用抽象算法類 RSA 及其實(shí)現(xiàn)的對(duì)應(yīng)方法可以簡(jiǎn)單的實(shí)現(xiàn)數(shù)字簽名。

一、產(chǎn)生密鑰對(duì)

首先實(shí)例化RSA算法引擎RSACryptoServiceProVider,導(dǎo)出密鑰參數(shù)值。

RSACryptoServiceProvider rsa=new;

RSACryptoServiceProvider();

RSAParameters keys=rsa. _ExportParameters(true);

將導(dǎo)出的密鑰參數(shù)值寫入文件產(chǎn)生密鑰對(duì),并將密鑰對(duì)保存為xml文件。其中私鑰由發(fā)送文件方保存,公鑰存放在公共位置以便接收方查詢。

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

二、 對(duì)文件進(jìn)行數(shù)字簽名

對(duì)文件進(jìn)行數(shù)字簽名分為兩個(gè)部分,生成數(shù)字摘要和實(shí)現(xiàn)數(shù)字摘要的簽名。

首先實(shí)例化RSAHandler類,將需要簽名的文件以流讀入,利用GetHashData函數(shù)對(duì)文件生成數(shù)字摘要。

RSAHandler rsahd=new RSAHandler();

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

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

然后實(shí)例化簽名類RSAPKCSISignatureFonatter,裝入私鑰,利用CreateSignature函數(shù)對(duì)數(shù)字摘要生成簽名。

RSAPKCSISignatureFoniatter format=rsahd. CreateRSAFoniatter (address_PriK);

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

三、驗(yàn)證數(shù)字簽名

驗(yàn)證數(shù)字簽名分為兩個(gè)部分:對(duì)接收的文件重新生成數(shù)字摘要和將原數(shù)字簽名解密成原數(shù)字摘要并比較這兩個(gè)摘要。

1、重新生成數(shù)字摘要:

Stream newSm = new

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

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

2、檢查數(shù)字簽名:

首先實(shí)例化簽名類RSAPKCSISignatureDeformatter,裝入公鑰,利用RSAPKCSISignature Deformatter類的VerifySignature函數(shù),先將數(shù)字簽名解密成數(shù)字摘要,然后與重新生成的數(shù)字摘要作比較,以確定文件是否被更改。

RSAPKCSISignatureDeforHiatter deformat=rsahd. CreateRSADefonatter(address PubK);

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

Convert, FromBase64String (dataSignCode)))

{...}

可以進(jìn)行簡(jiǎn)單的驗(yàn)證:按照軟件的流程對(duì)文件進(jìn)行數(shù)字簽名后,更改文件,程序會(huì)報(bào)“驗(yàn)證失敗”;選擇與加密私鑰不對(duì)應(yīng)的公鑰解密也會(huì)得到同樣的結(jié)果。

用RSA加密算法對(duì)文件和文件的數(shù)字簽名進(jìn)行加密,提高了數(shù)字簽名驗(yàn)證效率,確保了電子公文在流轉(zhuǎn)過(guò)程中的安全。

小知識(shí)之?dāng)?shù)字簽名:

數(shù)字簽名(又稱公鑰數(shù)字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實(shí)現(xiàn),用于鑒別數(shù)字信息的方法。一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名,另一個(gè)用于驗(yàn)證。