安全協(xié)議實(shí)驗(yàn)報(bào)告(基于openssl-cryptoapi的數(shù)字簽名系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn))_第1頁(yè)
已閱讀1頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  上海電力學(xué)院</b></p><p><b>  安全協(xié)議大作業(yè)</b></p><p>  題目: 基于OpenSSL/CryptoAPI的數(shù)字簽名系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)          </p><

2、;p>  學(xué)號(hào): 20103277 學(xué)生姓名: 李鑫 </p><p>  院系:  計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院   </p><p>  專業(yè):  信息安全 </p><p>  班 級(jí): 2010251 </p><p>  2013年 12 月 13 日</p>&

3、lt;p>  基于OpenSSL/CryptoAPI的數(shù)字簽名系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  李鑫</b></p><p> ?。ㄉ虾k娏W(xué)院 信息安全系,上海市 201300)</p><p>  摘要:數(shù)字簽名(又稱公鑰數(shù)字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實(shí)現(xiàn),用于鑒別數(shù)字信

4、息的方法。一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名,另一個(gè)用于驗(yàn)證。數(shù)字簽名,就是只有信息的發(fā)送者才能產(chǎn)生的別人無(wú)法偽造的一段數(shù)字串,這段數(shù)字串同時(shí)也是對(duì)信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明。數(shù)字簽名是非對(duì)稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。數(shù)字簽名了的文件的完整性是很容易驗(yàn)證的(不需要騎縫章,騎縫簽名,也不需要筆跡專家),而且數(shù)字簽名具有不可抵賴性(不需要筆跡專家來(lái)驗(yàn)證)。</p><p>  關(guān)鍵

5、字:數(shù)字簽名;簽名驗(yàn)證;哈希算法</p><p><b>  引言</b></p><p>  1. CryptoAPI簡(jiǎn)介</p><p>  CryptoAPI是一組函數(shù),為了完成數(shù)學(xué)計(jì)算,必須具有密碼服務(wù)提供者模塊(CSP)。Microsoft通過(guò)捆綁RSA Base Provider在操作系統(tǒng)級(jí)提供一個(gè)CSP,使用RSA公司的公鑰加密算

6、法,更多的CSP可以根據(jù)需要增加到應(yīng)用中。事實(shí)上,CSP有可能與特殊硬件設(shè)備(如智能卡)一起來(lái)進(jìn)行數(shù)據(jù)加密。CryptoAPI接口允許簡(jiǎn)單的函數(shù)調(diào)用來(lái)加密數(shù)據(jù),交換公鑰,散列一個(gè)消息來(lái)建立摘要以及生成數(shù)字簽名。它還提供高級(jí)的管理操作,如從一組可能的CSP中使用一個(gè)CSP。此外,CryptoAPI還為許多高級(jí)安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET,用于加密客戶機(jī)/服務(wù)器消息的PCT,用于在各個(gè)平臺(tái)之間來(lái)回傳遞機(jī)密數(shù)據(jù)和密鑰的PFX

7、,代碼簽名等等。</p><p>  目前支持CryptoAPI的Windows系統(tǒng)有:Windows 95 OSR2、Windows NT SP3及后續(xù)版本、Windows 98、Windows 2000等。CryptoAPI的配置信息存儲(chǔ)在注冊(cè)表中,包括如下密鑰:</p><p>  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \ Cryptograph

8、y \Defaults</p><p>  HKEY_CURRENT_USER\ Software \ Microsoft \ Cryptography \Providers</p><p><b>  2. 數(shù)據(jù)加密原理</b></p><p>  CryptoAPI使用兩種密鑰:會(huì)話密鑰與公共/私人密鑰對(duì)。會(huì)話密鑰使用相同的加密和解密密鑰,

9、這種算法較快,但必須保證密鑰的安全傳遞。公共/私人密鑰對(duì)使用一個(gè)公共密鑰和一個(gè)私人密鑰,私人密鑰只有專人才能使用,公共密鑰可以廣泛傳播。如果密鑰對(duì)中的一個(gè)用于加密,另一個(gè)一定用于解密。公共/私人密鑰對(duì)算法很慢,一般只用于加密小批量數(shù)據(jù),例如用于加密會(huì)話密鑰。</p><p>  CryptoAPI支持兩種基本的編碼方法:流式編碼和塊編碼。流式編碼在明碼文本的每一位上創(chuàng)建編碼位,速度較快,但安全性較低。塊編碼在一個(gè)

10、完整的塊上(一般為64位)工作,需要使用填充的方法對(duì)要編碼的數(shù)據(jù)進(jìn)行舍入,以組成多個(gè)完整的塊。這種算法速度較慢,但更安全。</p><p><b>  實(shí)驗(yàn)原理</b></p><p><b>  基本介紹</b></p><p>  簡(jiǎn)單地說(shuō),所謂數(shù)字簽名就是附加在數(shù)據(jù)單元上的一些數(shù)據(jù),或是對(duì)數(shù)據(jù)單元所作的密碼變換。這種

11、數(shù)據(jù)或變換允許數(shù)據(jù)單元的接收者用以確認(rèn)數(shù)據(jù)單元的來(lái)源和數(shù)據(jù)單元的完整性并保護(hù)數(shù)據(jù),防止被人(例如接收者)進(jìn)行偽造。它是對(duì)電子形式的消息進(jìn)行簽名的一種方法,一個(gè)簽名消息能在一個(gè)通信網(wǎng)絡(luò)中傳輸?;诠€密碼體制和私鑰密碼體制都可以獲得數(shù)字簽名,主要是基于公鑰密碼體制的數(shù)字簽名。包括普通數(shù)字簽名和特殊數(shù)字簽名。普通數(shù)字簽名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-S

12、chnorr-Shamir數(shù)字簽名算法、Des/DSA,橢圓曲線數(shù)字簽名算法和有限自動(dòng)機(jī)數(shù)字簽名算法等。特殊數(shù)字簽名有盲簽名、代理簽名、群簽名、不可否認(rèn)簽名、公平盲簽名、門限簽名、具有消息恢復(fù)功能的簽名等,它與具體應(yīng)用環(huán)境密切相關(guān)。顯然,數(shù)字簽名的應(yīng)用涉及到法律問(wèn)題,美國(guó)聯(lián)邦政府基于有限域上的離散對(duì)數(shù)問(wèn)題制定了自己的數(shù)字簽名標(biāo)準(zhǔn)(DSS)。</p><p><b>  主要功能</b><

13、;/p><p>  保證信息傳輸?shù)耐暾?、發(fā)送者的身份認(rèn)證、防止交易中的抵賴發(fā)生。</p><p>  數(shù)字簽名技術(shù)是將摘要信息用發(fā)送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對(duì)收到的原文產(chǎn)生一個(gè)摘要信息,與解密的摘要信息對(duì)比。如果相同,則說(shuō)明收到的信息是完整的,在傳輸過(guò)程中沒有被修改,否則說(shuō)明信息被修改過(guò),因此數(shù)字簽名能夠驗(yàn)證信

