在日常工作中,有很多文件需要領(lǐng)導(dǎo)審閱、簽名和蓋章,由于公司業(yè)務(wù)開展,跨地域、跨國(guó)業(yè)務(wù)也日益普遍,領(lǐng)導(dǎo)簽名蓋章變得很麻煩,開始的時(shí)候人們通過(guò)郵寄、傳真等方式來(lái)解決,但是耗費(fèi)時(shí)間、人力、物力。在網(wǎng)絡(luò)化日益深入的今天,需要領(lǐng)導(dǎo)審批、簽字蓋章的東西越來(lái)越多,時(shí)間也越來(lái)越緊迫,數(shù)字簽名的出現(xiàn),很好了解決了這一問(wèn)題。推動(dòng)了互聯(lián)網(wǎng)及跨國(guó)集團(tuán)的發(fā)展。 數(shù)字簽名1、概念數(shù)字簽名基于哈希算法和公鑰加密算法,對(duì)明文報(bào)文先用哈希算法計(jì)算摘要,然后用私鑰對(duì)摘要進(jìn)行加密,得到的值就是原文的數(shù)字簽名。 數(shù)字簽名(又稱公鑰數(shù)字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實(shí)現(xiàn),用于鑒別數(shù)字信息的方法。 一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名,另一個(gè)用于驗(yàn)證。 可以由下圖表示電子簽名的用處: 2、工作原理流程圖如下: 數(shù)字簽名的使用一般涉及以下幾個(gè)步驟,我們通過(guò)安全電子郵件為案例進(jìn)行介紹 (1)發(fā)件人生成或取得獨(dú)一無(wú)二的加密密碼組,包括私鑰和公鑰。 (2)發(fā)件人書寫電子郵件 (3)發(fā)件人用安全的摘要算法獲取電子郵件的信息摘要 (4)發(fā)件人再使用私鑰對(duì)信息摘要進(jìn)行加密,即可得到數(shù)字簽名。 (5)發(fā)件人將數(shù)字簽名附在信息之后. (6)發(fā)件人將數(shù)字簽名和信息(加密或未加密)發(fā)送給電子收件人. (7)收件人使用發(fā)件人的公共密碼(公鑰)確認(rèn)發(fā)件人的電子簽名,即將發(fā)件人的數(shù)字簽名通過(guò)公鑰進(jìn)行解密,得到信息摘要 (8)收件人使用同樣安全的摘要算法,獲取信息(加密或未加密)的"信息摘要". (9)收件人比較兩個(gè)信息摘要.假如兩者相同,則收件人可以確信信息在簽發(fā)后并未作任何改變 (10) 收件人從證明機(jī)構(gòu)處獲得認(rèn)證證書(或者是通過(guò)信息發(fā)件人獲得),這一證書用以確認(rèn)發(fā)件人發(fā)出信息上的數(shù)字簽名的真實(shí)性.證明機(jī)構(gòu)在數(shù)字簽名系統(tǒng)中是一個(gè)典型的受委托管理證明業(yè)務(wù)的第三方.該證書包含發(fā)件人的公共密碼和姓名(以及其他可能的附加信息),由證明機(jī)構(gòu)在其上進(jìn)行數(shù)字簽名. 其中,第(1)~(6)是數(shù)字簽名的制作過(guò)程,(7)~(10)是數(shù)字簽名的核實(shí)過(guò)程 3、主要作用1、防冒充,因?yàn)樗借€只有簽名者自己知道,其他人不能偽造出正確的簽名 4、應(yīng)用現(xiàn)在典型的應(yīng)用如:網(wǎng)上銀行、電子商務(wù)、電子政務(wù)、網(wǎng)絡(luò)通信等 其中一個(gè)最重要的應(yīng)用場(chǎng)景為:數(shù)字的證書,后續(xù)有具體文章對(duì)其進(jìn)行詳細(xì)介紹。 5、通過(guò)RSA實(shí)現(xiàn)數(shù)字簽名數(shù)字簽名 /// <summary> /// 數(shù)字簽名 /// </summary> /// <param name="plaintext">原文</param> /// <param name="privateKey">私鑰</param> /// <returns>簽名</returns> public static string HashAndSignString(string plaintext, string privateKey) { UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext); using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider()) { RSAalg.FromXmlString(privateKey); //使用SHA1進(jìn)行摘要算法,生成簽名 byte[] encryptedData = RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider()); return Convert.ToBase64String(encryptedData); } }
簽名認(rèn)證: /// <summary> /// 驗(yàn)證簽名 /// </summary> /// <param name="plaintext">原文</param> /// <param name="SignedData">簽名</param> /// <param name="publicKey">公鑰</param> /// <returns></returns> public static bool VerifySigned(string plaintext, string SignedData, string publicKey) { using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider()) { RSAalg.FromXmlString(publicKey); UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] dataToVerifyBytes = ByteConverter.GetBytes(plaintext); byte[] signedDataBytes = Convert.FromBase64String(SignedData); return RSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(), signedDataBytes); } } 測(cè)試用例: public static void TestSign() { string originalData = "文章不錯(cuò),這是我的簽名:奧巴馬!"; Console.WriteLine("簽名數(shù)為:{0}",originalData); KeyValuePair<string,string> keyPair = Encrypter.CreateRSAKey(); string privateKey = keyPair.Value; string publicKey = keyPair.Key; //1、生成簽名,通過(guò)摘要算法 string signedData = Encrypter.HashAndSignString(originalData, privateKey); Console.WriteLine("數(shù)字簽名:{0}",signedData); //2、驗(yàn)證簽名 bool verify = Encrypter.VerifySigned(originalData, signedData,publicKey); Console.WriteLine("簽名驗(yàn)證結(jié)果:{0}",verify); }
源碼地址: |
|