第一篇:非對稱加密及數(shù)字簽名解析
鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。
鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。
蘇珊要給鮑勃寫一封保密的信。她寫完后用鮑勃的公鑰加密,就可以達(dá)到保密的效果。
鮑勃收信后,用私鑰解密,就看到了信件內(nèi)容。這里要強(qiáng)調(diào)的是,只要鮑勃的私鑰不泄露,這封信就是安全的,即使落在別人手里,也無法解密。
鮑勃給蘇珊回信,決定采用“數(shù)字簽名”。他寫完后先用Hash函數(shù),生成信件的摘要(digest)。
然后,鮑勃使用私鑰,對這個(gè)摘要加密,生成“數(shù)字簽名”(signature)。
鮑勃將這個(gè)簽名,附在信件下面,一起發(fā)給蘇珊。
蘇珊再對信件本身使用Hash函數(shù),將得到的結(jié)果,與上一步得到的摘要進(jìn)行對比。如果兩者一致,就證明這封信未被修改過。
復(fù)雜的情況出現(xiàn)了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。此時(shí),蘇珊實(shí)際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃,用自己的私鑰做成“數(shù)字簽名”,寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進(jìn)行解密。
后來,蘇珊感覺不對勁,發(fā)現(xiàn)自己無法確定公鑰是否真的屬于鮑勃。她想到了一個(gè)辦法,要求鮑勃去找“證書中心”(certificate authority,簡稱CA),為公鑰做認(rèn)證。證書中心用自己的私鑰,對鮑勃的公鑰和一些相關(guān)信息一起加密,生成“數(shù)字證書”(Digital Certificate)。
鮑勃拿到數(shù)字證書以后,就可以放心了。以后再給蘇珊寫信,只要在簽名的同時(shí),再附上數(shù)字證書就行了。
CA的公鑰解開數(shù)字證書,就可以拿到鮑勃真實(shí)的公鑰了,然后就能證明“數(shù)字簽名”是否真的是鮑勃簽的。
下面,我們看一個(gè)應(yīng)用“數(shù)字證書”的實(shí)例:https協(xié)議。這個(gè)協(xié)議主要用于網(wǎng)頁加密。
首先,客戶端向服務(wù)器發(fā)出加密請求。
服務(wù)器用自己的私鑰加密網(wǎng)頁以后,連同本身的數(shù)字證書,一起發(fā)送給客戶端。
客戶端(瀏覽器)的“證書管理器”,有“受信任的根證書頒發(fā)機(jī)構(gòu)”列表??蛻舳藭鶕?jù)這張列表,查看解開數(shù)字證書的公鑰是否在列表之內(nèi)。
如果數(shù)字證書記載的網(wǎng)址,與你正在瀏覽的網(wǎng)址不一致,就說明這張證書可能被冒用,瀏覽器會發(fā)出警告。
如果數(shù)字證書是可靠的,客戶端就可以使用證書中的服務(wù)器公鑰,對信息進(jìn)行加密,然后與服務(wù)器交換加密信息。
HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP。HTTPS的安全基礎(chǔ)是安全套接層(Secure Sockets Layer,SSL)。HTTP工作在應(yīng)用層(OSI模型的最高層),SSL協(xié)議工作在一個(gè)較低的子層,位于TCP/IP協(xié)議和HTTP協(xié)議之間。在HTTP報(bào)文傳輸前對其加密,并在到達(dá)時(shí)對其解密。嚴(yán)格地講,HTTPS并不是一個(gè)單獨(dú)的協(xié)議,而是工作在SSL協(xié)議上的HTTP協(xié)議。
HTTPS主要作用有兩種:(1)確認(rèn)通訊雙方的身份,(2)建立安全通道,保證數(shù)據(jù)傳輸安全。
HTTPS與HTTP協(xié)議的差異
(1).HTTP 的URL是以“http://”開始,HTTPS的URL是以“https://”開始;(2).HTTP默認(rèn)端口為80,HTTPS的默認(rèn)端口為443;(3).采用HTTPS的Web Server需要到CA申請證書;
(4).HTTPS由HTTP+SSL來實(shí)現(xiàn),可進(jìn)行加密傳輸、身份認(rèn)證等,要比HTTP安全(5).HTTP的信息是明文傳輸,而HTTPS的信息是加密傳輸
用公鑰加密的數(shù)據(jù)只有私鑰才能解密;相反的,用私鑰加密的數(shù)據(jù)只有公鑰才能解密,正是這種不對稱性才使得公用密鑰密碼系統(tǒng)被廣泛應(yīng)用。
第二篇:數(shù)字簽名和證書在網(wǎng)絡(luò)技術(shù)加密中的綜合應(yīng)用
數(shù)字簽名和證書在網(wǎng)絡(luò)技術(shù)加密中的綜合應(yīng)用
摘要 隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,引發(fā)各種競爭,網(wǎng)絡(luò)安全問題也被提上議事日程。在加密技術(shù)應(yīng)用中,數(shù)字簽名和數(shù)字證書技術(shù)都是信息保密的重要技術(shù)方法,如果把數(shù)字簽名和數(shù)字證書結(jié)合起來,綜合應(yīng)用,則更能有效提高網(wǎng)絡(luò)信息安全程度,而且過程簡潔,兩種技術(shù)無縫接軌,能有效保證網(wǎng)絡(luò)信息傳遞的安全,值得在實(shí)踐中進(jìn)一步發(fā)展創(chuàng)新。
關(guān)鍵詞 數(shù)字簽名;數(shù)字證書;網(wǎng)絡(luò);加密
中圖分類號TP39 文獻(xiàn)標(biāo)識碼A 文章編號 1674-6708(2010)31-0200-02
0 引言
隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,信息網(wǎng)絡(luò)技術(shù)廣泛推普應(yīng)用,與之相應(yīng)的網(wǎng)絡(luò)安全問題也被提上議事日程。因?yàn)樾畔⑴c網(wǎng)絡(luò)涉及到國家的各個(gè)方面,包括政治的、經(jīng)濟(jì)的、軍事的、文化的等諸多領(lǐng)域,在計(jì)算機(jī)網(wǎng)絡(luò)中存儲、傳輸和處理的信息,包括政府部門的宏觀調(diào)控決策、國家安全信息、商業(yè)經(jīng)濟(jì)信息、銀行資金轉(zhuǎn)賬、股票證券、能源資源數(shù)據(jù)和高科技科研數(shù)據(jù)等息,其中有很多是敏感信息和國家機(jī)密,所以承載和集散這些數(shù)據(jù)信息的載體,如網(wǎng)絡(luò)、計(jì)算機(jī)等,難免會成為各種攻擊和破壞的對象。萬維網(wǎng)絡(luò)因之不斷地遭遇黑客的攻擊、破壞搗亂,許多國家機(jī)密及重要情報(bào)資料被竊取和破壞,甚至造成局部網(wǎng)絡(luò)系統(tǒng)的癱瘓等,這些破壞行為已經(jīng)給各個(gè)國家、眾多使用計(jì)算機(jī)網(wǎng)絡(luò)的部門和個(gè)人造成程度不同的損失。特別是,當(dāng)許多安全保密應(yīng)對措施出現(xiàn)的時(shí)候,網(wǎng)絡(luò)攻擊又更猖獗,近乎達(dá)到無孔不入的地步。因此,提高安全意識,加強(qiáng)網(wǎng)絡(luò)技術(shù)的安保措施,實(shí)施網(wǎng)絡(luò)技術(shù)加密,保障網(wǎng)絡(luò)使用安全,已經(jīng)成為網(wǎng)絡(luò)技術(shù)應(yīng)用和發(fā)展的重要內(nèi)容。
目前,最常用的網(wǎng)絡(luò)安全防護(hù)技術(shù)主要有:加密技術(shù)、身份驗(yàn)證技術(shù)、網(wǎng)絡(luò)防病毒技術(shù)和防火墻技術(shù)等。這些技術(shù)各有千秋,都能對網(wǎng)絡(luò)信息安全保障,立下汗馬功勞,但又各有不足。尤其是,以往的安全防范措施多是各自為政,互不關(guān)聯(lián),其防范效果也就有限了。我們設(shè)想,如果把幾種加密技術(shù)和措施結(jié)合起來使用,可能有效提高加密層級,比如,把加密技術(shù)和身份驗(yàn)證技術(shù)結(jié)合應(yīng)用,其安全效果當(dāng)大幅度提高,保障性更強(qiáng)。其初步的界定是:加密技術(shù)和身份驗(yàn)證技術(shù)相結(jié)合,是指對在網(wǎng)絡(luò)中所發(fā)送的明文消息,用加密密鑰加密成密文進(jìn)行傳送,同時(shí)給以數(shù)字簽名和數(shù)字證書保障,接收方用解密密鑰進(jìn)行解密,核對證書,確認(rèn)身份,再現(xiàn)明文消息,從而保證傳輸過程中密文信息即使被泄露,在無密鑰的情況下仍是安全保密的。通過數(shù)字簽名和數(shù)字證書技術(shù)的結(jié)合應(yīng)用,以很小的投入和代價(jià),提供可靠的安全保護(hù),目的是保護(hù)有關(guān)數(shù)據(jù)、文件、口令和控制信息,保護(hù)網(wǎng)上集散的信息數(shù)據(jù),能有效地保證網(wǎng)絡(luò)技術(shù)應(yīng)用和信息資料的安全。數(shù)字簽名
1.1 數(shù)字簽名的界定
所謂數(shù)字簽名(Digital Signature),是公開密鑰加密技術(shù)的一種應(yīng)用,是指用發(fā)送方的私有密鑰加密報(bào)文摘要,然后將其與原始的信息附加在一起,合稱為數(shù)字簽名。
1.2 數(shù)字簽名的使用方法
數(shù)字簽名的具體使用方法是:報(bào)文的發(fā)送方從報(bào)文文本中生成一個(gè)128位或160位的單向散列值(或報(bào)文摘要),并用自己的私有的密鑰對這個(gè)散列值進(jìn)行加密,形成發(fā)送方的數(shù)字簽名;然后將這個(gè)數(shù)字簽名作文的附件和報(bào)文一起發(fā)送給報(bào)文的接收方;報(bào)文的接收方首先從接收到的原始報(bào)文中計(jì)算出128位的散列值(或報(bào)文摘要),接著再用發(fā)送方的公開密鑰對報(bào)文附加的數(shù)字簽名進(jìn)行解密;如果這兩個(gè)散列值相同,那么接收方就能確認(rèn)數(shù)字簽名是發(fā)送方的。通過數(shù)字簽名能夠?qū)崿F(xiàn)對原始報(bào)文的鑒別和驗(yàn)證,保證報(bào)文的完整性、權(quán)威性和發(fā)送者對報(bào)文的不可抵賴性。數(shù)字簽名機(jī)制提供了一種鑒別方法,普遍用于銀行、電子商務(wù)等,以解決偽造、抵賴、冒充、篡改等問題。
1.3 數(shù)字簽名的技術(shù)實(shí)現(xiàn)
在技術(shù)實(shí)現(xiàn)上,數(shù)字簽名的步驟一般有如下幾步:
1)發(fā)送方用一個(gè)Hash函數(shù)對消息進(jìn)行處理,產(chǎn)生消息摘要(Message Digest);
2)發(fā)送方將自己的私人密鑰和消息摘要進(jìn)行DSA算法(Digital Signature Algorithm)計(jì)算,產(chǎn)生數(shù)字簽名;
3)將數(shù)字簽名和消息一起發(fā)送出去;
4)接收方用同樣的Hash函數(shù)對消息進(jìn)行計(jì)算,產(chǎn)生消息摘要;
5)接收方用DSA算法消息摘要和發(fā)送方的公開密鑰進(jìn)行計(jì)算,產(chǎn)生數(shù)字簽名S1。同時(shí)從接收到的消息中可以得到附加的數(shù)字簽名S2。對比數(shù)字簽名S1和S2,若S1與S2相等,則該數(shù)字簽名得到驗(yàn)證,否則數(shù)字簽名驗(yàn)證失敗,消息發(fā)出后可能曾被修改或者是偽造的。整個(gè)過程如圖1。
圖1數(shù)字簽名及其驗(yàn)證過程
數(shù)字簽名因其使用方便,技術(shù)層級高,在網(wǎng)絡(luò)信息傳遞的保密過程中,最常應(yīng)用。數(shù)字證書
2.1 數(shù)字證書的概念
顧名思義,數(shù)字證書是一個(gè)文件。數(shù)字證書(Digital Certification,Digital ID)是網(wǎng)絡(luò)上用以證實(shí)一個(gè)用戶的身份和證實(shí)其對網(wǎng)絡(luò)資源的訪問權(quán)限。它是一個(gè)加密并用口令保護(hù)的文件,一般的數(shù)字證書總是把一個(gè)密鑰同一個(gè)用戶的一個(gè)或多個(gè)屬性進(jìn)行綁定。數(shù)字證書包含有證書擁有者的個(gè)人主要信息,可以編碼的信息、證書驗(yàn)證機(jī)構(gòu)CA(Certification Authority)和證實(shí)的有效期等。其中,個(gè)人信息包括證書持有者的姓名、證件編號和電子郵件地址等等,編碼的信息指文件中包含一個(gè)公開密鑰以用來驗(yàn)證消息發(fā)送者事先用匹配的私有密鑰簽過的數(shù)字簽名。數(shù)字證書的內(nèi)部格式由CC ITTX.509國際標(biāo)準(zhǔn)所規(guī)定。
2.2 數(shù)字證書的傳輸
一般是每一個(gè)公鑰做一張數(shù)字證書,私鑰用最安全的方式交給用戶或自己生產(chǎn)密鑰對,數(shù)字證書的內(nèi)容包括用戶的公鑰、姓名、發(fā)證機(jī)構(gòu)的數(shù)字簽名及用戶的其他信息,對方可以借此來驗(yàn)證身份的真假。當(dāng)然,證書必須預(yù)防密鑰丟失,可采用恢復(fù)密鑰和密鑰托管等方式處理丟失問題。證書的有效期超過后,必須重新簽發(fā),如果私鑰丟失或被非法使用,則應(yīng)廢止證書。數(shù)字簽名與數(shù)字證書的綜合使用
把數(shù)字簽名和數(shù)字證書技術(shù)兩者綜合起來,一起用于信息傳遞過程的保密工作,可以有效地提高加密層級,保障網(wǎng)絡(luò)信息安全。這主要是因?yàn)槠浔C苓^程增加了幾道防范措施。數(shù)字簽名和數(shù)字證書綜合應(yīng)用于網(wǎng)絡(luò)信息加密,其過程依附在信息傳遞過程中的。
3.1 數(shù)字簽名和數(shù)字證書的綜合應(yīng)用流程
1)發(fā)送者A將一個(gè)簽名的證書請求(包含她的名字、公鑰、可能還有其他一些信息)發(fā)送到CA。
2)CA使用發(fā)送者A 的請求創(chuàng)建一個(gè)消息。CA使用其私鑰對消息進(jìn)行簽名,以便創(chuàng)建一個(gè)單獨(dú)的簽名。CA將消息和簽名返回給發(fā)送者A。消息和簽名共同構(gòu)成了發(fā)送者A的證書。
3)發(fā)送者A將證書發(fā)送給發(fā)送者B,以便授權(quán)他訪問發(fā)送者A的公鑰。
4)發(fā)送者B使用CA的公鑰對證書簽名進(jìn)行驗(yàn)證。如果證書簽名是有效的,就承認(rèn)證書中的公鑰是發(fā)送者A的公鑰。
圖2數(shù)字認(rèn)證過程
與數(shù)字簽名的情況一樣,任何有權(quán)訪問CA公鑰的接收者都可以確定證書是否由特定CA 簽名的。這個(gè)過程不要求訪問任何機(jī)密信息。上面這個(gè)方案假定發(fā)送者B有權(quán)訪問CA的公鑰。如果發(fā)送者B擁有發(fā)含該公鑰的CA證書副本,則他有權(quán)訪問該密鑰。具體的認(rèn)證過程如圖2。
從這過程看來,數(shù)字簽名和數(shù)字證書兩種技術(shù),其應(yīng)用過程并不矛盾,不會產(chǎn)生排斥,倒是能互相照應(yīng),無縫接軌,過程也很簡潔,使用方便。
3.2 數(shù)字簽名和數(shù)字證書的綜合應(yīng)用舉例
把數(shù)字加密和數(shù)字證書結(jié)合起來,可以加大網(wǎng)絡(luò)信息保密的力度。假如甲方要給乙方供應(yīng)商發(fā)送一份業(yè)務(wù)合同,其步驟可以是:
第一步,在文字處理軟件中填寫合同內(nèi)容細(xì)節(jié),在文檔地步,插入電子簽名,表示甲方已經(jīng)確認(rèn)合同;
第二步,用數(shù)字簽名來生成一個(gè)唯一的數(shù)字,這就使得合同有了甲方的電子簽名和數(shù)字簽名,附在文件中,以保證合同條款年內(nèi)容不被修改;
第三步,用私有數(shù)字證書對這合同文件進(jìn)行簽名。然后,用電子郵箱把合同文件發(fā)給乙方供應(yīng)商。
乙方供應(yīng)商收到合同文件之后,現(xiàn)獲得甲方的公鑰數(shù)字證書,確保電子郵件的確來自甲方。乙方運(yùn)行數(shù)字簽名持續(xù)來驗(yàn)證合同文件在甲方發(fā)出之后沒有被修改。最后乙方打開文件,在文件底部的電子簽名處,看到甲方同意合同條款的簽名。這樣,幾個(gè)環(huán)節(jié)和程序都獲得證實(shí),合同文件確實(shí)來自甲方,并未被泄密或被修改。然后,乙方即可處理甲方來件,即處理合同訂單。這就是經(jīng)過數(shù)字證書和數(shù)字簽名等保密技術(shù)保護(hù)的網(wǎng)絡(luò)信息傳遞過程。作為比較可靠的數(shù)字加密技術(shù),數(shù)字簽名和數(shù)字證書的結(jié)合,可以應(yīng)用于電子郵件、電子支付、電子基金轉(zhuǎn)移等各種用途,以保障其信息安全。結(jié)論
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,網(wǎng)絡(luò)安全問題日益成為人們關(guān)注的焦點(diǎn),加密技術(shù)與網(wǎng)絡(luò)安全密切相關(guān),網(wǎng)絡(luò)加密的技術(shù)和理論也將不斷完善和發(fā)展,在網(wǎng)絡(luò)安全中的應(yīng)用也將越來越廣。作為具體的加密技術(shù)應(yīng)用,數(shù)字簽名和數(shù)字證書這兩種技術(shù),各有千秋,而把兩者結(jié)合起來,綜合應(yīng)用,則更能有效保證網(wǎng)絡(luò)信息傳遞的安全,值得在實(shí)踐中進(jìn)一步發(fā)展創(chuàng)新。
參考文獻(xiàn)
[1]Atul Kahate著.邱仲潘,等譯.密碼學(xué)與網(wǎng)絡(luò)安全[M].清華大學(xué)出版社,2005.[2]王玲.網(wǎng)絡(luò)信息安全的數(shù)據(jù)加密技術(shù)[M].信息安全與通信保密,2007.[3]王群.計(jì)算機(jī)網(wǎng)絡(luò)安全技術(shù)[M].清華大學(xué)出版社,2008.
第三篇:PDF數(shù)字簽名
制做PDF文件電子簽名的方法
1、在一張白紙上寫一個(gè)您最得意的簽名,并掃描或用數(shù)碼像機(jī)將簽名轉(zhuǎn)為圖片文件;
2、用photoshop打開上面做好的簽名圖片文件,裁切成剛好能容納您簽名的大小,并 去掉圖片的背景顏色(方法詳見后附),將處理好的圖片另存為.GIF 圖片格式文件待用;
3、打開Adobe Acrobat 9 Pro(本制做方法適用于Adobe Acrobat 9 Pro 版本,其它 版本請做相應(yīng)調(diào)整),任意新建一個(gè)PDF文件;
4、點(diǎn)擊Adobe Acrobat 9 Pro 工具欄中的“簽名”—“放置簽名”,并用鼠標(biāo)在新建的 那個(gè)PDF文件中畫一個(gè)長方形的簽名區(qū)(名字相簽多大就畫多大);
5、在隨后彈出的窗口中選擇“我要立即創(chuàng)建新的數(shù)字簽名”,并點(diǎn)“下一步”;
6、在下一個(gè)窗口選擇“新建PKCS#12數(shù)字身份證文件”,并點(diǎn)“下一步”;
7、在彈出的新窗口中輸入“姓名”、“部門”,“單位名稱”,“電子郵件地址”(以上這些 都只能輸英文或拼音,不支持漢字);然后選擇國家并點(diǎn)“下一步”;
8、在接下來彈出的窗口中選擇電子簽名文件制做好后要存放的文件夾,輸入并確認(rèn)您 以后簽名時(shí)驗(yàn)證身份要用的密碼;最后點(diǎn)擊“完成”
9、在“簽名文檔”窗口中的“簽名為:”檔中選擇“新建ID”,在“外觀(A):”欄選擇 “創(chuàng)建新外觀?”;
10、彈出的“配置簽名外觀”窗口中的標(biāo)題欄輸入這類簽名的標(biāo)識,例:“無日期簽名” 等等;在“配置圖形”--“顯示:”中選擇“導(dǎo)入的圖形(I)”并點(diǎn)擊“文件(F)?”;從“選擇圖片”窗口的“瀏覽(B)?”中找到第2步制做好的圖片文件并點(diǎn)“確定”返回;這時(shí)您就可以“配置簽名外觀”窗口的“預(yù)覽”欄中看見您手寫的簽名了;您也會看到,除了您的簽名外,它后面還跟著一些其它信息;這些信息是通過“配置文本”-“顯示:”后面的選擇項(xiàng)來控制的,您可以根據(jù)您的簽名需要選擇;
11、至此,點(diǎn)“確定”后,您的電子簽名就算制做完成了,以后在簽名時(shí),只需重復(fù)第 4步并輸入密碼就OK了!
12、如果需要在簽名時(shí)同時(shí)輸入簽名“原因”,就需要在“配置簽名外觀”窗口的“配 置文本”選項(xiàng)中勾選上“原因”,點(diǎn)擊“確定”完成電子簽名制做后,再在“編輯”菜單欄選擇“首選項(xiàng)”—“種類”—“安全性”—“高級首選項(xiàng)”—“創(chuàng)建”標(biāo)簽中勾選“簽名時(shí)顯示原因”。這樣,以后簽名時(shí)就可以輸入您的簽名“意見”(原因)了;
13、如果您對剛才制做的這個(gè)簽名不滿意,可以在Adobe Acrobat 9 Pro 工具欄中的“高 級”—“安全性設(shè)置”,中刪除這個(gè)數(shù)字身份證;如果你想對制做好的簽名做一個(gè)備份,以后電腦系統(tǒng)重裝后可以直接導(dǎo)入使用,您也可以在這個(gè)窗口中將您制做好的“數(shù)字身份證”導(dǎo)出保存。
14、對于您不滿意的簽名外觀,可以在“編輯”菜單欄選擇“首選項(xiàng)”—“種類”—“安 全性”—“外觀”欄中進(jìn)行“編緝”或“刪除”;也可以在此處應(yīng)用“新建”按鈕直
名人堂:眾名人帶你感受他們的驅(qū)動人生馬云任志強(qiáng)李嘉誠柳傳志史玉柱
接創(chuàng)建一個(gè)新的簽名外觀。
15、修改簽名密碼:運(yùn)行Adobe Acrobat 9 Pro,依次點(diǎn)擊菜單欄中的“高級”—“安 全性設(shè)置”—“數(shù)字身份證文件”,再點(diǎn)擊右側(cè)最上面一行中的“更改口令”就可更改您簽名時(shí)要輸入的密碼了!
第四篇:白話數(shù)字簽名
白話數(shù)字簽名
由于數(shù)字簽名基于非對稱加密技術(shù),所以我們需要先啰嗦一下對稱加密和非對稱加密技術(shù)。
對稱加密
何謂加密?加密是一種“把數(shù)據(jù)搞亂掉”的技術(shù)。加密技術(shù)涉及到4種東東:
明文:可以被人或程序識別的數(shù)據(jù)。例如一個(gè)文本文件、一段歌詞、一個(gè)Word文檔、一首MP3、一個(gè)圖片文件、一段視頻等等。
加密算法:將數(shù)據(jù)搞亂掉的方法。
密鑰(密碼):一個(gè)你在進(jìn)行加密操作時(shí)給出的字符串,讓加密算法不但把明文“搞亂掉”,而且要亂得“與眾不同”。這樣即使別人搞到了解密算法,如果沒有當(dāng)初加密時(shí)所使用的密碼,一樣無法進(jìn)行解密操作。
密文:明文被加密算法和密鑰加密后的結(jié)果。它看上去就是一堆亂碼,沒有人或程序能知道它到底表示什么信息。
作為加密的一個(gè)實(shí)例,我將使用由我杜撰的“景氏替換加密算法”演示一下加密過程。明文:good good study, day day up.密鑰:google
景氏替換加密算法:將明文中的所有的字母“d”替換成密鑰。
密文:將“good good study, day day up.”中的所有字母“d”替換成“google”,就得到密文“googoogle googoogle stugoogley,googleay googleay up.”。這個(gè)密文亂得還可以吧?一般人看了肯定不知道它是什么意思。
那么什么是解密呢?解密就是把密文再變回明文的過程。
例如“景氏替換解密算法”就是:將密文中所有與密鑰相同的字符串替換成“d”。密文:googoogle googoogle stugoogley,googleay googleay up.密鑰:google
景氏替換解密算法:將密文中所有與密鑰相同的字符串替換成“d”。
明文:將“googoogle googoogle stugoogley,googleay googleay up.”中的所有“google”替換成“d”,就得到了明文“good good study, day day up.”。
您肯定已經(jīng)注意到了,我們在進(jìn)行加密和解密時(shí)使用的密鑰必須是相同的,例如在上例中,加密和解密都必須使用相同的密鑰“google”。所以像“景氏替換加密算法”這種就被稱為對稱加密算法。目前最為流行的對稱加密算法是DES和AES,此外,對稱加密算法還有IDEA、FEAL、LOKI、Lucifer、RC2、RC4、RC5、Blow fish、GOST、CAST、SAFER、SEAL等。WinRAR的文件加密功能就是使用的AES加密算法。
非對稱加密
非對稱加密算法是一類與眾不同的加密算法,它的密鑰不是1個(gè),而是2個(gè)(一對),我們先姑且稱它們?yōu)槊荑€K1和密鑰K2。非對稱加密算法的特點(diǎn)是,如果用密鑰K1進(jìn)行加密,則有且僅有密鑰K2能進(jìn)行解密;反之,如果使用密鑰K2進(jìn)行了加密,則有且僅有密鑰K1能進(jìn)行解密。注意“有且僅有”的意思——如果用密鑰K1進(jìn)行了加密,是不能用密鑰K1
進(jìn)行解密的;同樣,如果用密鑰K2進(jìn)行了加密,也無法用密鑰K2進(jìn)行解密。這是一個(gè)非常重要的特性,至于如何在實(shí)際中運(yùn)用這個(gè)特性,請看下文。
我想給Clark傳送一個(gè)AV小電影,又怕被他的老婆發(fā)現(xiàn)......話說俺得了一個(gè)很不錯的AV小電影,想通過網(wǎng)絡(luò)傳送給Clark,可是又怕被他的老婆發(fā)現(xiàn)(因?yàn)镃lark的老婆是一個(gè)超級黑客,她可以使用sniffer技術(shù)截獲任何通過網(wǎng)線傳送給Clark的數(shù)據(jù)。別跟我說用VPN,它超出了本文討論的范圍),怎么辦呢?對了,我們需要一個(gè)“將數(shù)據(jù)搞亂掉”的技術(shù)——加密技術(shù)。我先使用WinRAR對小電影進(jìn)行壓縮,然后加上密碼“TswcbyyqjsjhfL”(還記得么?WinRAR的文件加密功能使用的是叫作AES的對稱加密算法)。接著,將這個(gè)加密后的文件通過QQ傳送給Clark。然后,興沖沖地?fù)艽駽lark的手機(jī): “喂?Clark么?好久不見,呵呵......我給你發(fā)了個(gè)好東東呦,在QQ上,收到?jīng)]?......密碼是TswcbyyqjsjhfL,對,就是天生我才必有用,千金散盡還復(fù)來的首字母,第一個(gè)和最后一個(gè)字母要大寫呦......”
可是,Clark,我是真的不知道你的老婆大人剛剛就在你的身邊呀!而且你也知道,我打電話從來都是喜歡很大聲的......嗚嗚嗚......在Clark跪了一夜的搓衣板之后,我們都明白:如果是已經(jīng)保存在自己硬盤上的文件,使用對稱加密技術(shù)進(jìn)行加密是沒有問題的;如果是兩個(gè)人通過網(wǎng)絡(luò)傳輸文件,使用對稱加密就很危險(xiǎn)——因?yàn)樵趥魉兔芪牡耐瑫r(shí),還必須傳送解密密鑰。我們需要一個(gè)與眾不同的加密算法,一個(gè)不需要傳遞解密密鑰的加密算法。非對稱加密正好可以滿足我們的需要。基本思路是這樣的:首先,生成一對滿足非對稱加密要求的密鑰對(密鑰K1和密鑰K2)。然后,將密鑰K1公布在網(wǎng)上,任何人都可以下載它,我們稱這個(gè)已經(jīng)公開的密鑰K1為公鑰;密鑰K2自己留著,不讓任何人知道,我們稱這個(gè)只有自己知道的密鑰K2為私鑰。當(dāng)我想給Clark傳送小電影時(shí),我可以用Clark的公鑰對小電影進(jìn)行加密,之后這個(gè)密文就連我也無法解密了。這個(gè)世界上只有一個(gè)人能將密文解密,這個(gè)人就是擁有私鑰的Clark。
后來......后來,Clark痛定思痛,決定申請一個(gè)數(shù)字證書。流程是這樣的:首先,登錄當(dāng)?shù)氐臄?shù)字證書認(rèn)證中心網(wǎng)站,填表->出示個(gè)人有效證件原件和復(fù)印件->繳費(fèi)->等待數(shù)字證書認(rèn)證中心制作數(shù)字證書->領(lǐng)取數(shù)字證書。如果您的公司需要申請大量的數(shù)字證書,還可以與認(rèn)證中心的銷售人員商量,先領(lǐng)取免費(fèi)的試用版的數(shù)字證書供技術(shù)人員試用。
后來的后來,我又得到了一本電子版的不良漫畫,當(dāng)然,我又想到了Clark。我先在數(shù)字證書認(rèn)證中心下載了Clark的公鑰證書(就是一個(gè)含有公鑰信息的文件),使用非對稱加密算法對不良漫畫進(jìn)行加密,再將密文通過QQ傳送給Clark。然后,我興沖沖地?fù)艽駽lark的手機(jī): “喂?Clark么?好久不見,呵呵......我給你發(fā)了個(gè)好東東呦,在QQ上,收到?jīng)]?......已經(jīng)用你的公鑰加密了。用你的私鑰解密就行了^_^”
Clark興沖沖地插入他的私鑰(忘了說了,私鑰并不是一個(gè)文件,而是一個(gè)USB設(shè)備,外形就跟U盤一樣,至于為什么要這樣,下一篇再說),解密,然后開始看漫畫,完全沒察覺他的老婆大人就在身后......Clark,俺這個(gè)月手頭有點(diǎn)緊......唉,這個(gè)月買了太多的書,到月底揭不開鍋了。正巧在QQ上遇到了Clark:
1-2-3:“Clark,我需要200兩紋銀,能否借給我?”
Clark:“沒問題。我這就給你轉(zhuǎn)賬。請給我一張借條?!?/p>
1-2-3:“太謝謝了,我這就用Word寫一個(gè)借條給你?!?/p>
然后,我新建一個(gè)Word文檔,寫好借條,存盤。然后,然后怎么辦呢?我不能直接把借條發(fā)送給Clark,原因有:
1.我無法保證Clark不會在收到借條后將“紋銀200兩”改為“紋銀2000兩”。
2.如果我賴賬,Clark無法證明這個(gè)借條就是我寫的。
3.普通的Word文檔不能作為打官司的證據(jù)。
好在我早就申請了數(shù)字證書。我先用我的私鑰對借條進(jìn)行加密,然后將加密后的密文用QQ發(fā)送給Clark。Clark收到了借條的密文后,在數(shù)字證書認(rèn)證中心的網(wǎng)站上下載我的公鑰,然后使用我的公鑰將密文解密,發(fā)現(xiàn)確實(shí)寫的是“借紋銀200兩”,Clark就可以把銀子放心的借給我了,我也不會擔(dān)心Clark會篡改我的借條,原因是:
1.由于我發(fā)給Clark的是密文,Clark無法進(jìn)行修改。Clark倒是可以修改解密后的借條,但是Clark沒有我的私鑰,沒法模仿我對借條進(jìn)行加密。這就叫防篡改。
2.由于用我的私鑰進(jìn)行加密的借條,有且只有我的公鑰可以解密。反過來講,能用我的公鑰解密的借條,一定是使用我的私鑰加密的,而只有我才擁有我的私鑰,這樣Clark就可以證明這個(gè)借條就是我寫的。這就叫防抵賴。
3.如果我一直賴著不還錢,Clark把我告上了法庭,這個(gè)用我的私鑰加密過的Word文檔就可以當(dāng)作程堂證供。因?yàn)槲覈呀?jīng)出臺了《中華人民共和國電子簽名法》,使數(shù)字簽名具有了法律效力。
您一定已經(jīng)注意到了,這個(gè)使用我的私鑰進(jìn)行了加密的借條,具有了防篡改、防抵賴的特性,并且可以作為程堂證供,就跟我對這個(gè)借條進(jìn)行了“簽名”的效果是一樣的。對了,“使用我的私鑰對借條進(jìn)行加密”的過程就叫做數(shù)字簽名。(由于數(shù)字簽名算法的速度比較慢,所以在實(shí)際對文件簽名的過程比上面提到的方法稍稍復(fù)雜一些,這個(gè)在下一篇再講)。
我是1-2-3,我真的是1-2-3,我是真的1-2-
3正如您已經(jīng)知道的,Clark的老婆是一名超級黑客——就是傳說中能用計(jì)算機(jī)作任何事的人。這不,不久前她就輕松入侵了QQ數(shù)據(jù)庫,下載了Clark的所有好友的ID和密碼以及聊天記錄。然后,時(shí)不時(shí)地偽裝成Clark的好友跟Clark聊天,搞得Clark最近總是神經(jīng)兮兮、疑神疑鬼的。這不,昨天我在QQ上遇到了Clark:
1-2-3:“Clark,最近還好吧?我又搞到一個(gè)好東東呦,要不要?”
Clark:“48475bbt556”
Clark并不是瘋掉了,那個(gè)“48475bbt556”也不是我跟Clark之間的什么通關(guān)暗語。這個(gè)“48475bbt556”就是Clark在鍵盤上胡亂敲上去的,不過,我卻知道Clark是什么意思。我立刻把“48475bbt556”粘貼到Word里,然后用我的私鑰對這個(gè)Word文檔加密,再將這個(gè)Word文檔發(fā)送給Clark。Clark在那邊用我的公鑰將Word文檔解密,打開,發(fā)現(xiàn)里面寫的就是“48475bbt556”,就知道QQ這邊的確就是真正的我本人了。因?yàn)閾碛形业乃借€的人在這個(gè)世界上就只有我一人而已,Clark的老婆大人就是再神通廣大也模仿不了,這就是數(shù)字簽名的驗(yàn)證功能。
順便提一句,不但人可以申請數(shù)字證書,設(shè)備(例如Web服務(wù)器)也可以申請數(shù)字證書(叫作設(shè)備證書)。利用數(shù)字簽名的驗(yàn)證功能,就可以驗(yàn)證服務(wù)器的身份了,這可是防釣魚的終極解決方案呦。
第五篇:數(shù)字簽名課程設(shè)計(jì)
數(shù)字簽名的目的和意義
RSA公開密鑰加密算法自20世紀(jì)70年代提出以來,已經(jīng)得到了廣泛認(rèn)可和應(yīng)用。發(fā)展至今,電子安全領(lǐng)域的各方面已經(jīng)形成了較為完備的國際規(guī)范。RSA作為最重要的公開密鑰算法,在各領(lǐng)域的應(yīng)用數(shù)不勝數(shù)。RSA在硬件方面,以技術(shù)成熟的IC應(yīng)用于各種消費(fèi)類電子產(chǎn)品。
RSA在軟件方面的應(yīng)用,主要集中在Internet上。加密連接、數(shù)字簽名和數(shù)字證書的核心算法廣泛使用RSA。日常應(yīng)用中,有比較著名的工具包Open SSL(SSL,Security Socket Layer,是一個(gè)安全傳輸協(xié)議,在Internet上進(jìn)行數(shù)據(jù)保護(hù)和身份確認(rèn)。Open SSL是一個(gè)開放源代碼的實(shí)現(xiàn)了SSL及相關(guān)加密技術(shù)的軟件包,由加拿大的Eric Yang等發(fā)起編寫的。Open SSL應(yīng)用RSA實(shí)現(xiàn)簽名和密鑰交換,已經(jīng)在各種操作系統(tǒng)得到非常廣泛的應(yīng)用。另外,家喻戶曉的IE瀏覽器,自然也實(shí)現(xiàn)了SSL協(xié)議,集成了使用RSA技術(shù)的加密功能,結(jié)合MD5和SHA1,主要用于數(shù)字證書和數(shù)字簽名,對于習(xí)慣于使用網(wǎng)上購物和網(wǎng)上銀行的用戶來說,幾乎天天都在使用RSA技術(shù)。
RSA更出現(xiàn)在要求高度安全穩(wěn)定的企業(yè)級商務(wù)應(yīng)用中。在當(dāng)今的企業(yè)級商務(wù)應(yīng)用中,不得不提及使用最廣泛的平臺j2ee。事實(shí)上,在j2se的標(biāo)準(zhǔn)庫中,就為安全和加密服務(wù)提供了兩組API:JCA和JCE。JCA(Java Cryptography Architecture)提供基本的加密框架,如證書、數(shù)字簽名、報(bào)文摘要和密鑰對產(chǎn)生器; JCA由幾個(gè)實(shí)現(xiàn)了基本的加密技術(shù)功能的類和接口組成,其中最主要的是java.security包,此軟件包包含的是一組核心的類和接口,Java中數(shù)字簽名的方法就集中在此軟件包中。JCE(Java Cryptography Extension)在JCA的基礎(chǔ)上作了擴(kuò)展,JCE也是由幾個(gè)軟件包組成,其中最主要的是javax.crypto包,此軟件包提供了JCE加密技術(shù)操作API。javax.crypto中的Cipher類用于具體的加密和解密。在上述軟件包的實(shí)現(xiàn)中,集成了應(yīng)用RSA算法的各種數(shù)據(jù)加密規(guī)范(RSA算法應(yīng)用規(guī)范介紹參見: http://004km.cn/rsalabs/node.asp?id=2146,這些API內(nèi)部支持的算法不僅僅只有RSA,但是RSA是數(shù)字簽名和證書中最常用的),用戶程序可以直接使用java標(biāo)準(zhǔn)庫中提供的API進(jìn)行數(shù)字簽名和證書的各種操作。
2.?dāng)?shù)字簽名算法的基本框架 1.密鑰的產(chǎn)生
①選擇兩個(gè)保密的大素?cái)?shù)P和q。②計(jì)算N=p q,≯(N)=(p-1)(g-1),其中≯(N)是N的歐拉函數(shù)值。③選擇一個(gè)整數(shù)e,滿足l ⑤以(e, n)為公鑰,(d ,N)為密鑰,銷毀p,q,≯(N)。2.加密 加密時(shí)首先將明文比特串進(jìn)行分組,使得每個(gè)分組對應(yīng)得串在數(shù)值上小于N,即分組的二進(jìn)制長度小于l092N。然后,對每個(gè)明文分組M,作加密運(yùn)算: C=E k(M)=M e mod N 3.解密 對密文分組的解密運(yùn)算為: M=D k(C)=C d mod N 由定理1和定理2可以證明解密運(yùn)算能恢復(fù)明文M 并非所有的公開密鑰系統(tǒng),均可同時(shí)達(dá)到秘密性與數(shù)字簽名功能。一般而言,一公開密鑰系統(tǒng)若作為密碼系統(tǒng),則無法作為數(shù)字簽名,反之亦然。只有很少數(shù) 的系統(tǒng)可同時(shí)作為密碼系統(tǒng)和數(shù)字簽名,如本文討論的RSA系統(tǒng)。RSA簽名算 法如下: 設(shè)N=p q,且p和q是兩個(gè)大素?cái)?shù),e和d滿足e d≡l(mod ≯(N))。公開密鑰:N,e 私有密鑰:d 簽名過程:發(fā)送方使用自己的私鑰d對明文m進(jìn)行數(shù)字簽名變換: y=x d mod N:并將加密后的消息和簽名y發(fā)送給接收方; 驗(yàn)證過程:接收方使用發(fā)送方的公鑰e對收到的消息y進(jìn)行數(shù)字簽名驗(yàn)證變換x’=ye mod N,并使用發(fā)送方的密鑰解密恢復(fù)消息x,比較x’與x,如果x’=x則證實(shí)發(fā)送方的身份合法。 這樣,用戶A若想用RSA簽名方案對消息x簽名,他只需公開他的公鑰N和e,由于簽名算法是保密的,因此A是唯一能產(chǎn)生簽名的人,任何要驗(yàn)證用戶A 簽名的用戶只需查到A的公鑰即可驗(yàn)證簽名。對于實(shí)現(xiàn)簽名和公鑰加密的組合,常用方法是:假定通信雙方為A和B。對于明文x,A計(jì)算他的簽名y=x d mod N,然后利用B的公開加密函數(shù)EB對信息對(x, y)加密得到Z,將密文Z傳送給B,當(dāng)B收到密文Z后,他首先用他的解密函數(shù)DB來解密得到(x,y)=DB(Z)= DB(EB(x,y)),然后利用A的驗(yàn)證算法來檢查x’=x=y e mod N是否成立。 3.主要模塊的算法以及關(guān)鍵代碼 ①.文件選擇模塊的主要算法及關(guān)鍵代碼 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);②.保存公鑰的文件路徑的主要算法及關(guān)鍵代碼 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);③.保存簽名后的文件的路徑主要算法及關(guān)鍵代碼 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);④.?dāng)?shù)字簽名的主要算法及關(guān)鍵代碼 HCRYPTPROV hProv;//秘鑰容器句柄 BYTE *pbBuffer;//被簽名的數(shù)據(jù) HCRYPTHASH hHash;HCRYPTKEY hKey;BYTE *pbKeyBlob; //簽名者得公鑰數(shù)據(jù) BYTE *pbSignature; //數(shù)字簽名 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(”請選擇正確保存數(shù)字簽名的文件路徑“);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 //密鑰容器不存在創(chuàng)建之 { if(CryptAcquireContext(&hProv,NULL,NULL,m_prov_sign,CRYPT_NEWKEYSET)) m_state_sign+=”已創(chuàng)建一個(gè)新的密鑰容器,秘鑰生成算法:“+GetProvType(m_prov_sign)+”n“; else { m_state_sign+=MyHandleError(”在獲取CSP時(shí)發(fā)生錯誤,程序停止.“);UpdateData(FALSE);return;} } // 從密鑰容器中取數(shù)字簽名用的密鑰 if(CryptGetUserKey(hProv,AT_SIGNATURE,&hKey)) m_state_sign+=”簽名密鑰已經(jīng)獲取.n“;else { if(GetLastError()== NTE_NO_KEY)//密鑰容器里不存在signature key pair創(chuàng)建之 { if(CryptGenKey(hProv,//CSP句柄 AT_SIGNATURE, //創(chuàng)建的密鑰對類型為signature key pair 0, //key類型,這里用默認(rèn)值 &hKey)) //創(chuàng)建成功返回新創(chuàng)建的密鑰對的句柄 m_state_sign+=”創(chuàng)建一個(gè)秘鑰對n“; else { m_state_sign+=MyHandleError(”在創(chuàng)建簽名密鑰對時(shí)發(fā)生錯誤,程序停止.n“);UpdateData(FALSE);return;} } else { m_state_sign+=MyHandleError(”在獲取簽名密鑰時(shí)發(fā)生錯誤,程序停止.“);UpdateData(FALSE);return; } } // 因?yàn)榻邮障⒄咭?yàn)證數(shù)字簽名,所以要導(dǎo)出公鑰給接收者。 if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,&dwBlobLen))//得到公鑰的大小 m_state_sign+=”已獲取公鑰的大小,“;else { m_state_sign+=MyHandleError(”計(jì)算公鑰大小時(shí)發(fā)生錯誤,程序停止.“);UpdateData(FALSE);return;} // 為存儲公鑰的緩沖區(qū)分配內(nèi)存。 if((pbKeyBlob =(BYTE*)malloc(dwBlobLen))) m_state_sign+=”已為公鑰分配內(nèi)存n“;else { m_state_sign+=MyHandleError(”為公鑰分配內(nèi)存時(shí)出現(xiàn)異常,退出.n“);UpdateData(FALSE);return;} // 真正導(dǎo)出公鑰數(shù)據(jù) if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbKeyBlob,//公鑰 這個(gè)數(shù)據(jù)可以存入文件,發(fā)送給接收者。一般被存入數(shù)字證書 &dwBlobLen)){ m_pubkey_file.Write(pbKeyBlob,dwBlobLen); m_state_sign+=”已導(dǎo)出公鑰,存儲在“+m_pubkey_file.GetFilePath()+”n“;} else { m_state_sign+=MyHandleError(”導(dǎo)出公鑰時(shí)發(fā)生錯誤,退出“);UpdateData(FALSE);return;} // 創(chuàng)建hash對象 if(CryptCreateHash(hProv,m_hash_sign,//CALG_MD5,0,0,&hHash)){ m_state_sign+=”已創(chuàng)建hash對象,加密算法“+GetHashType(m_hash_sign)+”nn“;} else { m_state_sign+=MyHandleError(”在創(chuàng)建hash對象時(shí)發(fā)生錯誤,退出“);UpdateData(FALSE);return;} //把簽名的數(shù)據(jù)讀入內(nèi)存 //分配空間 if((pbBuffer=(BYTE *)malloc(m_signdatafile.GetLength()))) m_state_sign+=”已經(jīng)為數(shù)據(jù)“+m_signdatafile.GetFilePath()+”分配空間nn“;else { m_state_sign+=MyHandleError(”為數(shù)據(jù)分配內(nèi)存時(shí)發(fā)生異常,退出“);UpdateData(FALSE);return;} if(m_signdatafile.Read(pbBuffer,m_signdatafile.GetLength()))//把數(shù)據(jù)讀入內(nèi)存 m_state_sign+=”數(shù)據(jù)已經(jīng)讀入內(nèi)存!“;else {m_state_sign+=MyHandleError(”數(shù)據(jù)讀入內(nèi)存發(fā)生錯誤,退出“);UpdateData(FALSE);return;} dwBufferLen = m_signdatafile.GetLength();// 對數(shù)據(jù)進(jìn)行hash運(yùn)算 if(CryptHashData(hHash,pbBuffer,dwBufferLen,0)) m_state_sign+=”已對數(shù)據(jù)進(jìn)行hash運(yùn)算n“;else { m_state_sign+=MyHandleError(”在對數(shù)據(jù)進(jìn)行hash運(yùn)算時(shí)發(fā)生錯誤,退出.“);UpdateData(FALSE);return;} // 使用signature key pair的私鑰對hash數(shù)據(jù)簽名 dwSigLen= 0;if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,NULL,&dwSigLen))//得到數(shù)字簽名大小 m_state_sign+=”已獲取數(shù)字簽名的大小,“;else { m_state_sign+=MyHandleError(”計(jì)算數(shù)字簽名大小時(shí)發(fā)生錯誤,退出.“);UpdateData(FALSE);return;} // 為數(shù)字簽名緩沖區(qū)分配內(nèi)存 if((pbSignature =(BYTE *)malloc(dwSigLen))) m_state_sign+=”已為數(shù)字簽名分配緩沖n“;else { m_state_sign+=MyHandleError(”為數(shù)字簽名分配內(nèi)存時(shí)異常,退出.“);UpdateData(FALSE);return;} // 得到數(shù)字簽名 if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,pbSignature, //這里將返回?cái)?shù)字簽名,同被簽名的數(shù)據(jù)一起發(fā)送給接收方 &dwSigLen)) { m_sign_file.Write(pbSignature,dwSigLen); m_state_sign+=”已導(dǎo)出數(shù)字簽名,存儲在“+m_sign_file.GetFilePath()+”nn“;} else { m_state_sign+=MyHandleError(”導(dǎo)出數(shù)字簽名時(shí)發(fā)生異常,退出.“);UpdateData(FALSE);return;} // 銷毀hash對象.if(hHash){ CryptDestroyHash(hHash); m_state_sign+=”銷毀hash對象nn“;} m_state_sign+=”數(shù)字簽名成功nn“;//關(guān)閉文件 m_pubkey_file.Close(),m_sign_file.Close(),m_signdatafile.Close(MessageBox(”數(shù)字簽名成功!“,”“,MB_OK);UpdateData(FALSE);⑤.?dāng)?shù)字簽名認(rèn)證的主要算法及關(guān)鍵代碼 HCRYPTPROV hProv;HCRYPTKEY hPubKey;BYTE *pbKeyBlob;DWORD dwBlobLen;HCRYPTHASH hHash;BYTE *pbSignature; //數(shù)字簽名 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 //密鑰容器不存在創(chuàng)建之 { if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) m_state_veri+=”已創(chuàng)建一個(gè)新的密鑰容器秘鑰生成算法:“+GetProvType(m_prov_veri)+”n“; else { m_state_veri+=MyHandleError2(”在獲取密鑰容器時(shí)發(fā)生錯誤,退出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+=”公鑰已經(jīng)成功導(dǎo)入!nn“;else { m_state_veri+=MyHandleError2(”公鑰導(dǎo)出出錯.n“);UpdateData(FALSE);return;} // 創(chuàng)建哈希對象 if(CryptCreateHash(hProv,m_hash_veri,//CALG_MD5,0,0,&hHash)) m_state_veri+=”已經(jīng)獲取hash對象,hash算法“+GetHashType(m_hash_veri)+”nn“;else { m_state_veri+=MyHandleError2(”創(chuàng)建hash對象時(shí)出錯,退出“);UpdateData(FALSE);return;} // 跟生成時(shí)一樣對數(shù)據(jù)進(jìn)行hash運(yùn)算 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+=”對數(shù)據(jù)hash運(yùn)算成功!nn“;else { m_state_veri+=MyHandleError2(”對數(shù)據(jù)進(jìn)行hash運(yùn)算出錯,退出“);UpdateData(FALSE);return;} // 驗(yàn)證數(shù)字簽名 if(CryptVerifySignature(hHash,pbSignature, //數(shù)字簽名數(shù)據(jù) dwSigLen,hPubKey, //簽名者的公鑰 szDescription,0)) { MessageBox(”恭喜:是正確的數(shù)字簽名!“); m_state_veri+=”恭喜:是正確的數(shù)字簽名!“;} else { MessageBox(”錯誤:簽名是錯誤的n“); m_state_veri+=”錯誤:簽名是錯誤的n請檢查參數(shù)是否設(shè)置正確,若正確則請聯(lián)系發(fā)送方";} 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數(shù)字簽名算法運(yùn)行情況: 4.1 主界面初始化 4.2 簽名界面 4.3 設(shè)置密鑰 4.4 選擇簽名文件 4.5 選擇保存公鑰位置 4.6 選擇選擇簽名后保存位置 4.6 進(jìn)行數(shù)字簽名結(jié)果 4.7 進(jìn)行數(shù)字簽名認(rèn)證 4.8 進(jìn)行數(shù)字簽名認(rèn)證結(jié)果 5.總結(jié)與展望: 通過本次對RSA算法的學(xué)習(xí),明白了該算法加密解密的原理,以及他的安全性問題和缺點(diǎn),通過這幾周的實(shí)驗(yàn),在學(xué)習(xí)中累計(jì)經(jīng)驗(yàn)解決問題,讓我對RSA算法有了較通透的理解,受益匪淺。隨著Internet的發(fā)展,實(shí)現(xiàn)電子商務(wù)是未來的潮流和趨勢,基于Internet開放環(huán)境下的信息安全將越來越受到重視,而RSA算法在身份認(rèn)證,數(shù)字簽名,信息加密等方面得到非常廣泛的應(yīng)用,對它作深入的了解是很有必要的。雖然RSA算法可靠性較高,但是還是有一些缺陷,就是運(yùn)算量太大,速度太慢,適合加密比較短的明文。RSA方法既可用于保密,也可用于簽名和認(rèn)證,目前已經(jīng)廣泛應(yīng)用與各種產(chǎn)品,平臺等軟件上。許多流行的操作系統(tǒng)上如微軟,Apple,Sun和Novell都是在其產(chǎn)品上融入RSA。在硬件上,如安全電話,以太網(wǎng)和智能卡都使用了RSA技術(shù)。而且?guī)缀跛蠭nternet安全協(xié)議如S/MIME,SSL和S/WAN都引入了RSA加密方法。ISO9796標(biāo)準(zhǔn)把RSA列為一種兼容的加密算法??梢灶A(yù)見,在不遠(yuǎn)的幾年內(nèi),RSA的 應(yīng)用將來會越來越廣泛。