14、息的完整性。</p><p>  數(shù)字簽名是個(gè)加密的過(guò)程,數(shù)字簽名驗(yàn)證是個(gè)解密的過(guò)程。</p><p><b>  簽名過(guò)程</b></p><p>  “發(fā)送報(bào)文時(shí),發(fā)送方用一個(gè)哈希函數(shù)從報(bào)文文本中生成報(bào)文摘要,然后用自己的私人密鑰對(duì)這個(gè)摘要進(jìn)行加密,這個(gè)加密后的摘要將作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函

15、數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文摘要,接著再用發(fā)送方的公用密鑰來(lái)對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,如果這兩個(gè)摘要相同、那么接收方就能確認(rèn)該數(shù)字簽名是發(fā)送方的。</p><p>  數(shù)字簽名有兩種功效:一是能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來(lái)的,因?yàn)閯e人假冒不了發(fā)送方的簽名。二是數(shù)字簽名能確定消息的完整性。因?yàn)閿?shù)字簽名的特點(diǎn)是它代表了文件的特征,文件如果發(fā)生改變,數(shù)字簽名的值也將發(fā)生變化。不同的文件將得到不同的數(shù)字簽名

16、。 一次數(shù)字簽名涉及到一個(gè)哈希函數(shù)、發(fā)送者的公鑰、發(fā)送者的私鑰?!?lt;/p><p>  數(shù)字簽名:發(fā)送方用自己的密鑰對(duì)報(bào)文X進(jìn)行Encrypt(編碼)運(yùn)算,生成不可讀取的密文Dsk,然后將Dsk傳送給接收方,接收方為了核實(shí)簽名,用發(fā)送方的公用密鑰進(jìn)行Decrypt(解碼)運(yùn)算,還原報(bào)文。</p><p><b>  設(shè)計(jì)流程圖</b></p><p

