第一篇:數字簽名及安全電子郵件
數字簽名及安全電子郵件
一、背景知識
使用個人證書,在電子郵件中至少有以下功能。
保密性:你可以使用收件人的數字證書對電子郵件進行加密。這樣,只有收件人的私鑰才能解密這封郵件,即使第三方截獲郵件,由于沒有收件人的私鑰,也無法閱讀該郵件。當然,要發送加密電子郵件,必須先擁有對方的數字證書。
認證身份:你可以使用你本人的數字證書對電子郵件進行數字簽名,這樣,收件人通過驗證簽名就可以確定你的身份,而不是他人冒充的。
完整性:如果驗證數字簽名有效,收件人不僅可以認證你的身份,還可以確信收到的郵件在傳遞的過程中沒有被篡改。
不可否認性:數字簽名要使用你本人數字證書中的私鑰,而私鑰僅你個人所有,所以,你不能對發送過的簽名郵件進行否認。
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的異同。
第二篇: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:“沒問題。我這就給你轉賬。請給我一張借條?!?/p>
1-2-3:“太謝謝了,我這就用Word寫一個借條給你?!?/p>
然后,我新建一個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列為一種兼容的加密算法??梢灶A見,在不遠的幾年內,RSA的 應用將來會越來越廣泛。 數字簽名與哈希函數 懂得一點公鑰密碼基礎知識的人都知道,發信息的人用自己的私鑰對所發信息進行加密(Encryption),接收信息者用發信者的公鑰來解密(Decryption),就可以保證信息的真實性、完整性與不可否認性。(注:這里提到的加密、解密是指密碼運算,其目的并非信息保密。)那么,我們也可以籠統地說,以上方法就已經達到了數字簽名的目的。因為首先,私鑰是發信者唯一持有的,別的任何人不可能制造出這份密文來,所以可以相信這份密文以及對應的明文不是偽造的(當然,發信者身份的確定還要通過數字證書來保證);出于同樣原因,發信者也不能抵賴、否認自己曾經發過這份信息;另外,信息在傳輸當中不可能被篡改,因為如果有人試圖篡改,密文就解不出來。這樣,用私鑰加密,公鑰解密的技術方法就可以代替傳統簽名、蓋章,保證了信息的真實性、完整性與不可否認性。 但是,這樣做在實際使用中卻存在一個問題:要發的信息可能很長,非對稱密碼又比較復雜,運算量大,而為了保證安全,私鑰通常保存在USB Key或IC卡中,加密運算也是在Key或卡中進行。一般來說,小小的USB Key或IC卡中的微處理器都做得比較簡單而處理能力較弱,這樣,加密所用的時間就會很長而導致無法實用。 另外,即使對于網站服務器而言,雖然它的處理能力很強,但服務器要同時處理許許多多簽名加密的事情,也同樣存在著加密耗時長系統效率低的問題。 有沒有解決這個問題的辦法呢?有的,常用的方法是使用哈希函數。 什么是哈希函數 哈希(Hash)函數在中文中有很多譯名,有些人根據Hash的英文原意譯為“散列函數”或“雜湊函數”,有些人干脆把它音譯為“哈希函數”,還有些人根據Hash函數的功能譯為“壓縮函數”、“消息摘要函數”、“指紋函數”、“單向散列函數”等等。 1、Hash算法是把任意長度的輸入數據經過算法壓縮,輸出一個尺寸小了很多的固定長度的數據,即哈希值。哈希值也稱為輸入數據的數字指紋(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函數具備以下的性質: 2、給定輸入數據,很容易計算出它的哈希值; 3、反過來,給定哈希值,倒推出輸入數據則很難,計算上不可行。這就是哈希函數的單向性,在技術上稱為抗原像攻擊性; 4、給定哈希值,想要找出能夠產生同樣的哈希值的兩個不同的輸入數據,(這種情況稱為碰撞,Collision),這很難,計算上不可行,在技術上稱為抗碰撞攻擊性; 5、哈希值不表達任何關于輸入數據的信息。 哈希函數在實際中有多種應用,在信息安全領域中更受到重視。從哈希函數的特性,我們不難想象,我們可以在某些場合下,讓哈希值來“代表”信息本身。例如,檢驗哈希值是否發生改變,借以判斷信息本身是否發生了改變。` 怎樣構建數字簽名 好了,有了Hash函數,我們可以來構建真正實用的數字簽名了。 發信者在發信前使用哈希算法求出待發信息的數字摘要,然后用私鑰對這個數字摘要,而不是待發信息本身,進行加密而形成一段信息,這段信息稱為數字簽名。發信時將這個數字簽名信息附在待發信息后面,一起發送過去。收信者收到信息后,一方面用發信者的公鑰對數字簽名解密,得到一個摘要H;另一方面把收到的信息本身用哈希算法求出另一個摘要H’,再把H與H’相比較,看看兩者是否相同。根據哈希函數的特性,我們可以讓簡短的摘要來“代表”信息本身,如果兩個摘要H與H’完全符合,證明信息是完整的;如果不符合,就說明信息被人篡改了。 數字簽名也可以用在非通信,即離線的場合,同樣具有以上功能與特性。 由于摘要一般只有128位或160位比特,比信息本身要短許多倍,USB Key或IC卡中的微處理器對摘要進行加密就變得很容易,數字簽名的過程一般在一秒鐘內即可完成。 哈希函數的安全性 哈希函數的安全性直接關系到數字簽名的安全性,如果哈希函數被攻破,數字簽名的有效性就會受到質疑。 目前,已經發明的Hash函數有多種,如Snefru、N-Hash、LOKI、AR、GOST、MD、SHA等。它們在數學上實現的方法各有不同,安全性也各有不同。目前比較常用的Hash函數是MD5與SHA-1。MD5哈希函數以512位來處理輸入數據,每一分組又劃分為16個32位的子分組。算法的輸出由4個32位分組組成,將它們級聯起來,形成一個128位的固定長度的哈希值,即輸入數據的摘要。SHA-1哈希函數在MD4的基礎上增加了數學運算的復雜程度,即SHA=MD4+擴展轉換+附加輪+更好的雪崩效應(哈希值中,為0的比特與為1的比特,其總數應該大致相等;輸入數據中一個比特的變化,將導致哈希值中一半以上的比特變化,這就叫做雪崩效應)。SHA能夠產生160位的哈希值。對SHA還沒有已知的密碼攻擊,并且由于它產生的哈希值位數長于MD5,所以它能更有效地抵抗窮舉攻擊(包括生日攻擊)。 但是,任何一種算法都有其漏洞與局限性。任何一個哈希函數都會存在碰撞——即在一些特定情況下,兩個不同的文件或信息會指向同一個數字摘要。在一般情況下,類似碰撞只能盡可能地減少,而不能完全避免。從理論上講,沒有攻不破的密碼。隨著密碼科學的發展,也許會找到攻破某一種密碼算法的途徑。 評價Hash算法的一個最好方法是看敵手找到一對碰撞消息所花的代價有多高。一般地,假設攻擊者知道Hash算法,攻擊者的主要攻擊目標是找到一對或更多對碰撞消息。目前已有一些攻擊Hash算法與計算碰撞消息的方法。在這些方法中,有些是一般的方法,可用于攻擊任何類型的Hash算法,比如“生日攻擊”;而另一些是特殊的方法,只能用于攻擊某些特殊的Hash算法,比如適合于攻擊具有分組鏈結構Hash算法的“中間相遇攻擊”,適用于攻擊基于模運算的Hash函數的“修正分組攻擊”。堅固的哈希函數可通過設計有效的碰撞處理機制,或增加數字摘要的位數來增加復雜度,以減少碰撞出現的概率,2004年8月17日,在美國召開的國際密碼學會議(Crypto’ 2004)上,一些國家的密碼學者作了破譯Hash函數的新進展的報告,其中我國山東大學的王小云教授做了破譯MD5、HAVAL-128、MD4、與RIPE MD算法的報告。 到2005年2月,據王小云教授的研究報告,他們已經研究出了搜索SHA-1碰撞的一系列新技術。他們的分析表明,SHA-1的碰撞能在小于2^69次Hash操作中找到。對完整的80輪SHA-1的攻擊,這是第一次在小于2^80次Hash操作這個理論界限的情況下找到碰撞。根據他們的估計,對于縮減到70輪的SHA-1能夠用現在的超級計算機找出“實碰撞”。他們的研究方法,能自然地運用到SHA-0與縮減輪數的SHA-1的破譯分析上。 2005年3月6日,Arjen Lenstra,王小云,Benne de Weger 宣布,他們構造出一對基于MD5 Hash函數的X.509證書,產生了相同的簽名。他們提出了一種構造X.509證書的方法,在他們所構造出的證書對中,由于使用了MD5算法,簽名部分產生了碰撞。因此,當證書發布者使用MD5作為Hash函數時,發布者就會在證書中產生相同的簽名,導致PKI的基礎原理遭到可信性破壞。這意味著,從單獨某個證書無法確定是否存在另一個不同證書有著相同的簽名。由于第二個相同簽名證書存在的可能性,證書發布機構無法驗證私鑰的“擁有證明”,即無法驗證證書中的簽名。因此,使用“基于MD5函數”公鑰證書的任何一方都無法確保所謂的證書擁有者是否真實擁有相應的私鑰。 他們也想構造一對基于SHA-1的X.509證書,產生相同的簽名。然而,他們還做不到這一點。因為產生SHA-1碰撞還需要相當長一段時間的研究。 專家指出:A.Lenstra與王小云等人聲稱已經成功地構造了兩張符合X.509證書數據結構,擁有同樣簽名而內容卻不同的證書,但該構造方法對證書的部分域要有特殊安排,簽名算法RSA的密鑰也是按照特殊規律生成的,要用來攻擊某個實際應用的電子簽名系統仍需時日。而對于SHA-1算法,說其從理論上被破解都還為時過早,只能說其破解工作取得了重大突破,破解所需要運算次數已從原來設計時估算的2^80次降低為2^69次,這比窮舉法快了2048倍,但2^69次運算需要6000年左右的時間,在實際計算上仍然是不可行的。 除了運算方面的瓶頸外,哈希函數的不可逆性決定了攻擊者無法輕易得手,沒有人可以保證通過這個發現的每個碰撞都是“可用”的碰撞。在漫長的運算后,你得到的也許包含一些有價值的信息,也許就是理論上存在的單純碰撞,運算瓶頸與信息匱乏都會使黑客們的種種努力成為徒勞……據業內人士估計,在當前的技術條件下,2^50或2^ 60次運算量的范圍內的攻擊方法才會為我們帶來麻煩,即引發實際意義上的攻擊行為。在新研究成果發布前的一段時間內,SHA-1 算法只能被稱作不完美,但還是安全的?;赑KI技術進行電子簽名的最終用戶,目前還不用擔心自己的簽名被偽造或遭遇簽名人抵賴。 另外,安全專家強調:一種算法被破譯,與整個企業的安全系統被攻破,是兩個不同的概念。因為隨著攻擊技術與能力的提高,算法也會“水漲船高”,向前發展進步。王教授所取得的成就提醒密碼學家研究新的算法,提醒有關標準化機構要提前修改算法標準,也提醒有關CA與電子簽名產品開發商支持新的算法。當然,有些完全基于摘要算法的密押系統與電子貨幣系統,還需要盡早考慮替換方案。 美國國家技術與標準局(NIST)曾經發表如下評論:“研究結果說明SHA-1的安全性暫時沒有問題,但隨著技術的發展,技術與標準局計劃在2010年之前逐步淘汰SHA-1,換用其他更長更安全的算法(如:SHA-224, SHA-256, SHA-384與SHA-512)來代替?!?/p> 第五篇:數字簽名及哈希函數