版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 1.RSA數(shù)字簽名的目的和意義</p><p> RSA公開密鑰加密算法自20世紀70年代提出以來,已經(jīng)得到了廣泛認可和應(yīng)用。發(fā)展至今,電子安全領(lǐng)域的各方面已經(jīng)形成了較為完備的國際規(guī)范。RSA作為最重要的公開密鑰算法,在各領(lǐng)域的應(yīng)用數(shù)不勝數(shù)。RSA在硬件方面,以技術(shù)成熟的IC應(yīng)用于各種消費類電子產(chǎn)品。</p><p> RSA在軟件方面的應(yīng)用,主要集中在Inter
2、net上。加密連接、數(shù)字簽名和數(shù)字證書的核心算法廣泛使用RSA。日常應(yīng)用中,有比較著名的工具包Open SSL(SSL,Security Socket Layer,是一個安全傳輸協(xié)議,在Internet上進行數(shù)據(jù)保護和身份確認。Open SSL是一個開放源代碼的實現(xiàn)了SSL及相關(guān)加密技術(shù)的軟件包,由加拿大的Eric Yang等發(fā)起編寫的。Open SSL應(yīng)用RSA實現(xiàn)簽名和密鑰交換,已經(jīng)在各種操作系統(tǒng)得到非常廣泛的應(yīng)用。另外,家喻戶曉的
3、IE瀏覽器,自然也實現(xiàn)了SSL協(xié)議,集成了使用RSA技術(shù)的加密功能,結(jié)合MD5和SHA1,主要用于數(shù)字證書和數(shù)字簽名,對于習(xí)慣于使用網(wǎng)上購物和網(wǎng)上銀行的用戶來說,幾乎天天都在使用RSA技術(shù)。</p><p> RSA更出現(xiàn)在要求高度安全穩(wěn)定的企業(yè)級商務(wù)應(yīng)用中。在當今的企業(yè)級商務(wù)應(yīng)用中,不得不提及使用最廣泛的平臺j2ee。事實上,在j2se的標準庫中,就為安全和加密服務(wù)提供了兩組API:JCA和JCE。 JCA
4、(Java Cryptography Architecture)提供基本的加密框架,如證書、數(shù)字簽名、報文摘要和密鑰對產(chǎn)生器; JCA由幾個實現(xiàn)了基本的加密技術(shù)功能的類和接口組成,其中最主要的是java.security包,此軟件包包含的是一組核心的類和接口,Java中數(shù)字簽名的方法就集中在此軟件包中。JCE(Java Cryptography Extension) 在JCA的基礎(chǔ)上作了擴展,JCE也是由幾個軟件包組成,其中最主要的是j
5、avax.crypto包,此軟件包提供了JCE加密技術(shù)操作API。javax.crypto中的Cipher類用于具體的加密和解密。在上述軟件包的實現(xiàn)中,集成了應(yīng)用RSA算法的各種數(shù)據(jù)加密規(guī)范(RSA算法應(yīng)用規(guī)范介紹參見: http://www.rsasecurity.com/rsalabs/node.asp?id=2146 ,這些API內(nèi)部支持的算法不僅</p><p> 2.數(shù)字簽名算法的基本框架</p
6、><p><b> 1.密鑰的產(chǎn)生</b></p><p> ?、龠x擇兩個保密的大素數(shù)P和q。</p><p> ②計算N=p q,≯(N) =(p-1)(g-1),其中≯(N)是N的歐拉函數(shù)值。</p><p> ③選擇一個整數(shù)e,滿足l<e<≯(N),且g c d(≯(N),e)≡1。</p>
7、;<p> ?、苡嬎闼借€d(解密密鑰),滿足e d≡l(mod≯(N)),d是e在模≯(N)下的乘法逆元。 </p><p> ⑤以(e, n)為公鑰,(d ,N)為密鑰,銷毀p,q,≯(N)。</p><p><b> 2.加密</b></p><p> 加密時首先將明文比特串進行分組,使得每個分組對應(yīng)得串在數(shù)值上小于N,
8、 即分組的二進制長度小于l092N。然后,對每個明文分組M,作加密運算: </p><p> C=E k(M)=M e mod N </p><p><b> 3.解密</b></p><p> 對密文分組的解密運算為:</p><p> M=D k (C) =C d mod N </p><
9、p> 由定理1和定理2可以證明解密運算能恢復(fù)明文M </p><p> 并非所有的公開密鑰系統(tǒng),均可同時達到秘密性與數(shù)字簽名功能。一般而言, 一公開密鑰系統(tǒng)若作為密碼系統(tǒng),則無法作為數(shù)字簽名,反之亦然。只有很少數(shù)</p><p> 的系統(tǒng)可同時作為密碼系統(tǒng)和數(shù)字簽名,如本文討論的RSA系統(tǒng)。RSA簽名算</p><p><b> 法如下: &
10、lt;/b></p><p> 設(shè)N=p q,且p和q是兩個大素數(shù),e和d滿足e d≡l(mod ≯(N))。</p><p><b> 公開密鑰:N,e </b></p><p><b> 私有密鑰:d </b></p><p> 簽名過程:發(fā)送方使用自己的私鑰d對明文m進行數(shù)字簽名
11、變換: y=x d mod N:并將加密后的消息和簽名y發(fā)送給接收方; </p><p> 驗證過程:接收方使用發(fā)送方的公鑰e對收到的消息y進行數(shù)字簽名驗證變換x’=ye mod N,并使用發(fā)送方的密鑰解密恢復(fù)消息x,比較x’與x,如果x’=x則證實發(fā)送方的身份合法。</p><p> 這樣,用戶A若想用RSA簽名方案對消息x簽名,他只需公開他的公鑰N和e,由于簽名算法是保密的,因此A
12、是唯一能產(chǎn)生簽名的人,任何要驗證用戶A 簽名的用戶只需查到A的公鑰即可驗證簽名。</p><p> 對于實現(xiàn)簽名和公鑰加密的組合,常用方法是:假定通信雙方為A和B。對于明文x,A計算他的簽名y=x d mod N,然后利用B的公開加密函數(shù)EB對信息對(x, y)加密得到Z,將密文Z傳送給B,當B收到密文Z后,他首先用他的解密函數(shù)DB來解密得到(x,y)=DB (Z)= DB (EB(x,y)),然后利用A的驗證
13、算法來檢查x’=x=y e mod N是否成立。</p><p> 3.主要模塊的算法以及關(guān)鍵代碼</p><p> ?、伲募x擇模塊的主要算法及關(guān)鍵代碼</p><p> CfileDialog dlg(TRUE,NULL,".\\簽名的文件",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL)
14、;</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> m_file_sign=dlg.GetPathName();</p><p><b> }</b></p><p> else m_file
15、_sign="";</p><p> UpdateData(FALSE);</p><p> ②.保存公鑰的文件路徑的主要算法及關(guān)鍵代碼</p><p> CFileDialog dlg(FALSE,NULL,".\\公鑰",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);
16、</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> m_pkey_sign=dlg.GetPathName();</p><p><b> }</b></p><p> else m_pkey_
17、sign="";</p><p> UpdateData(FALSE);</p><p> ?、郏4婧灻蟮奈募穆窂街饕惴瓣P(guān)鍵代碼</p><p> CFileDialog dlg(FALSE,NULL,".\\簽名后的文件",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NU
18、LL);</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> m_signed_sign=dlg.GetPathName();</p><p><b> }</b></p><p> else m
19、_signed_sign="";</p><p> UpdateData(FALSE);</p><p> ④.數(shù)字簽名的主要算法及關(guān)鍵代碼</p><p> HCRYPTPROV hProv;//秘鑰容器句柄 </p><p> BYTE *pbBuffer;//被簽名的數(shù)據(jù)</p><p&g
20、t; HCRYPTHASH hHash;</p><p> HCRYPTKEY hKey;</p><p> BYTE *pbKeyBlob;//簽名者得公鑰數(shù)據(jù)</p><p> BYTE *pbSignature;//數(shù)字簽名</p><p> DWORD dwSigLen;</p><p>
21、 DWORD dwBlobLen;</p><p> DWORD dwBufferLen;</p><p> LPTSTR szDescription = ""; </p><p> CFile m_pubkey_file,m_sign_file,m_signdatafile;</p><p> if(m_pke
22、y_sign==""||!m_pubkey_file.Open(m_pkey_sign,CFile::modeCreate|CFile::modeReadWrite))</p><p><b> {</b></p><p> MessageBox("請選擇正確的保存公鑰的文件路徑");return;</p>&
23、lt;p><b> }</b></p><p> if(m_file_sign==""||!m_signdatafile.Open(m_file_sign,CFile::modeReadWrite))</p><p><b> {</b></p><p> MessageBox("
24、;請選擇正確的文件路徑");return;</p><p><b> }</b></p><p> if(m_signed_sign==""||!m_sign_file.Open(m_signed_sign,CFile::modeCreate|CFile::modeReadWrite))</p><p><
25、;b> {</b></p><p> MessageBox("請選擇正確保存數(shù)字簽名的文件路徑");return;</p><p><b> }</b></p><p> UpdateData(TRUE);</p><p> m_state_sign=""
26、;;</p><p> //獲取缺省的秘鑰容器</p><p> if(CryptAcquireContext(</p><p><b> &hProv, </b></p><p><b> NULL, </b></p><p><b> NULL
27、, </b></p><p> m_prov_sign,</p><p><b> 0))</b></p><p><b> {</b></p><p> m_state_sign+="已獲取CSP上下文,秘鑰生成算法:"+GetProvType(m_prov
28、_sign)+"\n";</p><p><b> }</b></p><p><b> else</b></p><p> //密鑰容器不存在創(chuàng)建之</p><p><b> {</b></p><p> if(Crypt
29、AcquireContext(</p><p><b> &hProv, </b></p><p><b> NULL, </b></p><p><b> NULL, </b></p><p> m_prov_sign, </p><p&g
30、t; CRYPT_NEWKEYSET)) </p><p> m_state_sign+="已創(chuàng)建一個新的密鑰容器,秘鑰生成算法:"+GetProvType(m_prov_sign)+"\n";</p><p><b> else</b></p><p> {m_state_sign+=MyHa
31、ndleError("在獲取CSP時發(fā)生錯誤,程序停止.");UpdateData(FALSE);return;}</p><p><b> }</b></p><p> // 從密鑰容器中取數(shù)字簽名用的密鑰</p><p> if(CryptGetUserKey( </p><p> h
32、Prov, </p><p> AT_SIGNATURE, </p><p><b> &hKey)) </b></p><p> m_state_sign+="簽名密鑰已經(jīng)獲取. \n";</p><p><b> else</b></p>
33、;<p><b> {</b></p><p> if(GetLastError() == NTE_NO_KEY) //密鑰容器里不存在signature key pair創(chuàng)建之</p><p><b> {</b></p><p> if(CryptGenKey(</p><p&
34、gt; hProv,//CSP句柄</p><p> AT_SIGNATURE,//創(chuàng)建的密鑰對類型為signature key pair</p><p> 0,//key類型,這里用默認值</p><p> &hKey)) //創(chuàng)建成功返回新創(chuàng)建的密鑰對的句柄</p><p> m_state_sign+=
35、"創(chuàng)建一個秘鑰對\n";</p><p><b> else</b></p><p> {m_state_sign+=MyHandleError("在創(chuàng)建簽名密鑰對時發(fā)生錯誤,程序停止.\n"); UpdateData(FALSE);return;}</p><p><b> }<
36、/b></p><p><b> else</b></p><p><b> {</b></p><p> m_state_sign+=MyHandleError("在獲取簽名密鑰時發(fā)生錯誤,程序停止.");UpdateData(FALSE);return;</p><p
37、><b> }</b></p><p><b> }</b></p><p> // 因為接收消息者要驗證數(shù)字簽名,所以要導(dǎo)出公鑰給接收者。</p><p> if(CryptExportKey( </p><p><b> hKey, </b><
38、;/p><p><b> NULL, </b></p><p> PUBLICKEYBLOB,</p><p><b> 0, </b></p><p><b> NULL, </b></p><p> &dwBlobLen))
39、 //得到公鑰的大小</p><p> m_state_sign+="已獲取公鑰的大小,";</p><p><b> else</b></p><p> {m_state_sign+=MyHandleError("計算公鑰大小時發(fā)生錯誤,程序停止.");UpdateData(FALSE);ret
40、urn;}</p><p> // 為存儲公鑰的緩沖區(qū)分配內(nèi)存。</p><p> if((pbKeyBlob = (BYTE*)malloc(dwBlobLen))) </p><p> m_state_sign+="已為公鑰分配內(nèi)存\n";</p><p><b> else</b><
41、;/p><p> {m_state_sign+=MyHandleError("為公鑰分配內(nèi)存時出現(xiàn)異常,退出. \n");UpdateData(FALSE);return;}</p><p> // 真正導(dǎo)出公鑰數(shù)據(jù)</p><p> if(CryptExportKey( </p><p><b> h
42、Key, </b></p><p><b> NULL, </b></p><p> PUBLICKEYBLOB, </p><p><b> 0, </b></p><p> pbKeyBlob, //公鑰 這個數(shù)據(jù)可以存入文件,發(fā)送給接收者。一般被存
43、入數(shù)字證書</p><p> &dwBlobLen))</p><p><b> {</b></p><p> m_pubkey_file.Write(pbKeyBlob,dwBlobLen);</p><p> m_state_sign+="已導(dǎo)出公鑰,存儲在"+m_pubkey_f
44、ile.GetFilePath()+"\n";</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> m_state_sign+=MyHandleError(&quo
45、t;導(dǎo)出公鑰時發(fā)生錯誤,退出");UpdateData(FALSE);return;</p><p><b> }</b></p><p> // 創(chuàng)建hash對象</p><p> if(CryptCreateHash(</p><p><b> hProv, </b></
46、p><p> m_hash_sign,//CALG_MD5, </p><p><b> 0, </b></p><p><b> 0, </b></p><p><b> &hHash)) </b></p><p><b> {
47、</b></p><p> m_state_sign+="已創(chuàng)建hash對象,加密算法"+GetHashType(m_hash_sign)+"\n\n";</p><p><b> }</b></p><p><b> else</b></p><
48、;p> {m_state_sign+=MyHandleError("在創(chuàng)建hash對象時發(fā)生錯誤,退出");UpdateData(FALSE);return;}</p><p> //把簽名的數(shù)據(jù)讀入內(nèi)存</p><p><b> //分配空間</b></p><p> if((pbBuffer=(BYTE
49、 *)malloc(m_signdatafile.GetLength())))</p><p> m_state_sign+="已經(jīng)為數(shù)據(jù)"+m_signdatafile.GetFilePath()+"分配空間\n\n";</p><p><b> else</b></p><p> { m_s
50、tate_sign+=MyHandleError("為數(shù)據(jù)分配內(nèi)存時發(fā)生異常,退出");UpdateData(FALSE);return;}</p><p> if(m_signdatafile.Read(pbBuffer,m_signdatafile.GetLength()))//把數(shù)據(jù)讀入內(nèi)存</p><p> m_state_sign+="數(shù)據(jù)已經(jīng)讀
51、入內(nèi)存!";</p><p> else {m_state_sign+=MyHandleError("數(shù)據(jù)讀入內(nèi)存發(fā)生錯誤,退出");UpdateData(FALSE);return;}</p><p> dwBufferLen = m_signdatafile.GetLength();</p><p> // 對數(shù)據(jù)進行hash
52、運算</p><p> if(CryptHashData(</p><p><b> hHash, </b></p><p> pbBuffer, </p><p> dwBufferLen, </p><p><b> 0)) </b></p>&l
53、t;p> m_state_sign+="已對數(shù)據(jù)進行hash運算\n";</p><p><b> else</b></p><p> {m_state_sign+=MyHandleError("在對數(shù)據(jù)進行hash運算時發(fā)生錯誤,退出.");UpdateData(FALSE);return;}</p>
54、<p> // 使用signature key pair的私鑰對hash數(shù)據(jù)簽名</p><p> dwSigLen= 0;</p><p> if(CryptSignHash(</p><p><b> hHash, </b></p><p> AT_SIGNATURE, </p>
55、<p> szDescription, </p><p><b> 0, </b></p><p><b> NULL, </b></p><p> &dwSigLen)) //得到數(shù)字簽名大小</p><p> m_state_sign+="已獲取數(shù)字簽名的
56、大小,";</p><p><b> else</b></p><p> {m_state_sign+=MyHandleError("計算數(shù)字簽名大小時發(fā)生錯誤,退出.");UpdateData(FALSE);return;}</p><p> // 為數(shù)字簽名緩沖區(qū)分配內(nèi)存</p><
57、p> if((pbSignature = (BYTE *)malloc(dwSigLen)))</p><p> m_state_sign+="已為數(shù)字簽名分配緩沖\n";</p><p><b> else</b></p><p> {m_state_sign+=MyHandleError("為數(shù)
58、字簽名分配內(nèi)存時異常,退出.");UpdateData(FALSE);return;}</p><p><b> // 得到數(shù)字簽名</b></p><p> if(CryptSignHash(</p><p><b> hHash, </b></p><p> AT_SIGNAT
59、URE, </p><p> szDescription, </p><p><b> 0, </b></p><p> pbSignature, //這里將返回數(shù)字簽名,同被簽名的數(shù)據(jù)一起發(fā)送給接收方</p><p> &dwSigLen)) </p><p><b>
60、 {</b></p><p> m_sign_file.Write(pbSignature,dwSigLen);</p><p> m_state_sign+="已導(dǎo)出數(shù)字簽名,存儲在"+m_sign_file.GetFilePath()+"\n\n";</p><p><b> }</b&
61、gt;</p><p><b> else</b></p><p><b> {</b></p><p> m_state_sign+=MyHandleError("導(dǎo)出數(shù)字簽名時發(fā)生異常,退出.");UpdateData(FALSE);return;</p><p>&l
62、t;b> }</b></p><p> // 銷毀hash對象.</p><p><b> if(hHash)</b></p><p><b> {</b></p><p> CryptDestroyHash(hHash);</p><p> m
63、_state_sign+="銷毀hash對象\n\n";</p><p><b> }</b></p><p> m_state_sign+="數(shù)字簽名成功\n\n";</p><p><b> //關(guān)閉文件</b></p><p> m_pubkey
64、_file.Close(),m_sign_file.Close(),m_signdatafile.Close();</p><p> MessageBox("數(shù)字簽名成功!","",MB_OK);</p><p> UpdateData(FALSE);</p><p> ?、荩當?shù)字簽名認證的主要算法及關(guān)鍵代碼</p&
65、gt;<p> HCRYPTPROV hProv;</p><p> HCRYPTKEY hPubKey;</p><p> BYTE *pbKeyBlob;</p><p> DWORD dwBlobLen;</p><p> HCRYPTHASH hHash;</p><p> BYTE
66、*pbSignature;//數(shù)字簽名</p><p> DWORD dwSigLen;</p><p> LPTSTR szDescription = "";</p><p> UpdateData(TRUE);</p><p> m_state_veri="";</p>
67、<p> // 獲得CSP句柄,密鑰容器名為登陸用戶名</p><p> if(CryptAcquireContext(</p><p><b> &hProv, </b></p><p><b> NULL, </b></p><p><b> NULL, &
68、lt;/b></p><p> PROV_RSA_FULL, </p><p><b> 0))</b></p><p><b> {</b></p><p> m_state_veri+="已獲取CSP,秘鑰生成算法:"+GetProvType(m_prov_ve
69、ri)+"\n";</p><p><b> }</b></p><p><b> else</b></p><p> //密鑰容器不存在創(chuàng)建之</p><p><b> {</b></p><p> if(CryptAcq
70、uireContext(</p><p><b> &hProv, </b></p><p><b> NULL, </b></p><p><b> NULL, </b></p><p> PROV_RSA_FULL, </p><p>
71、; CRYPT_NEWKEYSET)) </p><p> m_state_veri+="已創(chuàng)建一個新的密鑰容器秘鑰生成算法:"+GetProvType(m_prov_veri)+"\n";</p><p><b> else</b></p><p> {m_state_veri+=MyHand
72、leError2("在獲取密鑰容器時發(fā)生錯誤,退出\n");UpdateData(FALSE);return;}</p><p><b> }</b></p><p> CFile signdatafile,yuanwenfile,pubkeyfile;</p><p> if(m_pkey_veri=="&
73、quot;||!pubkeyfile.Open(m_pkey_veri,CFile::modeReadWrite))</p><p><b> {</b></p><p> MessageBox("請選擇正確的公鑰文件!");return;</p><p><b> }</b></p>
74、<p> if(m_file_veri==""||!yuanwenfile.Open(m_file_veri,CFile::modeReadWrite))</p><p><b> {</b></p><p> MessageBox("請選擇正確的原文件!");return;</p><p
75、><b> }</b></p><p> if(m_signed_veri==""||!signdatafile.Open(m_signed_veri,CFile::modeReadWrite))</p><p><b> {</b></p><p> MessageBox("
76、請選擇正確的簽名文件!");return;</p><p><b> }</b></p><p> dwBlobLen=pubkeyfile.GetLength();</p><p> pbKeyBlob=(BYTE *)malloc(dwBlobLen);</p><p> pubkeyfile.Re
77、ad(pbKeyBlob,dwBlobLen);</p><p> if(CryptImportKey(</p><p><b> hProv,</b></p><p> pbKeyBlob,</p><p> dwBlobLen,</p><p><b> 0,</b&
78、gt;</p><p><b> 0,</b></p><p> &hPubKey))</p><p> m_state_veri+="公鑰已經(jīng)成功導(dǎo)入!\n\n";</p><p><b> else</b></p><p><b&
79、gt; {</b></p><p> m_state_veri+=MyHandleError2("公鑰導(dǎo)出出錯.\n");UpdateData(FALSE);return;</p><p><b> }</b></p><p><b> // 創(chuàng)建哈希對象</b></p>
80、<p> if(CryptCreateHash(</p><p><b> hProv, </b></p><p> m_hash_veri,//CALG_MD5, </p><p><b> 0, </b></p><p><b> 0, </b>&l
81、t;/p><p><b> &hHash)) </b></p><p> m_state_veri+="已經(jīng)獲取hash對象,hash算法"+GetHashType(m_hash_veri)+"\n\n";</p><p><b> else</b></p>
82、<p><b> {</b></p><p> m_state_veri+=MyHandleError2("創(chuàng)建hash對象時出錯,退出");UpdateData(FALSE);return;</p><p><b> }</b></p><p> // 跟生成時一樣對數(shù)據(jù)進行hash
83、運算</p><p> BYTE *pbBuffer;</p><p> pbBuffer=(BYTE *)malloc(yuanwenfile.GetLength());</p><p> yuanwenfile.Read(pbBuffer,yuanwenfile.GetLength());</p><p> DWORD dwBuf
84、ferLen = yuanwenfile.GetLength();</p><p> pbSignature=(BYTE *)malloc(signdatafile.GetLength());</p><p> signdatafile.Read(pbSignature,signdatafile.GetLength());</p><p> dwSigLen
85、= signdatafile.GetLength();</p><p> if(CryptHashData(</p><p><b> hHash, </b></p><p> pbBuffer, </p><p> dwBufferLen, </p><p><b> 0))
86、 </b></p><p> m_state_veri+="對數(shù)據(jù)hash運算成功!\n\n";</p><p><b> else</b></p><p><b> {</b></p><p> m_state_veri+=MyHandleError2(&q
87、uot;對數(shù)據(jù)進行hash運算出錯,退出");UpdateData(FALSE);return;</p><p><b> }</b></p><p><b> // 驗證數(shù)字簽名</b></p><p> if(CryptVerifySignature(</p><p><b
88、> hHash, </b></p><p> pbSignature,//數(shù)字簽名數(shù)據(jù)</p><p> dwSigLen, </p><p> hPubKey,//簽名者的公鑰</p><p> szDescription, </p><p><b> 0)) </
89、b></p><p><b> {</b></p><p> MessageBox("恭喜:是正確的數(shù)字簽名!");</p><p> m_state_veri+="恭喜:是正確的數(shù)字簽名!";</p><p><b> }</b></p&
90、gt;<p><b> else</b></p><p><b> {</b></p><p> MessageBox("錯誤:簽名是錯誤的\n");</p><p> m_state_veri+="錯誤:簽名是錯誤的\n請檢查參數(shù)是否設(shè)置正確,若正確則請聯(lián)系發(fā)送方&qu
91、ot;;</p><p><b> }</b></p><p> UpdateData(FALSE);</p><p> //--------------------------------------------------------------------</p><p> // Free memory t
92、o be used to store signature.</p><p> if(pbSignature)</p><p> free(pbSignature);</p><p> if(pbKeyBlob)</p><p> free(pbKeyBlob);</p><p> // Destroy the
93、 hash object.</p><p> if(hHash) </p><p> CryptDestroyHash(hHash);</p><p> // Release the provider handle.</p><p> if(hProv) </p><p> CryptReleaseConte
94、xt(hProv, 0);</p><p> signdatafile.Close(),yuanwenfile.Close(),pubkeyfile.Close();</p><p> 4. RSA數(shù)字簽名算法運行情況:</p><p> 4.1 主界面初始化</p><p><b> 4.2 簽名界面</b>&
95、lt;/p><p><b> 4.3 設(shè)置密鑰</b></p><p> 4.4 選擇簽名文件</p><p> 4.5 選擇保存公鑰位置</p><p> 4.6 選擇選擇簽名后保存位置</p><p> 4.6 進行數(shù)字簽名結(jié)果</p><p> 4.7 進行數(shù)
96、字簽名認證</p><p> 4.8 進行數(shù)字簽名認證結(jié)果</p><p><b> 5. 總結(jié)與展望:</b></p><p> 通過本次對RSA算法的學(xué)習(xí),明白了該算法加密解密的原理,以及他的安全性問題和缺點,通過這幾周的實驗,在學(xué)習(xí)中累計經(jīng)驗解決問題,讓我對RSA算法有了較通透的理解,受益匪淺。隨著Internet的發(fā)展,實現(xiàn)電子商
97、務(wù)是未來的潮流和趨勢,基于Internet開放環(huán)境下的信息安全將越來越受到重視,而RSA算法在身份認證,數(shù)字簽名,信息加密等方面得到非常廣泛的應(yīng)用,對它作深入的了解是很有必要的。雖然RSA算法可靠性較高,但是還是有一些缺陷,就是運算量太大,速度太慢,適合加密比較短的明文。RSA方法既可用于保密,也可用于簽名和認證,目前已經(jīng)廣泛應(yīng)用與各種產(chǎn)品,平臺等軟件上。許多流行的操作系統(tǒng)上如微軟,Apple,Sun和Novell都是在其產(chǎn)品上融入RS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理數(shù)字簽名和群數(shù)字簽名的分析與設(shè)計.pdf
- 代理數(shù)字簽名.pdf
- 06 數(shù)字簽名1
- 數(shù)字簽名系統(tǒng)-現(xiàn)代密碼學(xué)課程設(shè)計任務(wù)書
- 消息認證與數(shù)字簽名
- 數(shù)字簽名及應(yīng)用.pdf
- 面向群體數(shù)字簽名.pdf
- 數(shù)字簽名體制的分析與設(shè)計.pdf
- 數(shù)字簽名方案的設(shè)計與研究.pdf
- 橢圓曲線數(shù)字簽名的FPGA設(shè)計.pdf
- 數(shù)字簽名算法的研究與設(shè)計.pdf
- 數(shù)字簽名技術(shù)畢業(yè)論文--數(shù)字簽名在電子商務(wù)中的應(yīng)用
- 數(shù)字簽名體制的研究與設(shè)計.pdf
- rsa數(shù)字簽名畢業(yè)論文
- 面向群體的數(shù)字簽名.pdf
- 無證書數(shù)字簽名方案研究
- 無證書數(shù)字簽名研究.pdf
- 數(shù)字簽名變化及其應(yīng)用.pdf
- 數(shù)字簽名技術(shù)研究.pdf
- 數(shù)字簽名的公平交換.pdf
評論
0/150
提交評論