17、><b>  實(shí)驗(yàn)設(shè)備</b></p><p>  PC機(jī),Windows XP,VC++6.0. </p><p><b>  實(shí)驗(yàn)過(guò)程</b></p><p><b>  實(shí)驗(yàn)流程圖</b></p><p><b>  必要的截圖</b><

18、/p><p><b>  實(shí)驗(yàn)總結(jié)</b></p><p>  由于過(guò)于復(fù)雜的加密算法實(shí)現(xiàn)起來(lái)非常困難,所以在過(guò)去,許多應(yīng)用程序只能使用非常簡(jiǎn)單的加密技術(shù),這樣做的結(jié)果就是加密的數(shù)據(jù)很容易被人破譯。而使用Microsoft提供的加密應(yīng)用程序接口(即Cryptography API),或稱CryptoAPI,可以方便地在應(yīng)用程序中加入強(qiáng)大的加密功能,而不必考慮基本的算法。本

19、文將對(duì)CryptoAPI及其使用的數(shù)據(jù)加密原理作一簡(jiǎn)單的介紹,然后給出了用CryptoAPI編寫加密程序的大致步驟,最后以一個(gè)文件的加密、解密程序?yàn)槔菔綜ryptoAPI的部分功能。</p><p>  利用了CryptAPI,加密解密功能變得異常簡(jiǎn)單,只需要調(diào)用相關(guān)的函數(shù)即可,而不用關(guān)心具體過(guò)程,開發(fā)商已經(jīng)為我們做了相關(guān)的內(nèi)部工作。用它來(lái)實(shí)現(xiàn)數(shù)字簽名,也變得十分便捷,只需要按照微軟的要求調(diào)用相關(guān)的函數(shù)就可以了

20、,實(shí)驗(yàn)過(guò)程中利用了網(wǎng)上的資料和書本的光盤資料。雖然寫程序過(guò)程中遇到了各種問(wèn)題,但是在網(wǎng)上收集資料后都予以解決了。經(jīng)過(guò)學(xué)習(xí),對(duì)CryptAPI編程有了一點(diǎn)了解,需要學(xué)習(xí)的東西還很多。</p><p><b>  實(shí)驗(yàn)源代碼:</b></p><p>  在VC++6.0下實(shí)現(xiàn)基于哈希的數(shù)字簽名。</p><p>  聲明的頭文件和函數(shù):</

21、p><p>  #include <stdio.h></p><p>  #include <windows.h></p><p>  #include <wincrypt.h></p><p>  #include <cstring></p><p><b>  

22、//函數(shù)申明</b></p><p>  void HandleError(char *s);</p><p>  HCRYPTPROV GetCryptProv();</p><p>  void print(char *s);</p><p><b>  變量聲明:</b></p><

23、p>  // 變量申明及初始化</p><p>  HCRYPTPROV hProv;</p><p>  // BYTE *pbBuffer= (BYTE *)"The data that is to be hashed and signed.";</p><p>  // DWORD dwBufferLen = strlen((ch

24、ar *)pbBuffer)+1;</p><p>  BYTE *pbBuffer;</p><p>  DWORD dwBufferLen;</p><p>  HCRYPTHASH hHash;</p><p>  HCRYPTKEY hKey;</p><p>  HCRYPTKEY hPubKey;</

25、p><p>  BYTE *pbKeyBlob; </p><p>  BYTE *pbSignature;</p><p>  DWORD dwSigLen;</p><p>  DWORD dwBlobLen;</p><p>  CString string;</p><p> 

