版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 上海電力學(xué)院</b></p><p><b> 安全協(xié)議大作業(yè)</b></p><p> 題目: 基于OpenSSL/CryptoAPI的數(shù)字簽名系統(tǒng)設(shè)計與實(shí)現(xiàn) </p><
2、;p> 學(xué)號: 20103277 學(xué)生姓名: 李鑫 </p><p> 院系: 計算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p> 專業(yè): 信息安全 </p><p> 班 級: 2010251 </p><p> 2013年 12 月 13 日</p>&
3、lt;p> 基于OpenSSL/CryptoAPI的數(shù)字簽名系統(tǒng)設(shè)計與實(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)算,一個用于簽名,另一個用于驗(yàn)證。數(shù)字簽名,就是只有信息的發(fā)送者才能產(chǎn)生的別人無法偽造的一段數(shù)字串,這段數(shù)字串同時也是對信息的發(fā)送者發(fā)送信息真實(shí)性的一個有效證明。數(shù)字簽名是非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。數(shù)字簽名了的文件的完整性是很容易驗(yàn)證的(不需要騎縫章,騎縫簽名,也不需要筆跡專家),而且數(shù)字簽名具有不可抵賴性(不需要筆跡專家來驗(yàn)證)。</p><p> 關(guān)鍵
5、字:數(shù)字簽名;簽名驗(yàn)證;哈希算法</p><p><b> 引言</b></p><p> 1. CryptoAPI簡介</p><p> CryptoAPI是一組函數(shù),為了完成數(shù)學(xué)計算,必須具有密碼服務(wù)提供者模塊(CSP)。Microsoft通過捆綁RSA Base Provider在操作系統(tǒng)級提供一個CSP,使用RSA公司的公鑰加密算
6、法,更多的CSP可以根據(jù)需要增加到應(yīng)用中。事實(shí)上,CSP有可能與特殊硬件設(shè)備(如智能卡)一起來進(jìn)行數(shù)據(jù)加密。CryptoAPI接口允許簡單的函數(shù)調(diào)用來加密數(shù)據(jù),交換公鑰,散列一個消息來建立摘要以及生成數(shù)字簽名。它還提供高級的管理操作,如從一組可能的CSP中使用一個CSP。此外,CryptoAPI還為許多高級安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET,用于加密客戶機(jī)/服務(wù)器消息的PCT,用于在各個平臺之間來回傳遞機(jī)密數(shù)據(jù)和密鑰的PFX
7、,代碼簽名等等。</p><p> 目前支持CryptoAPI的Windows系統(tǒng)有:Windows 95 OSR2、Windows NT SP3及后續(xù)版本、Windows 98、Windows 2000等。CryptoAPI的配置信息存儲在注冊表中,包括如下密鑰:</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使用兩種密鑰:會話密鑰與公共/私人密鑰對。會話密鑰使用相同的加密和解密密鑰,
9、這種算法較快,但必須保證密鑰的安全傳遞。公共/私人密鑰對使用一個公共密鑰和一個私人密鑰,私人密鑰只有專人才能使用,公共密鑰可以廣泛傳播。如果密鑰對中的一個用于加密,另一個一定用于解密。公共/私人密鑰對算法很慢,一般只用于加密小批量數(shù)據(jù),例如用于加密會話密鑰。</p><p> CryptoAPI支持兩種基本的編碼方法:流式編碼和塊編碼。流式編碼在明碼文本的每一位上創(chuàng)建編碼位,速度較快,但安全性較低。塊編碼在一個
10、完整的塊上(一般為64位)工作,需要使用填充的方法對要編碼的數(shù)據(jù)進(jìn)行舍入,以組成多個完整的塊。這種算法速度較慢,但更安全。</p><p><b> 實(shí)驗(yàn)原理</b></p><p><b> 基本介紹</b></p><p> 簡單地說,所謂數(shù)字簽名就是附加在數(shù)據(jù)單元上的一些數(shù)據(jù),或是對數(shù)據(jù)單元所作的密碼變換。這種
11、數(shù)據(jù)或變換允許數(shù)據(jù)單元的接收者用以確認(rèn)數(shù)據(jù)單元的來源和數(shù)據(jù)單元的完整性并保護(hù)數(shù)據(jù),防止被人(例如接收者)進(jìn)行偽造。它是對電子形式的消息進(jìn)行簽名的一種方法,一個簽名消息能在一個通信網(wǎng)絡(luò)中傳輸?;诠€密碼體制和私鑰密碼體制都可以獲得數(shù)字簽名,主要是基于公鑰密碼體制的數(shù)字簽名。包括普通數(shù)字簽名和特殊數(shù)字簽名。普通數(shù)字簽名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-S
12、chnorr-Shamir數(shù)字簽名算法、Des/DSA,橢圓曲線數(shù)字簽名算法和有限自動機(jī)數(shù)字簽名算法等。特殊數(shù)字簽名有盲簽名、代理簽名、群簽名、不可否認(rèn)簽名、公平盲簽名、門限簽名、具有消息恢復(fù)功能的簽名等,它與具體應(yīng)用環(huán)境密切相關(guān)。顯然,數(shù)字簽名的應(yīng)用涉及到法律問題,美國聯(lián)邦政府基于有限域上的離散對數(shù)問題制定了自己的數(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ù)對收到的原文產(chǎn)生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數(shù)字簽名能夠驗(yàn)證信
14、息的完整性。</p><p> 數(shù)字簽名是個加密的過程,數(shù)字簽名驗(yàn)證是個解密的過程。</p><p><b> 簽名過程</b></p><p> “發(fā)送報文時,發(fā)送方用一個哈希函數(shù)從報文文本中生成報文摘要,然后用自己的私人密鑰對這個摘要進(jìn)行加密,這個加密后的摘要將作為報文的數(shù)字簽名和報文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函
15、數(shù)從接收到的原始報文中計算出報文摘要,接著再用發(fā)送方的公用密鑰來對報文附加的數(shù)字簽名進(jìn)行解密,如果這兩個摘要相同、那么接收方就能確認(rèn)該數(shù)字簽名是發(fā)送方的。</p><p> 數(shù)字簽名有兩種功效:一是能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來的,因?yàn)閯e人假冒不了發(fā)送方的簽名。二是數(shù)字簽名能確定消息的完整性。因?yàn)閿?shù)字簽名的特點(diǎn)是它代表了文件的特征,文件如果發(fā)生改變,數(shù)字簽名的值也將發(fā)生變化。不同的文件將得到不同的數(shù)字簽名
16、。 一次數(shù)字簽名涉及到一個哈希函數(shù)、發(fā)送者的公鑰、發(fā)送者的私鑰?!?lt;/p><p> 數(shù)字簽名:發(fā)送方用自己的密鑰對報文X進(jìn)行Encrypt(編碼)運(yùn)算,生成不可讀取的密文Dsk,然后將Dsk傳送給接收方,接收方為了核實(shí)簽名,用發(fā)送方的公用密鑰進(jìn)行Decrypt(解碼)運(yùn)算,還原報文。</p><p><b> 設(shè)計流程圖</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)過程</b></p><p><b> 實(shí)驗(yàn)流程圖</b></p><p><b> 必要的截圖</b><
18、/p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p> 由于過于復(fù)雜的加密算法實(shí)現(xiàn)起來非常困難,所以在過去,許多應(yīng)用程序只能使用非常簡單的加密技術(shù),這樣做的結(jié)果就是加密的數(shù)據(jù)很容易被人破譯。而使用Microsoft提供的加密應(yīng)用程序接口(即Cryptography API),或稱CryptoAPI,可以方便地在應(yīng)用程序中加入強(qiáng)大的加密功能,而不必考慮基本的算法。本
19、文將對CryptoAPI及其使用的數(shù)據(jù)加密原理作一簡單的介紹,然后給出了用CryptoAPI編寫加密程序的大致步驟,最后以一個文件的加密、解密程序?yàn)槔菔綜ryptoAPI的部分功能。</p><p> 利用了CryptAPI,加密解密功能變得異常簡單,只需要調(diào)用相關(guān)的函數(shù)即可,而不用關(guān)心具體過程,開發(fā)商已經(jīng)為我們做了相關(guān)的內(nèi)部工作。用它來實(shí)現(xiàn)數(shù)字簽名,也變得十分便捷,只需要按照微軟的要求調(diào)用相關(guān)的函數(shù)就可以了
20、,實(shí)驗(yàn)過程中利用了網(wǎng)上的資料和書本的光盤資料。雖然寫程序過程中遇到了各種問題,但是在網(wǎng)上收集資料后都予以解決了。經(jīng)過學(xué)習(xí),對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="我是李鑫,來自2010251班,學(xué)號20103277,有事您說話!";</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> // 獲取密鑰對,其中的私鑰用于創(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("簽名密鑰對已經(jīng)被獲取.\n");</p><p><b> }&
34、lt;/b></p><p><b> else</b></p><p><b> {</b></p><p> HandleError("創(chuàng)建簽名密鑰出錯.\n");</p><p><b> }</b></p><p&g
35、t; //-------------------------------------------------------------------</p><p> // 導(dǎo)出密鑰對的公鑰,確定密鑰塊數(shù)據(jù)長度</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ù)長度已經(jīng)確定. \n");</p><p><b> } </b></p><p><b> else</b></p><p><b> {</b></
38、p><p> HandleError("計算密鑰數(shù)據(jù)塊長度出錯.");</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)出密鑰對的公鑰</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> // 計算輸入數(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("計算哈希值時出錯.\n");</p><p><b> }&l
51、t;/b></p><p> //-------------------------------------------------------------------</p><p> // 確定簽名信息的長度</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("簽名信息的長度 %d 找到.\n",dwSigLen);</p><p> string+=str1;</p>
54、<p> //print("簽名信息的長度 %d 找到.\n",dwSigLen);</p><p><b> } </b></p><p><b> else</b></p><p><b> {</b></p><p> Ha
55、ndleError("確定哈希簽名的長度時出錯.\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> // 對哈希數(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對哈希數(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這個程序的簽名階段已經(jīng)完成.\n\n";</p><p> AfxMessageBox(str2);</p><p> // print("哈希句柄已經(jīng)被銷毀.\n");</p><p> // print(&qu
64、ot;這個程序的簽名階段已經(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)建哈希句柄時出錯.\n");</p><p&g
74、t;<b> }</b></p><p> //-------------------------------------------------------------------</p><p> // 計算輸入數(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)計算出.\n");</p><p><b> } </b></p><p><b> else</b></p><p><b> {</b></p><p> HandleError("計算新的哈希值時出錯.\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> //重新建立一個新的密鑰集</p><p&g
88、t; if (!CryptAcquireContext(&hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))</p><p><b> {</b></p><p> HandleError("重新建立一個新的密鑰集出錯!");</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ā)生錯誤!\n%s\n錯誤代碼為: %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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于數(shù)字簽名系統(tǒng)的實(shí)現(xiàn).pdf
- 數(shù)字簽名系統(tǒng)的研究與實(shí)現(xiàn).pdf
- 基于Web服務(wù)的XML數(shù)字簽名系統(tǒng).pdf
- 一個簡單的數(shù)字簽名系統(tǒng)的實(shí)現(xiàn)
- 交通運(yùn)輸行業(yè)數(shù)字簽名系統(tǒng)的設(shè)計與實(shí)現(xiàn).pdf
- 基于SM2的數(shù)字簽名系統(tǒng)的硬件設(shè)計.pdf
- 基于rsa算法的數(shù)字簽名系統(tǒng)的應(yīng)用研究
- 基于智能卡的數(shù)字簽名系統(tǒng)的研究與應(yīng)用.pdf
- 基于RSA算法的數(shù)字簽名系統(tǒng)的應(yīng)用研究.pdf
- 基于USB-KEY的數(shù)字簽名系統(tǒng)在公文流轉(zhuǎn)中的研究與實(shí)現(xiàn).pdf
- 基于數(shù)字簽名鏈的電子履歷系統(tǒng)設(shè)計與實(shí)現(xiàn).pdf
- 數(shù)字簽名系統(tǒng)中密鑰泄露問題的研究.pdf
- 網(wǎng)上銀行系統(tǒng)數(shù)字簽名安全認(rèn)證體系的設(shè)計與實(shí)現(xiàn).pdf
- 代理數(shù)字簽名和群數(shù)字簽名的分析與設(shè)計.pdf
- 基于數(shù)字簽名技術(shù)的教務(wù)成績管理系統(tǒng)的設(shè)計與實(shí)現(xiàn).pdf
- 安全代理簽名系統(tǒng)的研究與實(shí)現(xiàn).pdf
- 電子商務(wù)中基于數(shù)字簽名的安全協(xié)議研究.pdf
- 電子簽名系統(tǒng)的設(shè)計與實(shí)現(xiàn).pdf
- 基于數(shù)字簽名的OSPF路由協(xié)議安全性研究.pdf
- 基于數(shù)字簽名技術(shù)的電子公文交換系統(tǒng)的設(shè)計與實(shí)現(xiàn).pdf
評論
0/150
提交評論