第一篇:數字簽名方案的實現
數字簽名方案的實現
歐家權、應用數學、2111011451
一:數字簽名的背景
隨著信息、電子技術的迅速發展,全球己步入信息社會。由于整個社會將形成一個巨大的計算機網絡,任何部門的計算機網絡一旦出現安全問題,都會直接影響到整個國家的網絡安全,所以計算機網絡安全問題已引起了各國的高度重視。
隨著我國信息化進程的加快,網絡化將向各經濟部門、政府機關、軍隊、學校和社會團體等方向延伸,先進的計算機系統能把整個社會乃至軍隊聯結起來。計算機作為國家的關鍵基礎設施和戰略命脈,其安全狀況直接影響到國家的安全和發展。加密技術是保證信息安全的關鍵技術,其理論是信息安全的核心內容之一。密碼學是一門古老而又年輕的學科,1949年以前,密碼學是一種藝術而并不是作為一門嚴格的科學存在。1949年shannon[’]發表的“保密系統的信息理論”一文為私鑰密碼系統建立了理論基礎,從此密碼學成為了一門科學。而1976年Diffie和Hellman[2]的“密碼學的新方向”則開創了公鑰密碼學的新紀元。
目前的數據加密、數字簽名、消息認證等技術都是以密碼技術作為基礎設計出來的。隨著信息化的高速發展,密碼學理論的研究和應用越來越受到重視。數字簽名的概念由Diffie和Hellman提出,是現代密碼學最重要最基本的概念之一。數字簽名的設計思想等同于手寫簽名,即將簽名者的身份與其簽署的消息綁定,表示某人已對某消息進行了簽字。任何的驗證者均能驗證消息確實為簽名者所簽署,而偽造一個合法用戶的簽名卻是困難的。數字簽名是實現數字通信中可認證性、完整性和不可否認性的重要密碼技術,是應用最為廣泛的公鑰密碼技術之一。
綜上所述,數字簽名的應用范圍相當廣泛,而數字簽名最重要的應用之一就是數字版權管理系統的應用。隨著網絡和數字技術的快速發展,以數字形式存在的產品在人們的日常工作、學習和生活中占據越來越重要的地位。這些數字產品包括:電影、音樂、圖片、電視、軟件、書籍、期刊等,我們通稱之為數字內容。數字內容通常都是有版權的,版權所有者銷售數字內容并希望獲得最大的經濟收益。然而,數字內容的數字特性在為合法的用戶提供存儲、傳輸、處理等便利性的同時,也為盜版者的盜版行為提供了捷徑。如果不采取有效的措施,盜版者就可以將數字內容精確復制并通過互聯網絡傳播,版權所有者的利益將受到嚴重的侵害。
如何通過技術手段來保護數字內容的版權己成為近年來工業界和學術界研究的熱點問題,許多開放的或專有的數字內容保護系統被提出來并得到不同程度的應用。數字內容保護技術是對各類數字內容的知識產權進行保護的一系列軟硬件技術,合理地使用這些技術能夠有效平衡數字內容價值鏈中各參與方的利益和需求,帶動數字內容制作、消費電子和信息技術等產業的發展,并有助于開展新的商業模式,促進整個數字內容市場的發展和信息的傳播,具有廣泛的經濟和社會意義。
因此,基于數字簽名技術與數字版權保護技術的特點與共性,研究數字簽名理論在數字版權管理系統中的應用是一個很有意義的課題,本文將在對數字簽名進行研究的基礎上,將數字簽名的技術與數字版權管理系統進行有機結合,使數字簽名理論能為數字版權的保護作出貢獻。
2000年6月30日,美國克林頓總統用數字簽名和手寫簽名兩種方式正式簽署((數字簽名法律》,使數字簽名在美國與傳統簽名一樣具有了法律效力。
2004年8月28日,第十屆全國人民代表大會常務委員會在第十一次會議通過了《中華人民共和國數字簽名法》,該法自2005年4月1日已經開始施行。
隨著各國相關法律的建立,數字簽名在今后將與手寫簽名或者蓋章具有同等的法律效力。以數字簽名方式簽署的合同、文件等電子文檔與傳統簽名方式簽署的紙質文件具有同樣的法律效應,這就為基于互聯網的電子商務、電子政務等各種應用鋪平了道路。
我國將在國家計委的項目—網絡身份認證管理示范工程基礎上,逐步開展以公安戶政信息和特征識別碼為支持平臺的網絡身份管理等工作,為數字簽名法的實施提供技術上的保障。數字簽名法立法通常遵循技術中立的原則。目前,國際上流行的態度是,數字簽名標準的發展應該統一、透明和客觀,放棄為每一種認證方法進行立法的做法,承認各種數字簽名的形式的合法性,只要其符合國際標準,均具有同等的法律效力和可強制執行力。反映到立法上,就是要確立技術的中立地位,避免規定使用特定技術,只從功能上對數字簽名做出規定。這樣,才能為未來新的數字簽名技術的發展預留法律空間。
數字簽名技術的發展是無止境的,一些原本被認為安全的技術,隨著時間的推移和技術的進步也逐漸暴露出其缺陷。如,美國朗訊科技公司的貝爾實驗室信息科學研究中心的DanielBleiehenbaehe研究員于2000年2月5日宣布在著名的數字簽名算法DSA的隨機數生成技術存在著重大缺陷。因為密鑰的有效性依賴于數字產生的隨機度,但DSA的隨機數產生方法上存在偏重某些數字的現象。在概率上,從某個特定范圍的數字中選擇隨機數的概率是從其它范圍的數字中選擇的2倍。正是這種偏重性大大減弱了DSA的安全性能,從而會加大整個系統的脆弱性。不過以目前性能還不足夠發達的計算機而言,該缺陷還不至于立即構成威脅。但在不久的將來,因特網和企業/政府的內部網絡業務的完整性就會面臨危險。VPN(虛擬個人網絡)、在線購物和金融交易等都有可能受到影響。
在國際密碼學會議(Crypt。2004)上,研究人員宣布,他們發現了破解數種Hash算法的方法,其中包括MD4,MDS,NAVAL一128,RIPEMD。這些都是常搭配數字簽名使用的算法。分析表明,SHAI的減弱條件的變種算法可能被破解,但完整的SHAI并沒有被破解,也沒有找到SHAI的碰撞。研究結果說明,SHAI的安全性暫時沒有問題,但隨著技術的進步,也面臨著危險。隨著數字簽名與普通簽名有同等效力的法規出臺,數字簽名技術的研究與應用將進入一個新的階段。隨著電子政務、電子商務等應用的普及和認識的提高,人們對數字簽名本身的安全要求也在不斷提高。對己有簽名方案的安全分析和攻擊將不斷升級,密碼學中各種算法的安全性將面臨嚴峻的考驗。另一方面,需要依靠數字簽名技術的網絡應用呈快速增長的趨勢。例如:2004年的美國總統大選已開始部分采用網上投票,據稱,世界上搞網上投票和電子投票的不止美國一家,瑞士、英國也己開始嘗試這種新的投票方法。隨著信息化的發展,我國信息安全技術的研究和產業已受到黨和國家的高度重視,江澤民總書記曾明確指出:“信息和網絡安全關系國家安全”。信息安全的地位越來越高,越來越引起政府的重視,投入上也越來越大。
在軍事上,信息戰這種新型作戰模式的出現被視為是一次軍事革命,今后的戰爭中決定勝負的因素不再僅僅是炸藥、飛機和大炮,信息將成為一種重要的克敵制勝的武器。目前這種新型戰爭的各項準備工作各國都在高速進行,而這主要取決于計算機硬件、軟件、網絡通信技術的發展水平。數字簽名技術由于其能有效地防止信息的偽造、確定信息的來源和判斷信息是否完整等能力,使其在信息戰中有著極其重要的作用。
數字簽名的特性使得數字簽名在運用到數字版權管理系統的協議中能起到重要的作用。現今對數字產品的版權保護的主要技術是數字水印技術,數字水印算法己經有了較大發展,能夠應用于所有網絡上的數字媒體,抗攻擊性和可用性也正在提高。目前,有些系統己經開始嘗試將數字水印算法用于數字媒體的版權保護過程中。但是我們應該看到,在開放環境下,密碼算法的安全性和安全協議的安全性是保障
信息安全的兩個基本方面。在開放環境下若要保護數字版權,使用數字水印算法來保證版權的安全性固然很重要,但也必須考慮到版權保護過程中所采用協議的安全性。當攻擊者轉向攻擊協議而不是數字水印算法本身時,如果協議本身存在安全漏洞,則整個系統就起不到真正保護數字版權的作用。1883年,AugusteKerckhoffS〔3}闡述了第一個密碼系統的設計準則,他在該準則中建議:我們應該假設對手知道加密數據的方法,數據的安全性必須僅依賴密鑰的選擇。像商用的密碼算法和協議那樣,為了使數字版權管理系統在開放環境下能起到版權保護作用,系統的設計必須遵守KerCkhoffS準則。顯然,通過引入完備的安全協議,可以最大限度的防范攻擊者對整個系統的破壞。隨著數字化信息應用的普及,數字版權保護安全協議的研究必將會成為一個新的研究熱點。
二:數字簽名的原理
2.1 數字簽名具備的特征 數字簽名類似于數字化的手寫簽名, 但它們又不完全相同.數字簽名與單獨的數據, 如簽名的合同或電子郵件有關.數字化的手寫簽名也是為了完成相同的工作, 但是它卻無法引用待簽的文檔.強迫進行數字化的手寫簽名比強迫進行數字簽名容易的多: 只需從另一個文檔拷貝簽名即可.數字簽名通常提供更高 的安全度, 因為它們與簽名的文檔相關, 而且如果無法讀取所使用的密鑰, 就很難偽造簽名.由此, 數字簽名要具備以下特征:(1)簽名不能被偽造;(2)簽發方簽過名后不能對簽發文件的事實進行抵賴和否認;(3)信息發出后, 任何人不能對其進行篡改;(4)若雙方關于簽名發生糾紛, 可以給第三方仲裁機構提供用于仲裁的證據。
2.2 數字簽名的原理
數字簽名的基礎是密碼技術, 目前較多使用公鑰加密技術, 如基于RSA Date Secu rity 公司的PKCS(Pub lic Key Cryp tography Standards)、DSA(D igi2tal Signatu re A lgo rithm)、PGP(P ret ty Good P rivacy)等.在1994 年美國標準與技術協會公布了數字簽名標準(DSS)后, 公鑰加密技術在數字簽名中的應用更為廣泛.公鑰加密系統使用密鑰對公鑰和私鑰來加密和解密信息.用戶可以公布其公鑰, 公鑰的公布不會損害系統的保密性.而私鑰只有密鑰對的所有者才知道, 從而可把私鑰作為其所有者的身份特征.發送者A 用其私鑰S KA 對文件X 進行加密, 結果D S KA(X)傳送給接收者B.B 用已知的A 的公鑰P KA 解密得出E PKA(D S KA(X))= X.由于除A 外無人具有A 的私鑰S KA , 所以除A 外沒有別人能產生密文D S KA(X), 也就唯一標識了A 的身份.若A 要抵賴曾發送文件給B,B 可將X 及D S KA(X)出示給第三者.第三者很容易用P KA 去證實A 確實發送文件X給B.反之, 若B 將X 偽造為X ′, 則B 不能在第三者前出示D S KA(X ′), 就證明B 偽造了報文.這樣就實現了數字簽名.為了保證傳輸的數據不被篡改, 在現有的數字簽名方案中, 通常以單向函數(如Hash 函數等)作用于文件, 產生固定長度的二進制作為信息摘要, 再將信息摘要用公鑰加密作為簽名與文件一起發送.由于采用單向函數, 給定一個固定長度的字符串, 很難找到一個具有明確意義的消息, 使其函數值與該字符串的信息摘要值完全相同.所以消息一旦被修改或破壞,就會與原來的信息摘要值不匹配.接收方很容易通過計算文件的信息摘要值與傳來的函數值的不同, 而察覺出消息被非法用戶篡改過.目前, J ava 開發包JDK 中支持DSA 簽名,JDK1.3 及以后的版本還支持RSA 簽名.而且, J ava還提供了2 個信息摘要函數MD5 和SHA.以DSA簽名算法和基于MD5 的信息摘要為例, 數字簽名及驗證的過程簽名是首先計算被簽名文件的MD5 碼, 該碼經過DSA 私鑰和DSA 加密算法加密后, 形成數字簽名, 然后再附加到原文件之后, 向外發送.收件人得到帶有數字簽名的文件后, 要對數字簽名進行鑒別.首先取出簽名者的公鑰, 數值簽名經過公鑰和DSA 解密算法解密后, 恢復出原來的MD5 碼.然后計算原文件的MD5 碼, 再與前者比較, 如果相同, 則文件屬實, 否則文件或簽名已經過改動.2.3 數字證書
由于數字簽名依賴于公鑰的完整性, 那么驗證人如何確保他們獲得的公鑰不是來自某個冒名頂替者呢? 而且, 在數字簽名認證發送人的同時, 接收人如何能夠確保發送人值得信任呢? 這些問題的解決方案就是數字證書.由共同信任的第三方或證書授權機構CA(Certificate Authority)頒發證書.CA 不僅有簽名者的公鑰, 還有該用戶的其他信息.證書含有一個有效期.頒發機構用它的專用密鑰在證書上簽名.該過程隱含一個假定, 即CA 的公鑰是廣泛可用的和真實的.公鑰證書以X.509 標準為基礎.默認情況下, Java 開發包使用的是X.509 證書.一個證書包括: 一個公鑰;一個唯一的名字實體(個人或公司), 它是證書的所有者, 包括用戶名字、公司、組織、城市、地址、國家代碼、省份等信息;數字簽名: 一個證書被一個分發者的實體簽名, 保證證書確實包含另一個實體(所有者)的公鑰;分發者的標識名信息.一般是每一個公鑰做一張數字證書,私鑰用最安全的方式交給用戶或自己生產密鑰對,數字證書的內容包括用戶的公鑰、姓名、發證機構的數字簽名及用戶的其他信息,對方可以借此來驗證身份的真假。當然,證書必須預防密鑰丟失,可采用恢復密鑰和密鑰托管等方式處理丟失問題。證書的有效期超過后,必須重新簽發,如果私鑰丟失或被非法使用,則應廢止證書。
數字簽名流程如圖所示:
三:數字簽名的實現方式
由于數字簽名的實現方式多種多樣,可以在不同的應用平臺上采用數字簽名,所以下面列舉兩種比較常見的實現方式進行討論。
3.1 :ASP.NET 中數字簽名的實現 密碼系統是WEB 應用程序的安全通訊的基礎,主要目的是保護數據,保護用戶的標識或數據不被泄漏,保護數據不遭受未授權篡改或者損壞。保證接收的數據來自某特定的用戶。加密是密碼系統在實踐中的應用,它是用算法使數據變得不規則的過程。密碼系統有對稱和不對稱兩種加密方法。在使用.NET 技術創建WEB 應用程序的過程中,可以通過編程方式使用密碼系統來加強WEB 應用程序的安全性。根據所使用的編程平臺,可以使用幾種加密庫中的一種,給WEB 應用程序添加加密、散列和數字簽名功能。
簽名數據處理:
.NET Framework 為簽名數據和文件提供了RSACryptoServiceProvider 和DSACryptoServiceProvider 類。使用RSACryptoServiceProvider 和DSACryptoServiceProvider 類,有兩個可用于簽名數據的選項,如表:
簽名數據的第一步是創建 RSACryptoServiceProvider 類的新實例以生成公鑰/ 私鑰對。可以在應用程序中創建一個 RSACryptoServiceProvider 類的新實例,它從計算機密鑰證書存儲區中讀取公鑰/私鑰對,并把密鑰對保存到一個名為SignKeyContainer 的新的密鑰容器中:
C s p P a r a m e t e r s p a r a m = n e wCspParameters();
P a r a m.K e y C o n t a i n e r N a m e = ”SignKeyContainer”
Param.Flags=CspProviderFlags.UseMachineKeyStore;R S A C r y p t o S e r v i c e P r o v i d e robjRSA=new RSACryptoServiceProvider(param);
注意,當使用RSA CryptoServiceProvider 對象時,必須指定計算機的密鑰證書存儲區,它是只有ASPNET 用戶才有訪問權的證書存儲區。如果要使用個人密鑰存儲區,必須使用模擬方式。
SignData 方法需要字節數據作為參數,所以第二步必須把要進行簽名的數據轉換為字節數組。使用System.Text 命名空間中的UnicodeEncoding 類把字符串轉換為字節數組:
U n i c o d e E n c o d i n g U E = n e wUnicodeEncoding();
byte[] arTextTOSign=UE.GetBytes(txtClear.Text);
最后,調用SignData 方法對數據進行散列和簽名。DSACryptoServiceProvider類使用S H A 1 哈希算法。如果使用RSACryptoServiceProvider 類,可以在SignData方法的第二個參數中指定哈希算法,如下面的代碼所示,其中使用M D 5 哈希算法:
byte[] arDigitalSignature;arDigitalSignature=objRSA.SignData(arTextTOSign,”MD5”);
解密數據處理:
解密已經過數字簽名的數據時,要完成下列步驟:
1)接收方使用發送方的公鑰解密簽名,得到原來的哈希值。
如果簽名可以解密,則接收方可以確信數據來自發送方(或私鑰的所有者)。
2)對數據應用哈希算法來生成第二個哈希值。
3)比較兩個哈希值。如果哈希值匹配,則接收方可以確信數據沒有被修改過。
要驗證數字簽名,必須擁有: 簽名數據的用戶所持有的公鑰 數字簽名 已簽名的數據
簽名者使用的哈希算法
例如由前面簽名數字第一步中SignKeyContainer 密鑰容器創建的一個RSACryptoServiceProvider 類的新實例,為了驗證簽名,需要調用V e r i f y D a t a 或VerifyHash 方法,這依賴于簽名是如何創建的。VerifyData和VerifyHash方法都返回布爾值,True 表明簽名有效;False 表明簽名無效。下面的例子示例使用VerifyData 方法驗證數字簽名。在此例中,arTextTOSign和arDigitalSignature都是由遠程用戶提供的字節數組:
if(objRSA.VerifyData(arTextTOSign,”MD5”, arDigitalSignature))
lblVerify.Text=”Validsignature”;
else
lblVerify.Text=”InValidsignature”
3.2 Java實現方式:
Java 開發包中包含了一系列工具用來提供加密、信息融合、密鑰管理、認證、存取控制和數字簽名等功能, 可以很方便地實現對Java 應用程序和JavaApp let小程序的數字簽名和客戶端認證.Java Applet 小程序簡單、短小, 非常適合網絡傳輸的要求, 而且不受平臺限制.以簽名Applet 小程序為例說明數字簽名的具體實現過程.實現簽名的工具:
密鑰和證書管理工具(Keytoo ls): 它主要是負責公私密鑰對、向CA 發證書申請、接受CA 的回復、記錄信任的公鑰—— 實體對應表, 維護密鑰庫(Keysto re).Java 文檔處理工具(jar): 如果要對代碼簽名, 需要先用jar 將其打包, 然后用jarsigner 來簽名.J ava 文檔簽名及驗證工具(jarsigner): 該工具通過密鑰庫中的數據來對jar 文件進行簽名和認證.策略編輯器(po licytoo l): 編輯系統安全策略的文件.實現簽名的步驟:
在客戶端安裝JRE1.3.0 01(Java 運行環境.3.0.1版本)以取代IE 的JVM(Java 虛擬機).在服務器端的調用App let 的HTML 文件中也需要將它包含進來, 以便沒有事先安裝JRE 的客戶端下載.具體實現步驟如下:
服務器端(代碼分發端):
(1)開發J ava 源程序并編譯, 生成myf ile.class文件.(2)用JAR 對類文件和資源文件進行封裝:jar cvf myf ile.jar myf ile.class(3)用Keytoo l 產生公鑰?密鑰對(DSA 是Keytoo l 程序缺省的算法), 生成X.509V 1 證書, 鍵入命令:keytoo l genkey keysto re myf ile.keysto re alias myf ile(4)使用(3)生成的密鑰對jar 文件進行簽名:jarsigner keysto re myf ile.keysto re myf ile.jarmyf ile(5)輸出公鑰證書.數據的接收方是通過與生成數字簽名的私鑰對應的公鑰來鑒定簽名文件的, 因此要給數據的接收方發送一份公鑰證書的副本.鍵入命令:keytoo l expo rt keysto re myf ile.keysto re alias myf ile file myfile.cer此命令將生成名為myfile.cer 證書文件, 這個cer 文件就是要拷貝到客戶端的唯一文件.這樣就完成了服務器端的設置.這時就可以將jar 文件和keysto re 文件以及cer 文件(在這里使用的是myf ile.jar, myf ile.keysto re, myf ile.cer)拷貝到服務器的目錄下了.客戶端(代碼接收端):
(1)安裝好JRE1.3.0 01 后, 將服務器端生成的myf ile.cer 文件拷貝到jre 的特定目錄下.(2)輸入證書并視其為可信任, 將公鑰倒入到jre 的cacert s(這是jre 的默認keysto re):keytoo l impo rt alias myf ile f ile myf ile.cer keysto re cacert s注意這里要輸入的cacert s 的密碼是changeit,而不是自己設定的keysto re 的密碼.(3)修改安全策略配置文件.運行命令po licytoo l.系統會自動彈出一個po li cytoo l 的對話框, 選擇file 菜單的open 項, 打開客戶端目錄下的java.po liy 文件, 然后在edit 菜單中選擇Change keysto re, 在對話框的new keysto re u rl 欄中輸入密鑰庫cacert s 在客戶機中的路徑, 在new keysto re type 中輸入JKS, 這是cacert s 的固定格式, 然后單擊Add Policy Entry, 在出現的對話框中Code Base 中輸入App let 程序在服務器端的位置:http: URL: 8080其中的URL 是服務器的IP 地址, 8080 是服務器(這里用的是Tomcat)端口.在SignedBy 中輸入別名(alias): 這里是myf ile.然后單擊add perm ission 按鈕, 在出現的perm ission 對話框中選擇你想給這個Applet 的權限, 最后保存.(4)從服務器端取得字節碼, 驗證字節碼的合法性與完整性, 根據策略文件分配相應的權限, 執行代碼, 完成后被垃圾回收器回收內存.四:數字簽名的應用
數字簽名是互聯網上不可缺少的安全處理技術, 目前已有很多人在研究新算法, 以適應于特定領域內數字簽名的需求, 其中包括以下幾個研究方面。
1、高效可驗證的安全數字簽名方案。這種數字簽名方案能夠防止通過猜測RSA 算法的某些變量來選擇信息進行攻擊, 它的安全性不是基于樹型結構的信任關系, 而是利用一種被稱為“散列和標記”的范式。這種簽名的惟一性是建立在它的假設上, 即假設加密所用的散列函數是經過詳細定義的, 并且是合理的(可以不符合標準)。我們可以分3 步證明它的安全性: 首先隨機構造一個預測模型, 且能夠描述并證明這個模型是可靠的, 然后證明所構造的模型可以用一個滿足特定計算特性(這些特性經過詳細定義)的散列函數來代替;最后通過證明滿足這些特定計算性質的散列函數是存在的, 從而論證假設的合理性。
2、防止適應性攻擊的門限簽名方案。在門限簽名方案中, 數字簽名是由一組用戶產生, 而不是由個人或一個組織產生, 簽名所用的私鑰由一個組內的多個用戶共享。為了給消息M 產生一個有效的簽名, 至少需要t+1 個人合作, 由門限簽名方案產生的簽名和只有個人擁有私有密鑰產生的簽名具有相似性, 也就是說是否用分布方式產生數字簽名這一點對接收端來說是透明的。門限簽名方案的作用主要是防止來自內部或外部對簽名密鑰的攻擊, 涉及門限簽名的目標有兩個方面: 一是提高數字簽名代理的有效性;二是防止密鑰被偽造, 使攻擊者更難獲得簽名所用的私鑰。因為組內必須有多個人才能產生數字簽名, 這一點使門限簽名方案具有強壯性, 即使攻擊者就是組內的個別成員, 也能保證信息不被泄漏, 這項工作的實施草案可利用RSA 和DSS 數字簽名方案進行設計實現。
3、面向流信息的數字簽名。對信息流進行數字簽名與對規則信息進行簽名不同, 傳統的簽名方案是面向消息的, 接受端在收到全部信息之后才能對簽名進行驗證。然而流信息是很長的(可能是無限長)的位序列, 接收者必須一邊接收消息, 一邊獲取消息內容, 不能有延遲。如果讓接收者收到全部信息之后再進行驗證是不現實的, 這種流信息包括數字視頻、數字音頻、數據流及java applet 程序等。對于這類簽名包括兩種情況: 一種是發送端已知信息是有限長的(如電影), 另一種是發送端不知道信息的長度(可能無限長, 如廣播)。這種對流信息的簽名技術還能應用于其它領域, 如在通訊代價高時對長文件的高效驗證, 這時可以將基于數字簽名的過濾器裝載代理服務器上。
4、不可否認數字簽名。數字簽名是用來保密組織之間傳遞的秘密協議, 保證傳遞的個人信息的私有性, 因此即使在收發雙方產生了糾紛, 仍然不希望參與驗證簽名合法的第3 方能看到信息原文, 這就需要限制驗證合法性的第3方的權利。當然限制過多會使第3 方失去判斷和解決糾紛的能力, 數字簽名也就失去了它的價值。能夠解決上述問題的一種簽名方案是不可否認數字簽名(undeniable signature),接收端對簽名的驗證過程必須在合法的發送者的參與下使用確認協議(confirmation protocol)來完成, 同時發送者也可以使用否認協議(denialprotocol)來證明簽名是偽造的。當收發雙方A,B 發生糾紛時, 則要求A,B 在公開場合下執行否認協議, 如果發送方A 拒絕參與配合, 則不打自招, 說明此數字簽名為真;否則, A 只有通過該協議的所有步驟才能成功地否認數字簽名。
五:數字簽名的面臨的問題
數字簽名技術正處于發展階段, 還有很多技術沒有解決。下面具 體來討論一下。
1、標準化問題: 在數字簽名中, 只有標準的才是通用的, 只有通用的才有生命力。而目前標準的制定者除了IETF、ITU 和RSA Security主要的三家外, 還有許多組織(如公司、研究所、政府機構)也參與到新的IETF RFC 的開發中, 這使得制定統一的標準更加困難。
2、信任問題: 認證權威機構CA 的主要功能是發行、管理和撤消證書。證書的持有者和使用者都必須信任發行這些證書的CA。然而,什么CA 才是可信任的呢? 這是一個很重要的問題。目前的認證信任模型都是基于認證鏈的, 認證鏈的根即根認證權威機構(rootCA)憑什么可以信任? 此外, 由于PKI 往往是多個并行的, 它們之間進行互連,無論是分層PKI 的根CA 或網格中的任何CA 都必須使用橋CA(bridge CA)進行交叉認證, 那么又憑什么相信橋CA 呢?
3、標識和認證問題: 用戶認證在數字簽名中主要通過密鑰認證來進行, 認證方式有二。一是采用不明確的方式, 如使用口令對加密過的密鑰進行解密操作;二是采用明確的方式, 如在智能卡中使用PIN。無論采用何種方式, 進行簽名之前, 都要明確其對應的應用, 這就要求在進行多個簽名時需要多次認證才能獲得多個認可, 這是安全需要的, 卻是很不方便的。若采用智能卡進行認證, 當用戶沒有攜帶智能卡時還是需要額外的口令方式的數字簽名。而且, 即使攜帶智能卡, 也還需要相應的讀卡設備, 這對于出差在外還是不方便。
4、文檔展示問題: 當用戶授權實施簽名時, 該用戶依賴于系統組件來確保被簽名對象與用戶要簽的對象是對應的, 而不是該對象的一個變體或另外一個完全不同的對象, 或者叫“所見即所簽”往往用戶看到的內容與實際內容是有出入的。
5、注冊認證問題: 為確保用戶身份真實性, 要求欲注冊證書者攜帶有效身份到當地的CA 或RA 辦理手續, 這對不在CA 或RA 所在地的用戶是不太方便的。為解決此問題, 可以申請網上注冊, 然而網上注冊有兩大問題: 一是如何確保用戶的身份不做假, 二是如何確保用戶的申請數據沒有被篡改或出現傳輸錯誤。即, 如何確保用戶的身份正確或CA 所收到的公鑰的確是代表用戶認證的。這依賴于一個安全的注冊過程, 而這個過程應該如何建立,.NET 技術的出現是否能給解決這問題帶來曙光?
6、群簽名: 群簽名方案允許組中合法用戶以用戶組的名義進行簽名, 具有簽名者匿名、只有權威才能辨認簽名者等多種特點, 有著廣泛應用。目前最常用的群簽名方案有K-P-W 可變群簽名方案、LC 群簽名方案和T-J 群簽名方案。但是, 這些方案都存在弱點, 如K-P-W群簽名方案, 攻擊者可以對參數n 進行素因子分解、GC 可以將組成員的有效簽名轉換為組中其他組成員的有效簽名, 此外, 還存在GC 在簽名過程中和身份驗證過程中的偽造。此外, 還有隱形簽名、確認者簽名、團體簽名等, 有應用需求, 但技術實現還處在“初級階段”。
7、生物統計學。這可能是實現用戶認證的最強大的方法, 主要包括: 指紋掃描、視網膜掃描和虹膜掃描、語音識別、面部識別等。生物統計因子不會被丟失或竊取, 或者被遺忘, 然而, 它容易出現個人身體屬性的誤拒絕、個人身體屬性的誤接受和無法登記個人的身體屬性。目前要使用生物統計學認證, 一是技術還不夠成熟, 二是太昂貴, 這也將影響數字簽名的推廣。
六:總結
數字簽名技術應用領域日益廣泛,是當前信息安全技術研究的熱點。本文首先從數字簽名的概念、分類、原理,以及其應用過程中可能遇到的問題等方面做了詳細論述。然后介紹了目前這項技術研究的熱點和新的發展方向。由于許多領域對數字簽名技術提出了新的應用需求,在未來的信息領域中這一技術仍有著廣闊的發展前景。
參考文獻
[1]趙翔.數字簽名綜述[J].計算機工程與設計.2006.[2] StallingsW.密碼編碼與網絡安全: 原理與實踐[M ].北京: 電子工業出版社, 2001.239~ 241 [3] 洪 琳, 李 展.數字簽名、數字信封和數字證書[ J ].計算機應用, 2000, 20(2): 21~ 22 [4] Garm s J , Somerfield D.J ava 安全性編程指南[M ].北京: 電子工業出版社, 2002.136~ 169 [5] 劉智勇.智能交通控制理論及其應用[M].北京.科學出版社.2003 [6]邵質斌,尹四清,淺談數字簽名技術[D].山西:中北大學計算機科學與技術系,2006.[7]魚雙鍵,詳解數字簽名魚雙鍵[J].科技情報開發與經濟.2006.16(2):215-216.[8]趙翔,數字簽名綜述[J].計算機工程與設計.2006.27(2):195-197.[9]李明浩,吳智文.數字簽名面臨[D].福建: 廈門大學計算機科學系, 廣東: 廣東機電職業技術學院機電工程系.2005.[10] 范紅.數字簽名技術及其在網絡信息安全中的應用[J].中國科學院研究生院學報, 2001,18(2):4.[11]劉淵.網上在線支付數字簽名的研究與設計[J ].計算機應用研究,2003(11):110-112.
第二篇:PDF數字簽名
制做PDF文件電子簽名的方法
1、在一張白紙上寫一個您最得意的簽名,并掃描或用數碼像機將簽名轉為圖片文件;
2、用photoshop打開上面做好的簽名圖片文件,裁切成剛好能容納您簽名的大小,并 去掉圖片的背景顏色(方法詳見后附),將處理好的圖片另存為.GIF 圖片格式文件待用;
3、打開Adobe Acrobat 9 Pro(本制做方法適用于Adobe Acrobat 9 Pro 版本,其它 版本請做相應調整),任意新建一個PDF文件;
4、點擊Adobe Acrobat 9 Pro 工具欄中的“簽名”—“放置簽名”,并用鼠標在新建的 那個PDF文件中畫一個長方形的簽名區(名字相簽多大就畫多大);
5、在隨后彈出的窗口中選擇“我要立即創建新的數字簽名”,并點“下一步”;
6、在下一個窗口選擇“新建PKCS#12數字身份證文件”,并點“下一步”;
7、在彈出的新窗口中輸入“姓名”、“部門”,“單位名稱”,“電子郵件地址”(以上這些 都只能輸英文或拼音,不支持漢字);然后選擇國家并點“下一步”;
8、在接下來彈出的窗口中選擇電子簽名文件制做好后要存放的文件夾,輸入并確認您 以后簽名時驗證身份要用的密碼;最后點擊“完成”
9、在“簽名文檔”窗口中的“簽名為:”檔中選擇“新建ID”,在“外觀(A):”欄選擇 “創建新外觀?”;
10、彈出的“配置簽名外觀”窗口中的標題欄輸入這類簽名的標識,例:“無日期簽名” 等等;在“配置圖形”--“顯示:”中選擇“導入的圖形(I)”并點擊“文件(F)?”;從“選擇圖片”窗口的“瀏覽(B)?”中找到第2步制做好的圖片文件并點“確定”返回;這時您就可以“配置簽名外觀”窗口的“預覽”欄中看見您手寫的簽名了;您也會看到,除了您的簽名外,它后面還跟著一些其它信息;這些信息是通過“配置文本”-“顯示:”后面的選擇項來控制的,您可以根據您的簽名需要選擇;
11、至此,點“確定”后,您的電子簽名就算制做完成了,以后在簽名時,只需重復第 4步并輸入密碼就OK了!
12、如果需要在簽名時同時輸入簽名“原因”,就需要在“配置簽名外觀”窗口的“配 置文本”選項中勾選上“原因”,點擊“確定”完成電子簽名制做后,再在“編輯”菜單欄選擇“首選項”—“種類”—“安全性”—“高級首選項”—“創建”標簽中勾選“簽名時顯示原因”。這樣,以后簽名時就可以輸入您的簽名“意見”(原因)了;
13、如果您對剛才制做的這個簽名不滿意,可以在Adobe Acrobat 9 Pro 工具欄中的“高 級”—“安全性設置”,中刪除這個數字身份證;如果你想對制做好的簽名做一個備份,以后電腦系統重裝后可以直接導入使用,您也可以在這個窗口中將您制做好的“數字身份證”導出保存。
14、對于您不滿意的簽名外觀,可以在“編輯”菜單欄選擇“首選項”—“種類”—“安 全性”—“外觀”欄中進行“編緝”或“刪除”;也可以在此處應用“新建”按鈕直
名人堂:眾名人帶你感受他們的驅動人生馬云任志強李嘉誠柳傳志史玉柱
接創建一個新的簽名外觀。
15、修改簽名密碼:運行Adobe Acrobat 9 Pro,依次點擊菜單欄中的“高級”—“安 全性設置”—“數字身份證文件”,再點擊右側最上面一行中的“更改口令”就可更改您簽名時要輸入的密碼了!
第三篇:白話數字簽名
白話數字簽名
由于數字簽名基于非對稱加密技術,所以我們需要先啰嗦一下對稱加密和非對稱加密技術。
對稱加密
何謂加密?加密是一種“把數據搞亂掉”的技術。加密技術涉及到4種東東:
明文:可以被人或程序識別的數據。例如一個文本文件、一段歌詞、一個Word文檔、一首MP3、一個圖片文件、一段視頻等等。
加密算法:將數據搞亂掉的方法。
密鑰(密碼):一個你在進行加密操作時給出的字符串,讓加密算法不但把明文“搞亂掉”,而且要亂得“與眾不同”。這樣即使別人搞到了解密算法,如果沒有當初加密時所使用的密碼,一樣無法進行解密操作。
密文:明文被加密算法和密鑰加密后的結果。它看上去就是一堆亂碼,沒有人或程序能知道它到底表示什么信息。
作為加密的一個實例,我將使用由我杜撰的“景氏替換加密算法”演示一下加密過程。明文:good good study, day day up.密鑰:google
景氏替換加密算法:將明文中的所有的字母“d”替換成密鑰。
密文:將“good good study, day day up.”中的所有字母“d”替換成“google”,就得到密文“googoogle googoogle stugoogley,googleay googleay up.”。這個密文亂得還可以吧?一般人看了肯定不知道它是什么意思。
那么什么是解密呢?解密就是把密文再變回明文的過程。
例如“景氏替換解密算法”就是:將密文中所有與密鑰相同的字符串替換成“d”。密文:googoogle googoogle stugoogley,googleay googleay up.密鑰:google
景氏替換解密算法:將密文中所有與密鑰相同的字符串替換成“d”。
明文:將“googoogle googoogle stugoogley,googleay googleay up.”中的所有“google”替換成“d”,就得到了明文“good good study, day day up.”。
您肯定已經注意到了,我們在進行加密和解密時使用的密鑰必須是相同的,例如在上例中,加密和解密都必須使用相同的密鑰“google”。所以像“景氏替換加密算法”這種就被稱為對稱加密算法。目前最為流行的對稱加密算法是DES和AES,此外,對稱加密算法還有IDEA、FEAL、LOKI、Lucifer、RC2、RC4、RC5、Blow fish、GOST、CAST、SAFER、SEAL等。WinRAR的文件加密功能就是使用的AES加密算法。
非對稱加密
非對稱加密算法是一類與眾不同的加密算法,它的密鑰不是1個,而是2個(一對),我們先姑且稱它們為密鑰K1和密鑰K2。非對稱加密算法的特點是,如果用密鑰K1進行加密,則有且僅有密鑰K2能進行解密;反之,如果使用密鑰K2進行了加密,則有且僅有密鑰K1能進行解密。注意“有且僅有”的意思——如果用密鑰K1進行了加密,是不能用密鑰K1
進行解密的;同樣,如果用密鑰K2進行了加密,也無法用密鑰K2進行解密。這是一個非常重要的特性,至于如何在實際中運用這個特性,請看下文。
我想給Clark傳送一個AV小電影,又怕被他的老婆發現......話說俺得了一個很不錯的AV小電影,想通過網絡傳送給Clark,可是又怕被他的老婆發現(因為Clark的老婆是一個超級黑客,她可以使用sniffer技術截獲任何通過網線傳送給Clark的數據。別跟我說用VPN,它超出了本文討論的范圍),怎么辦呢?對了,我們需要一個“將數據搞亂掉”的技術——加密技術。我先使用WinRAR對小電影進行壓縮,然后加上密碼“TswcbyyqjsjhfL”(還記得么?WinRAR的文件加密功能使用的是叫作AES的對稱加密算法)。接著,將這個加密后的文件通過QQ傳送給Clark。然后,興沖沖地撥打Clark的手機: “喂?Clark么?好久不見,呵呵......我給你發了個好東東呦,在QQ上,收到沒?......密碼是TswcbyyqjsjhfL,對,就是天生我才必有用,千金散盡還復來的首字母,第一個和最后一個字母要大寫呦......”
可是,Clark,我是真的不知道你的老婆大人剛剛就在你的身邊呀!而且你也知道,我打電話從來都是喜歡很大聲的......嗚嗚嗚......在Clark跪了一夜的搓衣板之后,我們都明白:如果是已經保存在自己硬盤上的文件,使用對稱加密技術進行加密是沒有問題的;如果是兩個人通過網絡傳輸文件,使用對稱加密就很危險——因為在傳送密文的同時,還必須傳送解密密鑰。我們需要一個與眾不同的加密算法,一個不需要傳遞解密密鑰的加密算法。非對稱加密正好可以滿足我們的需要。基本思路是這樣的:首先,生成一對滿足非對稱加密要求的密鑰對(密鑰K1和密鑰K2)。然后,將密鑰K1公布在網上,任何人都可以下載它,我們稱這個已經公開的密鑰K1為公鑰;密鑰K2自己留著,不讓任何人知道,我們稱這個只有自己知道的密鑰K2為私鑰。當我想給Clark傳送小電影時,我可以用Clark的公鑰對小電影進行加密,之后這個密文就連我也無法解密了。這個世界上只有一個人能將密文解密,這個人就是擁有私鑰的Clark。
后來......后來,Clark痛定思痛,決定申請一個數字證書。流程是這樣的:首先,登錄當地的數字證書認證中心網站,填表->出示個人有效證件原件和復印件->繳費->等待數字證書認證中心制作數字證書->領取數字證書。如果您的公司需要申請大量的數字證書,還可以與認證中心的銷售人員商量,先領取免費的試用版的數字證書供技術人員試用。
后來的后來,我又得到了一本電子版的不良漫畫,當然,我又想到了Clark。我先在數字證書認證中心下載了Clark的公鑰證書(就是一個含有公鑰信息的文件),使用非對稱加密算法對不良漫畫進行加密,再將密文通過QQ傳送給Clark。然后,我興沖沖地撥打Clark的手機: “喂?Clark么?好久不見,呵呵......我給你發了個好東東呦,在QQ上,收到沒?......已經用你的公鑰加密了。用你的私鑰解密就行了^_^”
Clark興沖沖地插入他的私鑰(忘了說了,私鑰并不是一個文件,而是一個USB設備,外形就跟U盤一樣,至于為什么要這樣,下一篇再說),解密,然后開始看漫畫,完全沒察覺他的老婆大人就在身后......Clark,俺這個月手頭有點緊......唉,這個月買了太多的書,到月底揭不開鍋了。正巧在QQ上遇到了Clark:
1-2-3:“Clark,我需要200兩紋銀,能否借給我?”
Clark:“沒問題。我這就給你轉賬。請給我一張借條。”
1-2-3:“太謝謝了,我這就用Word寫一個借條給你。”
然后,我新建一個Word文檔,寫好借條,存盤。然后,然后怎么辦呢?我不能直接把借條發送給Clark,原因有:
1.我無法保證Clark不會在收到借條后將“紋銀200兩”改為“紋銀2000兩”。
2.如果我賴賬,Clark無法證明這個借條就是我寫的。
3.普通的Word文檔不能作為打官司的證據。
好在我早就申請了數字證書。我先用我的私鑰對借條進行加密,然后將加密后的密文用QQ發送給Clark。Clark收到了借條的密文后,在數字證書認證中心的網站上下載我的公鑰,然后使用我的公鑰將密文解密,發現確實寫的是“借紋銀200兩”,Clark就可以把銀子放心的借給我了,我也不會擔心Clark會篡改我的借條,原因是:
1.由于我發給Clark的是密文,Clark無法進行修改。Clark倒是可以修改解密后的借條,但是Clark沒有我的私鑰,沒法模仿我對借條進行加密。這就叫防篡改。
2.由于用我的私鑰進行加密的借條,有且只有我的公鑰可以解密。反過來講,能用我的公鑰解密的借條,一定是使用我的私鑰加密的,而只有我才擁有我的私鑰,這樣Clark就可以證明這個借條就是我寫的。這就叫防抵賴。
3.如果我一直賴著不還錢,Clark把我告上了法庭,這個用我的私鑰加密過的Word文檔就可以當作程堂證供。因為我國已經出臺了《中華人民共和國電子簽名法》,使數字簽名具有了法律效力。
您一定已經注意到了,這個使用我的私鑰進行了加密的借條,具有了防篡改、防抵賴的特性,并且可以作為程堂證供,就跟我對這個借條進行了“簽名”的效果是一樣的。對了,“使用我的私鑰對借條進行加密”的過程就叫做數字簽名。(由于數字簽名算法的速度比較慢,所以在實際對文件簽名的過程比上面提到的方法稍稍復雜一些,這個在下一篇再講)。
我是1-2-3,我真的是1-2-3,我是真的1-2-
3正如您已經知道的,Clark的老婆是一名超級黑客——就是傳說中能用計算機作任何事的人。這不,不久前她就輕松入侵了QQ數據庫,下載了Clark的所有好友的ID和密碼以及聊天記錄。然后,時不時地偽裝成Clark的好友跟Clark聊天,搞得Clark最近總是神經兮兮、疑神疑鬼的。這不,昨天我在QQ上遇到了Clark:
1-2-3:“Clark,最近還好吧?我又搞到一個好東東呦,要不要?”
Clark:“48475bbt556”
Clark并不是瘋掉了,那個“48475bbt556”也不是我跟Clark之間的什么通關暗語。這個“48475bbt556”就是Clark在鍵盤上胡亂敲上去的,不過,我卻知道Clark是什么意思。我立刻把“48475bbt556”粘貼到Word里,然后用我的私鑰對這個Word文檔加密,再將這個Word文檔發送給Clark。Clark在那邊用我的公鑰將Word文檔解密,打開,發現里面寫的就是“48475bbt556”,就知道QQ這邊的確就是真正的我本人了。因為擁有我的私鑰的人在這個世界上就只有我一人而已,Clark的老婆大人就是再神通廣大也模仿不了,這就是數字簽名的驗證功能。
順便提一句,不但人可以申請數字證書,設備(例如Web服務器)也可以申請數字證書(叫作設備證書)。利用數字簽名的驗證功能,就可以驗證服務器的身份了,這可是防釣魚的終極解決方案呦。
第四篇:數字簽名課程設計
數字簽名的目的和意義
RSA公開密鑰加密算法自20世紀70年代提出以來,已經得到了廣泛認可和應用。發展至今,電子安全領域的各方面已經形成了較為完備的國際規范。RSA作為最重要的公開密鑰算法,在各領域的應用數不勝數。RSA在硬件方面,以技術成熟的IC應用于各種消費類電子產品。
RSA在軟件方面的應用,主要集中在Internet上。加密連接、數字簽名和數字證書的核心算法廣泛使用RSA。日常應用中,有比較著名的工具包Open SSL(SSL,Security Socket Layer,是一個安全傳輸協議,在Internet上進行數據保護和身份確認。Open SSL是一個開放源代碼的實現了SSL及相關加密技術的軟件包,由加拿大的Eric Yang等發起編寫的。Open SSL應用RSA實現簽名和密鑰交換,已經在各種操作系統得到非常廣泛的應用。另外,家喻戶曉的IE瀏覽器,自然也實現了SSL協議,集成了使用RSA技術的加密功能,結合MD5和SHA1,主要用于數字證書和數字簽名,對于習慣于使用網上購物和網上銀行的用戶來說,幾乎天天都在使用RSA技術。
RSA更出現在要求高度安全穩定的企業級商務應用中。在當今的企業級商務應用中,不得不提及使用最廣泛的平臺j2ee。事實上,在j2se的標準庫中,就為安全和加密服務提供了兩組API:JCA和JCE。JCA(Java Cryptography Architecture)提供基本的加密框架,如證書、數字簽名、報文摘要和密鑰對產生器; JCA由幾個實現了基本的加密技術功能的類和接口組成,其中最主要的是java.security包,此軟件包包含的是一組核心的類和接口,Java中數字簽名的方法就集中在此軟件包中。JCE(Java Cryptography Extension)在JCA的基礎上作了擴展,JCE也是由幾個軟件包組成,其中最主要的是javax.crypto包,此軟件包提供了JCE加密技術操作API。javax.crypto中的Cipher類用于具體的加密和解密。在上述軟件包的實現中,集成了應用RSA算法的各種數據加密規范(RSA算法應用規范介紹參見: http://www.tmdps.cn/rsalabs/node.asp?id=2146,這些API內部支持的算法不僅僅只有RSA,但是RSA是數字簽名和證書中最常用的),用戶程序可以直接使用java標準庫中提供的API進行數字簽名和證書的各種操作。
2.數字簽名算法的基本框架 1.密鑰的產生
①選擇兩個保密的大素數P和q。②計算N=p q,≯(N)=(p-1)(g-1),其中≯(N)是N的歐拉函數值。③選擇一個整數e,滿足l ⑤以(e, n)為公鑰,(d ,N)為密鑰,銷毀p,q,≯(N)。2.加密 加密時首先將明文比特串進行分組,使得每個分組對應得串在數值上小于N,即分組的二進制長度小于l092N。然后,對每個明文分組M,作加密運算: C=E k(M)=M e mod N 3.解密 對密文分組的解密運算為: M=D k(C)=C d mod N 由定理1和定理2可以證明解密運算能恢復明文M 并非所有的公開密鑰系統,均可同時達到秘密性與數字簽名功能。一般而言,一公開密鑰系統若作為密碼系統,則無法作為數字簽名,反之亦然。只有很少數 的系統可同時作為密碼系統和數字簽名,如本文討論的RSA系統。RSA簽名算 法如下: 設N=p q,且p和q是兩個大素數,e和d滿足e d≡l(mod ≯(N))。公開密鑰:N,e 私有密鑰:d 簽名過程:發送方使用自己的私鑰d對明文m進行數字簽名變換: y=x d mod N:并將加密后的消息和簽名y發送給接收方; 驗證過程:接收方使用發送方的公鑰e對收到的消息y進行數字簽名驗證變換x’=ye mod N,并使用發送方的密鑰解密恢復消息x,比較x’與x,如果x’=x則證實發送方的身份合法。 這樣,用戶A若想用RSA簽名方案對消息x簽名,他只需公開他的公鑰N和e,由于簽名算法是保密的,因此A是唯一能產生簽名的人,任何要驗證用戶A 簽名的用戶只需查到A的公鑰即可驗證簽名。對于實現簽名和公鑰加密的組合,常用方法是:假定通信雙方為A和B。對于明文x,A計算他的簽名y=x d mod N,然后利用B的公開加密函數EB對信息對(x, y)加密得到Z,將密文Z傳送給B,當B收到密文Z后,他首先用他的解密函數DB來解密得到(x,y)=DB(Z)= DB(EB(x,y)),然后利用A的驗證算法來檢查x’=x=y e mod N是否成立。 3.主要模塊的算法以及關鍵代碼 ①.文件選擇模塊的主要算法及關鍵代碼 CfileDialog dlg(TRUE,NULL,“.簽名的文件”,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()==IDOK){ m_file_sign=dlg.GetPathName();} else m_file_sign=“";UpdateData(FALSE);②.保存公鑰的文件路徑的主要算法及關鍵代碼 CFileDialog dlg(FALSE,NULL,”.公鑰“,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()==IDOK){ m_pkey_sign=dlg.GetPathName();} else m_pkey_sign=”“;UpdateData(FALSE);③.保存簽名后的文件的路徑主要算法及關鍵代碼 CFileDialog dlg(FALSE,NULL,”.簽名后的文件“,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);if(dlg.DoModal()==IDOK){ m_signed_sign=dlg.GetPathName();} else m_signed_sign=”“;UpdateData(FALSE);④.數字簽名的主要算法及關鍵代碼 HCRYPTPROV hProv;//秘鑰容器句柄 BYTE *pbBuffer;//被簽名的數據 HCRYPTHASH hHash;HCRYPTKEY hKey;BYTE *pbKeyBlob; //簽名者得公鑰數據 BYTE *pbSignature; //數字簽名 DWORD dwSigLen;DWORD dwBlobLen;DWORD dwBufferLen;LPTSTR szDescription = ”“; CFile m_pubkey_file,m_sign_file,m_signdatafile;if(m_pkey_sign==”“||!m_pubkey_file.Open(m_pkey_sign,CFile::modeCreate|CFile::modeReadWrite)){ MessageBox(”請選擇正確的保存公鑰的文件路徑“);return;} if(m_file_sign==”“||!m_signdatafile.Open(m_file_sign,CFile::modeReadWrite)){ MessageBox(”請選擇正確的文件路徑“);return;} if(m_signed_sign==”“||!m_sign_file.Open(m_signed_sign,CFile::modeCreate|CFile::modeReadWrite)){ MessageBox(”請選擇正確保存數字簽名的文件路徑“);return;} UpdateData(TRUE);m_state_sign=”“;//獲取缺省的秘鑰容器 if(CryptAcquireContext(&hProv,NULL,NULL,m_prov_sign,0)){ m_state_sign+=”已獲取CSP上下文,秘鑰生成算法:“+GetProvType(m_prov_sign)+”n“;} else //密鑰容器不存在創建之 { if(CryptAcquireContext(&hProv,NULL,NULL,m_prov_sign,CRYPT_NEWKEYSET)) m_state_sign+=”已創建一個新的密鑰容器,秘鑰生成算法:“+GetProvType(m_prov_sign)+”n“; else { m_state_sign+=MyHandleError(”在獲取CSP時發生錯誤,程序停止.“);UpdateData(FALSE);return;} } // 從密鑰容器中取數字簽名用的密鑰 if(CryptGetUserKey(hProv,AT_SIGNATURE,&hKey)) m_state_sign+=”簽名密鑰已經獲取.n“;else { if(GetLastError()== NTE_NO_KEY)//密鑰容器里不存在signature key pair創建之 { if(CryptGenKey(hProv,//CSP句柄 AT_SIGNATURE, //創建的密鑰對類型為signature key pair 0, //key類型,這里用默認值 &hKey)) //創建成功返回新創建的密鑰對的句柄 m_state_sign+=”創建一個秘鑰對n“; else { m_state_sign+=MyHandleError(”在創建簽名密鑰對時發生錯誤,程序停止.n“);UpdateData(FALSE);return;} } else { m_state_sign+=MyHandleError(”在獲取簽名密鑰時發生錯誤,程序停止.“);UpdateData(FALSE);return; } } // 因為接收消息者要驗證數字簽名,所以要導出公鑰給接收者。 if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,&dwBlobLen))//得到公鑰的大小 m_state_sign+=”已獲取公鑰的大小,“;else { m_state_sign+=MyHandleError(”計算公鑰大小時發生錯誤,程序停止.“);UpdateData(FALSE);return;} // 為存儲公鑰的緩沖區分配內存。 if((pbKeyBlob =(BYTE*)malloc(dwBlobLen))) m_state_sign+=”已為公鑰分配內存n“;else { m_state_sign+=MyHandleError(”為公鑰分配內存時出現異常,退出.n“);UpdateData(FALSE);return;} // 真正導出公鑰數據 if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbKeyBlob,//公鑰 這個數據可以存入文件,發送給接收者。一般被存入數字證書 &dwBlobLen)){ m_pubkey_file.Write(pbKeyBlob,dwBlobLen); m_state_sign+=”已導出公鑰,存儲在“+m_pubkey_file.GetFilePath()+”n“;} else { m_state_sign+=MyHandleError(”導出公鑰時發生錯誤,退出“);UpdateData(FALSE);return;} // 創建hash對象 if(CryptCreateHash(hProv,m_hash_sign,//CALG_MD5,0,0,&hHash)){ m_state_sign+=”已創建hash對象,加密算法“+GetHashType(m_hash_sign)+”nn“;} else { m_state_sign+=MyHandleError(”在創建hash對象時發生錯誤,退出“);UpdateData(FALSE);return;} //把簽名的數據讀入內存 //分配空間 if((pbBuffer=(BYTE *)malloc(m_signdatafile.GetLength()))) m_state_sign+=”已經為數據“+m_signdatafile.GetFilePath()+”分配空間nn“;else { m_state_sign+=MyHandleError(”為數據分配內存時發生異常,退出“);UpdateData(FALSE);return;} if(m_signdatafile.Read(pbBuffer,m_signdatafile.GetLength()))//把數據讀入內存 m_state_sign+=”數據已經讀入內存!“;else {m_state_sign+=MyHandleError(”數據讀入內存發生錯誤,退出“);UpdateData(FALSE);return;} dwBufferLen = m_signdatafile.GetLength();// 對數據進行hash運算 if(CryptHashData(hHash,pbBuffer,dwBufferLen,0)) m_state_sign+=”已對數據進行hash運算n“;else { m_state_sign+=MyHandleError(”在對數據進行hash運算時發生錯誤,退出.“);UpdateData(FALSE);return;} // 使用signature key pair的私鑰對hash數據簽名 dwSigLen= 0;if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,NULL,&dwSigLen))//得到數字簽名大小 m_state_sign+=”已獲取數字簽名的大小,“;else { m_state_sign+=MyHandleError(”計算數字簽名大小時發生錯誤,退出.“);UpdateData(FALSE);return;} // 為數字簽名緩沖區分配內存 if((pbSignature =(BYTE *)malloc(dwSigLen))) m_state_sign+=”已為數字簽名分配緩沖n“;else { m_state_sign+=MyHandleError(”為數字簽名分配內存時異常,退出.“);UpdateData(FALSE);return;} // 得到數字簽名 if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,pbSignature, //這里將返回數字簽名,同被簽名的數據一起發送給接收方 &dwSigLen)) { m_sign_file.Write(pbSignature,dwSigLen); m_state_sign+=”已導出數字簽名,存儲在“+m_sign_file.GetFilePath()+”nn“;} else { m_state_sign+=MyHandleError(”導出數字簽名時發生異常,退出.“);UpdateData(FALSE);return;} // 銷毀hash對象.if(hHash){ CryptDestroyHash(hHash); m_state_sign+=”銷毀hash對象nn“;} m_state_sign+=”數字簽名成功nn“;//關閉文件 m_pubkey_file.Close(),m_sign_file.Close(),m_signdatafile.Close(MessageBox(”數字簽名成功!“,”“,MB_OK);UpdateData(FALSE);⑤.數字簽名認證的主要算法及關鍵代碼 HCRYPTPROV hProv;HCRYPTKEY hPubKey;BYTE *pbKeyBlob;DWORD dwBlobLen;HCRYPTHASH hHash;BYTE *pbSignature; //數字簽名 DWORD dwSigLen;LPTSTR szDescription = ”“;UpdateData(TRUE);m_state_veri=”“;// 獲得CSP句柄,密鑰容器名為登陸用戶名 if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0)){ m_state_veri+=”已獲取CSP,秘鑰生成算法:);“+GetProvType(m_prov_veri)+”n“;} else //密鑰容器不存在創建之 { if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) m_state_veri+=”已創建一個新的密鑰容器秘鑰生成算法:“+GetProvType(m_prov_veri)+”n“; else { m_state_veri+=MyHandleError2(”在獲取密鑰容器時發生錯誤,退出n“);UpdateData(FALSE);return;} } CFile signdatafile,yuanwenfile,pubkeyfile;if(m_pkey_veri==”“||!pubkeyfile.Open(m_pkey_veri,CFile::modeReadWrite)){ MessageBox(”請選擇正確的公鑰文件!“);return;} if(m_file_veri==”“||!yuanwenfile.Open(m_file_veri,CFile::modeReadWrite)){ MessageBox(”請選擇正確的原文件!“);return;} if(m_signed_veri==”“||!signdatafile.Open(m_signed_veri,CFile::modeReadWrite)){ MessageBox(”請選擇正確的簽名文件!“);return;} dwBlobLen=pubkeyfile.GetLength();pbKeyBlob=(BYTE *)malloc(dwBlobLen);pubkeyfile.Read(pbKeyBlob,dwBlobLen);if(CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey)) m_state_veri+=”公鑰已經成功導入!nn“;else { m_state_veri+=MyHandleError2(”公鑰導出出錯.n“);UpdateData(FALSE);return;} // 創建哈希對象 if(CryptCreateHash(hProv,m_hash_veri,//CALG_MD5,0,0,&hHash)) m_state_veri+=”已經獲取hash對象,hash算法“+GetHashType(m_hash_veri)+”nn“;else { m_state_veri+=MyHandleError2(”創建hash對象時出錯,退出“);UpdateData(FALSE);return;} // 跟生成時一樣對數據進行hash運算 BYTE *pbBuffer;pbBuffer=(BYTE *)malloc(yuanwenfile.GetLength());yuanwenfile.Read(pbBuffer,yuanwenfile.GetLength());DWORD dwBufferLen = yuanwenfile.GetLength();pbSignature=(BYTE *)malloc(signdatafile.GetLength());signdatafile.Read(pbSignature,signdatafile.GetLength());dwSigLen = signdatafile.GetLength();if(CryptHashData(hHash,pbBuffer,dwBufferLen,0)) m_state_veri+=”對數據hash運算成功!nn“;else { m_state_veri+=MyHandleError2(”對數據進行hash運算出錯,退出“);UpdateData(FALSE);return;} // 驗證數字簽名 if(CryptVerifySignature(hHash,pbSignature, //數字簽名數據 dwSigLen,hPubKey, //簽名者的公鑰 szDescription,0)) { MessageBox(”恭喜:是正確的數字簽名!“); m_state_veri+=”恭喜:是正確的數字簽名!“;} else { MessageBox(”錯誤:簽名是錯誤的n“); m_state_veri+=”錯誤:簽名是錯誤的n請檢查參數是否設置正確,若正確則請聯系發送方";} UpdateData(FALSE);//------ // Free memory to be used to store signature.if(pbSignature)free(pbSignature);if(pbKeyBlob)free(pbKeyBlob);// Destroy the hash object.if(hHash) CryptDestroyHash(hHash);// Release the provider handle.if(hProv) CryptReleaseContext(hProv, 0);signdatafile.Close(),yuanwenfile.Close(),pubkeyfile.Close();4.RSA數字簽名算法運行情況: 4.1 主界面初始化 4.2 簽名界面 4.3 設置密鑰 4.4 選擇簽名文件 4.5 選擇保存公鑰位置 4.6 選擇選擇簽名后保存位置 4.6 進行數字簽名結果 4.7 進行數字簽名認證 4.8 進行數字簽名認證結果 5.總結與展望: 通過本次對RSA算法的學習,明白了該算法加密解密的原理,以及他的安全性問題和缺點,通過這幾周的實驗,在學習中累計經驗解決問題,讓我對RSA算法有了較通透的理解,受益匪淺。隨著Internet的發展,實現電子商務是未來的潮流和趨勢,基于Internet開放環境下的信息安全將越來越受到重視,而RSA算法在身份認證,數字簽名,信息加密等方面得到非常廣泛的應用,對它作深入的了解是很有必要的。雖然RSA算法可靠性較高,但是還是有一些缺陷,就是運算量太大,速度太慢,適合加密比較短的明文。RSA方法既可用于保密,也可用于簽名和認證,目前已經廣泛應用與各種產品,平臺等軟件上。許多流行的操作系統上如微軟,Apple,Sun和Novell都是在其產品上融入RSA。在硬件上,如安全電話,以太網和智能卡都使用了RSA技術。而且幾乎所有Internet安全協議如S/MIME,SSL和S/WAN都引入了RSA加密方法。ISO9796標準把RSA列為一種兼容的加密算法。可以預見,在不遠的幾年內,RSA的 應用將來會越來越廣泛。 數字簽名及安全電子郵件 一、背景知識 使用個人證書,在電子郵件中至少有以下功能。 保密性:你可以使用收件人的數字證書對電子郵件進行加密。這樣,只有收件人的私鑰才能解密這封郵件,即使第三方截獲郵件,由于沒有收件人的私鑰,也無法閱讀該郵件。當然,要發送加密電子郵件,必須先擁有對方的數字證書。 認證身份:你可以使用你本人的數字證書對電子郵件進行數字簽名,這樣,收件人通過驗證簽名就可以確定你的身份,而不是他人冒充的。 完整性:如果驗證數字簽名有效,收件人不僅可以認證你的身份,還可以確信收到的郵件在傳遞的過程中沒有被篡改。 不可否認性:數字簽名要使用你本人數字證書中的私鑰,而私鑰僅你個人所有,所以,你不能對發送過的簽名郵件進行否認。 1、電子郵件的重要性 由于越來越多的人通過電子郵件發送機密信息,因此確保電子郵件中發送的文檔不是偽造的變得日趨重要。同時保證所發送的郵件不被除收件人以外的其他人截取和偷閱也同樣重要。 通過使用 Outlook Express 和 Foxmail,可以在電子事務中證明身份,就象兌付支票時要出示有效證件一樣。也可以使用數字證書來加密郵件以保護郵件的保密性。數字證書結合了 S/MIME 規范來確保電子郵件的安全。 2、對電子郵件進行數字簽名 對電子郵件進行數字簽名,能夠確保電子郵件中發送的文檔不是偽造的,即收件人能夠確信該郵件來自于其聲稱的發件人,同時郵件從發件人的機器傳達到接收人的機器沒有經過任何改動。 當發件人在待發郵件中添加數字簽名時,發件人就在郵件中加入了數字簽名和自己的數字證書。郵件的接收方接收到該郵件后,首先判斷發件人的證書是否有效(該證書是否是可信任的CA簽發的,該證書是否在有效期內,該證書是否已經被撤銷),如果證書有效,從發件人的證書中提取公鑰信息,來驗證郵件的數字簽名是否有效。 3、對電子郵件進行加密 對電子郵件進行加密(使用接收人的數字證書中的公鑰進行加密)可以保證所發送的郵件不被除收件人以外的其他人截取和偷閱。 當發件人對郵件進行加密時,使用接收人的數字證書中的公鑰對郵件進行加密。郵件的接收方接收到該郵件后,使用自己的私鑰對郵件進行解密,可以得到郵件的明文。因為使用公鑰加密的數據,只有對應的私鑰才可以解密,而對一封加密郵件來說,只有接收人才具有對應的私鑰,也就是只有接收人才可以對郵件解密得到郵件的明文。其他任何人截獲了該郵件都是無法識別的亂碼。有效的保證了郵件內容的保密性。 4、電子郵件證書使用的簡易性 如果接收到有問題的安全郵件,例如郵件已被篡改或發件人的數字證書已過期,則在被允許閱讀郵件內容前,會看到一條安全警告,它詳細說明了問題所在。根據警告中的信息,接收人可以決定是否查看郵件。 以上所述的簽名和加密郵件的過程都是由郵件客戶端程序(如Microsoft Outlook,Foxmail、Netscape Messager等)來完成。對于郵件的發送人來說,就是在郵件發送之前,簡單的點擊“簽名”和“加密”按鈕就可以了;對于郵件的接收人來說,郵件接收到后,郵件客戶端程序更能夠自動對簽名郵件進行驗證,對加密郵件進行解密,并將驗證和解密結果顯示給郵件的接收人,不需要任何人工操作,非常方便。 5、安全電子郵件的工作方式 安全電子郵件的工作方式有兩種: 第一種情況是采用個人或單位證書發送安全電子郵件。如吉林省數字證書認證中心、廣東省數字證書認證中心等就頒發個人證書或單位證書,然后你可以選擇用這兩種證書發送安全的電子郵件。 第二種方式是直接給電子信箱的所有人或單位的電子信箱地址頒發數字證書,如江西省數字證書認證中心、安徽省數字認證中心等就頒發專門的郵件證書。 由于以上兩種方式的原理基本一樣,考慮到網上的免費資源,我們以第一種方式為主加以說明。 當然,在第一種方式中使用單位證書發送安全郵件的原理基本一樣,由于網上單位證書的免費資源很少,因此,我們重點以個人證書為例。另外,要發送安全電子郵件,必須使用一些電子郵件客戶端軟件,如Outlook Express、Foxmail等,打開網頁收發郵件是不能進行數字簽名的,我們這里以Outlook Express 5.0為例,說明安全電子郵件的發送過程。 二、實驗目的及要求 1、掌握用Outlook Express發送數字簽名電子郵件的方法。 2、掌握用Outlook Express發送加密電子郵件的方法。 三、實驗準備 1、上網計算機,IE5.0以上,Outlook Express 5.0以上。 2、已經申請好個人數字證書(本實驗以在廣東省數字證書認證中心申請的個人免費證書為例)。 四、實驗過程 1、修改電子郵件帳號屬性,綁定證書 (1)在Outlook Express5.0單擊“工具”菜單中的“帳號”,選取郵件選項卡中的用于發送安全電子郵件的郵件帳號,然后單擊“屬性”,選擇安全標簽,在簽名證書標識項后,點擊選擇按鈕,如圖9.1所示。 圖9.1 安全屬性 (2)選擇數字證書,如圖9.2、圖9.3所示。 圖9.2 選擇簽名證書 圖9.3 已經設置好簽名證書 3)如果希望對方能給你發送加密電子郵件,則點擊加密首選項,再選擇你的證書及算法,如圖9.4所示。 圖9.4 已經設置好簽名和加密數字證書 2、發送數字簽名電子郵件 (1)打開Outlook Express,點擊新郵件,輸入對方的郵件地址,并點擊“簽名”按鈕,然后點擊發送,如圖9.5所示。 圖9.5 撰寫數字簽名郵件 (2)對方用Outlook Express收到你的郵件后,首先顯示圖9.6所示提示。 圖9.6 收到數字簽名郵件 (3)點擊繼續,打開郵件,如圖9.7所示。 圖9.7 打開簽名郵件 3、發送加密電子郵件 (1)當用戶擁有了對方的數字證書,并添加到通訊薄中就可以向對方發送加密的電子郵件了,如圖9.8所示。 圖9.8 通訊簿中查看對方數字證書 (2)打開Outlook Express,點擊新郵件,輸入對方的郵件地址,并點擊“加密”按鈕,如圖9.9所示。 圖9.9 發送加密電子郵件 (3)對方用Outlook Express收到郵件后首先顯示圖9.10所示的提示。 圖9.10收到加密電子郵件 (4)點擊繼續,打開郵件,如圖9.11所示。 圖9.11 打開加密電子郵件 (5)如果你沒有對方的數字證書,是不能發送加密郵件的,如圖9.11、圖9.12所示。 圖9.11 無對方證書發送加密郵件 圖9.12 系統提示出錯 (6)當然,也可以發送同時加密和簽名的電子郵件,如圖9.13、圖9.14、圖9.15所示。 圖9.13 同時發送簽名和加密郵件 圖9.14 收到簽名和加密郵件 圖9.15 打開簽名和加密郵件 至此,我們已經完成了安全電子郵件的全部操作,即如何發送加密的和簽名的電子郵件,需要指出的是,有許多免費郵箱是在網頁下收發郵件的,在此情況下一般不能使用數字證書。 五、練習與思考 1、加密郵件與簽名郵件有什么區別? 2、隨著中華人民共和國電子簽名法的頒布實施,你認為簽名電子郵件具有法律效力嗎? 3、為什么發送加密郵件需要對方的數字證書?其加密原理是什么? 4、能用他人的證書發送簽名郵件嗎?為什么? 5、請用FOXMAIL設置簽名及加密郵件,比較與Outlook express的異同。第五篇:數字簽名及安全電子郵件