26、 LPTSTR szDescription = "Test Data Description";</p><p><b>  初始化代碼:</b></p><p>  BOOL CMyDlg::OnInitDialog()</p><p><b>  {</b></p><p>

27、  // TODO: Add extra initialization here</p><p>  m_edit="我是李鑫,來(lái)自2010251班,學(xué)號(hào)20103277,有事您說(shuō)話!";</p><p>  SetDlgItemText(IDC_EDIT1,m_edit);</p><p>  GetDlgItem(IDOK2)->Ena

28、bleWindow(FALSE);</p><p>  return TRUE; // return TRUE unless you set the focus to a control</p><p><b>  }</b></p><p><b>  添加的代碼:</b></p><p> 

29、 //////////////////////////////////////////////////////////////////////////</p><p>  void CMyDlg::OnOK() </p><p><b>  {</b></p><p>  // TODO: Add extra validation here&l

30、t;/p><p>  string="";</p><p>  UpdateData(TRUE);</p><p>  pbBuffer=(BYTE *)m_edit.GetBuffer(m_edit.GetLength());</p><p>  dwBufferLen=strlen(m_edit);</p>

31、<p>  //-------------------------------------------------------------------</p><p>  // 獲取CSP句柄</p><p>  hProv = GetCryptProv();</p><p>  //------------------------------------

32、-------------------------------</p><p>  // 獲取密鑰對(duì),其中的私鑰用于創(chuàng)建數(shù)字簽名,公鑰將用于驗(yàn)證簽名。</p><p>  if (CryptGenKey(</p><p><b>  hProv,</b></p><p>  AT_SIGNATURE,</p>

33、<p><b>  0,</b></p><p><b>  &hKey))</b></p><p><b>  {</b></p><p>  print("簽名密鑰對(duì)已經(jīng)被獲取.\n");</p><p><b>  }&

34、lt;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("創(chuàng)建簽名密鑰出錯(cuò).\n");</p><p><b>  }</b></p><p&g

35、t;  //-------------------------------------------------------------------</p><p>  // 導(dǎo)出密鑰對(duì)的公鑰,確定密鑰塊數(shù)據(jù)長(zhǎng)度</p><p>  if (CryptExportKey(</p><p><b>  hKey,</b></p>&l

36、t;p><b>  NULL,</b></p><p>  PUBLICKEYBLOB,</p><p><b>  0,</b></p><p><b>  NULL,</b></p><p>  &dwBlobLen))</p><p>

37、;<b>  {</b></p><p>  print("公鑰塊的數(shù)據(jù)長(zhǎng)度已經(jīng)確定. \n");</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></

38、p><p>  HandleError("計(jì)算密鑰數(shù)據(jù)塊長(zhǎng)度出錯(cuò).");</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p><b>

39、;  // 分配空間</b></p><p>  if (pbKeyBlob = (BYTE *)malloc(dwBlobLen))</p><p><b>  {</b></p><p>  print("已經(jīng)為此數(shù)據(jù)塊分配了內(nèi)存空間. \n");</p><p><b> 

40、 } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("所需內(nèi)存不夠. \n");</p><p><b>  }</b></p><

41、p>  //-------------------------------------------------------------------</p><p>  // 導(dǎo)出密鑰對(duì)的公鑰</p><p>  if (CryptExportKey(</p><p><b>  hKey,</b></p><p>

42、<b>  NULL,</b></p><p>  PUBLICKEYBLOB,</p><p><b>  0,</b></p><p>  pbKeyBlob,</p><p>  &dwBlobLen))</p><p><b>  {</b&g

43、t;</p><p>  print("公鑰塊中的數(shù)據(jù)已經(jīng)寫入到導(dǎo)出塊中. \n");</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p> 

44、 HandleError("Error during CryptExportKey.");</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p><b>

45、  // 創(chuàng)建哈希句柄</b></p><p>  if (CryptCreateHash(</p><p><b>  hProv,</b></p><p><b>  CALG_MD5,</b></p><p><b>  0,</b></p>&

46、lt;p><b>  0,</b></p><p><b>  &hHash))</b></p><p><b>  {</b></p><p>  print("哈希句柄已經(jīng)創(chuàng)建. \n");</p><p><b>  } <

47、;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("哈希句柄創(chuàng)建失敗.\n");</p><p><b>  }</b></p><p>

