數(shù)字簽名課程設(shè)計_第1頁
已閱讀1頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論