48、  //-------------------------------------------------------------------</p><p>  // 計(jì)算輸入數(shù)據(jù)的哈希值</p><p>  if (CryptHashData(</p><p><b>  hHash,</b></p><p><

49、;b>  pbBuffer,</b></p><p>  dwBufferLen,</p><p><b>  0))</b></p><p><b>  {</b></p><p>  print("緩沖區(qū)中的數(shù)據(jù)已經(jīng)進(jìn)行了哈希處理.\n");</p&g

50、t;<p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("計(jì)算哈希值時(shí)出錯(cuò).\n");</p><p><b>  }&l

51、t;/b></p><p>  //-------------------------------------------------------------------</p><p>  // 確定簽名信息的長(zhǎng)度</p><p>  dwSigLen= 0;</p><p>  if (CryptSignHash(</p>

52、;<p><b>  hHash,</b></p><p>  AT_SIGNATURE,</p><p>  szDescription,</p><p><b>  0,</b></p><p><b>  NULL,</b></p><p

53、>  &dwSigLen))</p><p><b>  {</b></p><p>  CString str1;</p><p>  str1.Format("簽名信息的長(zhǎng)度 %d 找到.\n",dwSigLen);</p><p>  string+=str1;</p>

54、<p>  //print("簽名信息的長(zhǎng)度 %d 找到.\n",dwSigLen);</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Ha

55、ndleError("確定哈希簽名的長(zhǎng)度時(shí)出錯(cuò).\n");</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p><b>  // 分配空間</b&

56、gt;</p><p>  if (pbSignature = (BYTE *)malloc(dwSigLen))</p><p><b>  {</b></p><p>  print("給此簽名消息分配了內(nèi)存空間.\n");</p><p><b>  } </b></

57、p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("簽名消息所需內(nèi)存不夠.");</p><p><b>  }</b></p><p>  //--------

58、-----------------------------------------------------------</p><p>  // 對(duì)哈希數(shù)據(jù)進(jìn)行數(shù)字簽名</p><p>  if (CryptSignHash(</p><p><b>  hHash,</b></p><p>  AT_SIGNATURE

59、,</p><p>  szDescription,</p><p><b>  0,</b></p><p>  pbSignature,</p><p>  &dwSigLen))</p><p><b>  {</b></p><p> 

60、 print("\n對(duì)哈希數(shù)據(jù)已經(jīng)進(jìn)行了數(shù)字簽名.\n");</p><p>  AfxMessageBox(string);</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b>&l

61、t;/p><p>  HandleError("哈希數(shù)據(jù)進(jìn)行數(shù)字簽名失敗.\n");</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p>&l

62、t;b>  // 銷毀哈希句柄</b></p><p>  if (hHash)</p><p><b>  {</b></p><p>  CryptDestroyHash(hHash);</p><p><b>  }</b></p><p>  CSt

63、ring str2;</p><p>  str2+="哈希句柄已經(jīng)被銷毀.\n這個(gè)程序的簽名階段已經(jīng)完成.\n\n";</p><p>  AfxMessageBox(str2);</p><p>  // print("哈希句柄已經(jīng)被銷毀.\n");</p><p>  // print(&qu

64、ot;這個(gè)程序的簽名階段已經(jīng)完成.\n\n");</p><p>  GetDlgItem(IDOK2)->EnableWindow(TRUE);</p><p>  //CDialog::OnOK();</p><p><b>  }</b></p><p>  ///////////////////

65、///////////////////////////////////////////////////////</p><p>  void CMyDlg::OnCancel() </p><p><b>  {</b></p><p>  // TODO: Add extra cleanup here</p><p>

66、  CDialog::OnCancel();</p><p><b>  }</b></p><p>  void CMyDlg::OnOk2() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handle

67、r code here</p><p>  string="";</p><p>  //-------------------------------------------------------------------</p><p>  // 從密鑰塊數(shù)據(jù)中導(dǎo)入公鑰到CSP。</p><p>  if (Crypt

68、ImportKey(</p><p><b>  hProv,</b></p><p>  pbKeyBlob,</p><p>  dwBlobLen,</p><p><b>  0,</b></p><p><b>  0,</b></p&g

69、t;<p>  &hPubKey))</p><p><b>  {</b></p><p>  print("公鑰已經(jīng)被導(dǎo)入.\n");</p><p><b>  } </b></p><p><b>  else</b></

70、p><p><b>  {</b></p><p>  HandleError("導(dǎo)入公鑰失敗.");</p><p><b>  }</b></p><p>  //----------------------------------------------------------

71、---------</p><p><b>  // 創(chuàng)建哈希句柄</b></p><p>  if (CryptCreateHash(</p><p><b>  hProv,</b></p><p><b>  CALG_MD5,</b></p><p&

72、gt;<b>  0,</b></p><p><b>  0,</b></p><p><b>  &hHash))</b></p><p><b>  {</b></p><p>  print("哈希句柄已經(jīng)被重新創(chuàng)建. \n&qu

73、ot;);</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("重新創(chuàng)建哈希句柄時(shí)出錯(cuò).\n");</p><p&g

74、t;<b>  }</b></p><p>  //-------------------------------------------------------------------</p><p>  // 計(jì)算輸入數(shù)據(jù)的哈希值</p><p>  if (CryptHashData(</p><p><b&

75、gt;  hHash,</b></p><p><b>  pbBuffer,</b></p><p>  dwBufferLen,</p><p><b>  0))</b></p><p><b>  {</b></p><p>  pr

76、int("新的哈希值已經(jīng)計(jì)算出.\n");</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  HandleError("計(jì)算新的哈希值時(shí)出錯(cuò).\n&q

77、uot;);</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p><b>  // 驗(yàn)證數(shù)字簽名</b></p><p>  if (C

78、ryptVerifySignature(</p><p><b>  hHash,</b></p><p>  pbSignature,</p><p><b>  dwSigLen,</b></p><p><b>  hPubKey,</b></p><

79、p>  szDescription,</p><p><b>  0))</b></p><p><b>  {</b></p><p>  print("\n此數(shù)字簽名已經(jīng)被驗(yàn)證.\n");</p><p>  AfxMessageBox(string);</p&

80、gt;<p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  print("簽名未生效!\n");</p><p>  AfxMessageBox(string

81、);</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------</p><p><b>  // 釋放內(nèi)存</b></p><p>  if (pbSigna

82、ture)</p><p><b>  {</b></p><p>  free(pbSignature);</p><p><b>  }</b></p><p>  if (hHash)</p><p><b>  {</b></p>

83、<p>  CryptDestroyHash(hHash);</p><p><b>  }</b></p><p>  if (hProv)</p><p><b>  {</b></p><p>  CryptReleaseContext(hProv,0);</p>&l

84、t;p><b>  }</b></p><p>  GetDlgItem(IDOK2)->EnableWindow(FALSE);</p><p><b>  }</b></p><p>  //獲取加密提供者句柄</p><p>  HCRYPTPROV GetCryptProv()&

85、lt;/p><p><b>  {</b></p><p>  HCRYPTPROV hCryptProv;</p><p>  //獲取加密提供者句柄</p><p>  if (CryptAcquireContext(</p><p>  &hCryptProv,</p>&

86、lt;p><b>  NULL,</b></p><p>  MS_DEF_PROV,</p><p>  PROV_RSA_FULL,</p><p><b>  0))</b></p><p><b>  {</b></p><p>  pri

87、nt("加密服務(wù)提供者句柄獲取成功!\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  //重新建立一個(gè)新的密鑰集</p><p&g

88、t;  if (!CryptAcquireContext(&hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))</p><p><b>  {</b></p><p>  HandleError("重新建立一個(gè)新的密鑰集出錯(cuò)!");</p><p

89、><b>  }</b></p><p><b>  }</b></p><p>  return hCryptProv;</p><p><b>  }</b></p><p>  void HandleError(char *s)</p><p&g

90、t;<b>  {</b></p><p>  CString str;</p><p>  str.Format("程序執(zhí)行發(fā)生錯(cuò)誤!\n%s\n錯(cuò)誤代碼為: %x.\n程序終止執(zhí)行!\n",s,GetLastError());</p><p>  AfxMessageBox(str);</p><p&

91、gt;<b>  exit(1);</b></p><p><b>  }</b></p><p>  void print(char *s)</p><p><b>  {</b></p><p>  string+=s;</p><p><b&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論