![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/26/0747166c-3998-4052-b4c6-3c57908ef179/0747166c-3998-4052-b4c6-3c57908ef1791.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/26/0747166c-3998-4052-b4c6-3c57908ef179/0747166c-3998-4052-b4c6-3c57908ef1792.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/26/0747166c-3998-4052-b4c6-3c57908ef179/0747166c-3998-4052-b4c6-3c57908ef1793.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/26/0747166c-3998-4052-b4c6-3c57908ef179/0747166c-3998-4052-b4c6-3c57908ef1794.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-11/26/0747166c-3998-4052-b4c6-3c57908ef179/0747166c-3998-4052-b4c6-3c57908ef1795.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘要:隨著網(wǎng)絡(luò)技術(shù)的快速發(fā)展,使我們的生活豐富多彩,工作的效率也提高了不少.盡管網(wǎng)絡(luò)的出現(xiàn)給我們帶來(lái)了很多的福利和方便,但網(wǎng)絡(luò)安全問(wèn)題也在時(shí)時(shí)困擾著我們,病毒、黑客的侵犯,各種威脅之聲的不斷傳出,網(wǎng)絡(luò)安全問(wèn)題也就成為了社會(huì)關(guān)注的重點(diǎn)問(wèn)題。文件的安全就是安全問(wèn)題之一,文件可能會(huì)包含了很多的機(jī)密,一旦被黑客竊取,那損失是不可想象的。所以下面我們簡(jiǎn)單的談?wù)勎募咏饷艿南嚓P(guān)算法。因?yàn)檫^(guò)于復(fù)雜的加密算法實(shí)現(xiàn)起來(lái)非常困難,所以在過(guò)去,許多應(yīng)用程序只能使用非常簡(jiǎn)單的加密技術(shù),這樣做的結(jié)果就是加密的數(shù)據(jù)很容易就可以被人破譯.而使用Microsoft提供的加密應(yīng)
2、用程序接口(即Cryptography API),或稱CryptoAPI,就可以方便地在應(yīng)用程序中加入強(qiáng)大的加密功能,而不必考慮基本的算法。我們利用CryptoAPI來(lái)實(shí)現(xiàn)對(duì)文件的加密和解密。關(guān)鍵詞:文件的加解密,CryptoAPI。1、 設(shè)計(jì)要求與實(shí)現(xiàn):基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)2、 設(shè)計(jì)環(huán)境與工具1 軟件環(huán)境、工具Windows 8.1、visual studio 20122CryptoAPI加密服務(wù)提供者CSP加密服務(wù)相關(guān)的所有操作都在CSP實(shí)現(xiàn),它是真正實(shí)現(xiàn)加密相關(guān)服務(wù)的獨(dú)立模塊,既可以由軟件實(shí)現(xiàn)也可以由硬件實(shí)現(xiàn)。每個(gè)CSP必須包含一個(gè)動(dòng)態(tài)鏈接庫(kù)和一個(gè)簽名文件,
3、簽名文件用于保證底層CSP的安全性,CryptoAPI接口在加載每個(gè)CSP時(shí),需要驗(yàn)證CSP的簽名,如果簽名無(wú)效,則拒絕加載,CSP的簽名由微軟公司簽發(fā).同時(shí),每個(gè)CSP都有一個(gè)名字和一個(gè)類型,名字必須是唯一的,這樣便于CryptoAPI找到對(duì)應(yīng)的CSP。CSP是真正實(shí)行加密的獨(dú)立模塊,可以由軟件實(shí)現(xiàn)也可以由硬件實(shí)現(xiàn)。CSP必須符合CryptoAPI接口規(guī)范.每個(gè)CSP有一個(gè)密鑰庫(kù),密鑰庫(kù)用于存儲(chǔ)密鑰.每個(gè)密鑰庫(kù)包括一個(gè)或多個(gè)密鑰容器(Key Containers).每個(gè)密鑰容器中包含屬于一個(gè)特定用戶的所有密鑰對(duì)。每個(gè)密鑰容器被賦予一個(gè)唯一的名字。在銷毀密鑰容器前,CSP將永久保存每一個(gè)密鑰容
4、器,包括保存每個(gè)密鑰容器中的公/私鑰對(duì)。每個(gè)CSP都有一個(gè)名字和一個(gè)類型.每個(gè)CSP的名字是唯一的,這樣便于CryptoAPI找到對(duì)應(yīng)的CSP。目前已經(jīng)有9種CSP類型,并且還在增長(zhǎng)。下表列出它們支持的密鑰交換算法、簽名算法、對(duì)稱加密算法和Hash算法。二、詳細(xì)設(shè)計(jì)(1)原理概述CryptoAPI是一組函數(shù),為了完成數(shù)學(xué)計(jì)算,必須具有密碼服務(wù)提供者模塊(CSP).Microsoft通過(guò)捆綁RSA Base Provider在操作系統(tǒng)級(jí)提供一個(gè)CSP,使用RSA公司的公鑰加密算法,更多的CSP可以根據(jù)需要增加到應(yīng)用中。事實(shí)上,CSP有可能與特殊硬件設(shè)備(如智能卡)一起來(lái)進(jìn)行數(shù)據(jù)加密。Crypto
5、API接口允許簡(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,代碼簽名等等。數(shù)據(jù)加解密,程序分為四大主要部分:1、 獲取CSP句柄:真正實(shí)現(xiàn)加密相關(guān)服務(wù)的獨(dú)立模塊。2、 獲取加密密鑰:進(jìn)行加、解密,必然需要構(gòu)造密鑰。兩種方法:通過(guò)哈希值構(gòu)造通過(guò)隨機(jī)數(shù)構(gòu)造。3、 數(shù)據(jù)加密與解密:實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行加密解密操作。4、 相關(guān)資源釋放:釋放申請(qǐng)的相關(guān)
6、資源。(下圖為數(shù)據(jù)加解密的流程)(參考網(wǎng)絡(luò)安全程序設(shè)計(jì)教程李紅嬌著)(2) CryptoAPI應(yīng)用程序的編譯環(huán)境包含的頭文件 include windows.h include <wincrypt.h包含的靜態(tài)鏈接庫(kù)鏈接CryptoAPI函數(shù)必須有靜態(tài)庫(kù)Crypto32。lib的支持,部分CryptoAPI函數(shù)可能還需要靜態(tài)庫(kù)advapi32。lib及CryptUI。lib的支持.若在VC+6.0和VS2012上編譯程序,則需加上以下語(yǔ)句 ifndef _WIN32_WINNT define _WIN32_WINNT 0x0400# endif(3)實(shí)驗(yàn)步驟1) 在VS2012
7、下實(shí)現(xiàn)基于CryptoAPI的文件加密. a、創(chuàng)建會(huì)話密鑰為保證數(shù)據(jù)加密效率,CryptoAPI規(guī)定數(shù)據(jù)加密操作必須基于對(duì)稱密碼進(jìn)行.于是,加密方進(jìn)行加密操作首先必須創(chuàng)建會(huì)話密鑰,一般可以通過(guò)調(diào)用函數(shù)CryptoGenKey或CryptDeriveKey創(chuàng)建,在創(chuàng)建會(huì)話密鑰時(shí)指定加密算法.b、加密數(shù)據(jù) 在創(chuàng)建會(huì)話密鑰后,則可以調(diào)用CryptEncrypt函數(shù)進(jìn)行加密操作。加密操作需要注意的是每次加密數(shù)據(jù)塊的長(zhǎng)度必須根據(jù)具體的算法和算法類型確定,一般來(lái)說(shuō),加密數(shù)據(jù)塊長(zhǎng)度為算法規(guī)定的基準(zhǔn)加密塊長(zhǎng)度的整數(shù)倍。對(duì)于分組密碼,需為密文數(shù)據(jù)塊預(yù)留一個(gè)基準(zhǔn)塊長(zhǎng)度的空間。c、安全保存或交換
8、會(huì)話密鑰數(shù)據(jù)加密完成后,當(dāng)在今后的某個(gè)時(shí)間或其他用戶需要解密數(shù)據(jù)時(shí),必須保存會(huì)話密鑰以備后用,或者是傳輸會(huì)話密鑰給特定用戶以使其能正確進(jìn)行解密操作。2) 在VS2012下實(shí)現(xiàn)基于CryptoAPI的文件解密. a、獲取會(huì)話密鑰 根據(jù)保存或傳輸會(huì)話密鑰方式不同,進(jìn)行相應(yīng)的操作正確獲取會(huì)話密鑰b、解密數(shù)據(jù)利用獲取的會(huì)話密鑰調(diào)用函數(shù)CryptDecrypt解密數(shù)據(jù),它和函數(shù)CryptEncrypt互為逆操作.同樣的,解密操作需要注意的是每次解密數(shù)據(jù)塊的長(zhǎng)度必須根據(jù)具體的算法和算法類型確定,一般來(lái)說(shuō),解密數(shù)據(jù)塊長(zhǎng)度為算法基準(zhǔn)加密塊長(zhǎng)度的整數(shù)倍.要求: 1)
9、60;算法的詳細(xì)實(shí)現(xiàn)過(guò)程。 a) 獲得csp句柄 b) 構(gòu)造密鑰 c) 數(shù)據(jù)加密 d) 數(shù)據(jù)解密e) 釋放相關(guān)資源 2) 算法實(shí)現(xiàn)的流程圖 三、實(shí)驗(yàn)結(jié)果原文件加密后解密后PS:我們?cè)诩用艿臅r(shí)候,沒(méi)有采用通過(guò)隨機(jī)數(shù)創(chuàng)建密鑰,然后只能通過(guò)輸入密碼創(chuàng)建加密密鑰。截圖:未加密四、設(shè)計(jì)總結(jié)由于多方嘗試并編寫Openssl對(duì)文件的加解密方法,均以失敗告終,所以我們小組決定采用新的加密算法,即Windows CryptoAPI,由微軟公司提出的一種安全加密應(yīng)用服務(wù)框架.本次試驗(yàn)的主要內(nèi)容
10、是基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),在仔細(xì)看懂代碼的基礎(chǔ)上,真正明白了CryptoAPI的結(jié)構(gòu)體系。在加密操作時(shí),首先要?jiǎng)?chuàng)建會(huì)話密鑰,在創(chuàng)建會(huì)話密鑰時(shí)指定加密算法,注意的是,創(chuàng)建會(huì)話密鑰時(shí),它制定具體的加密算法應(yīng)該注意具體的CSP是否支持此算法.我們?cè)谧黾用艿臅r(shí)候,沒(méi)有加入通過(guò)隨機(jī)數(shù)創(chuàng)建會(huì)話密鑰,只能進(jìn)行輸入密碼創(chuàng)建加密密鑰.然后是進(jìn)行數(shù)據(jù)的加密操作,當(dāng)完成以后要進(jìn)行安全保存或者交換會(huì)話密鑰.解密時(shí)要獲取會(huì)話密鑰,然后進(jìn)行數(shù)據(jù)解密.CryptoAPI除直接用于加密數(shù)據(jù)外,還為許多高級(jí)安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET,用于加密客戶機(jī)/服務(wù)器消息的PCT,用于在各個(gè)
11、平臺(tái)之間來(lái)回傳遞機(jī)密數(shù)據(jù)和密鑰的PFX,代碼簽名等等.通過(guò)此次編寫程序,我對(duì)基于CryptoAPI的文件加解密系統(tǒng)有了更深層次的了解,對(duì)之前做過(guò)的基于CryptoAPI 實(shí)現(xiàn)文件完整性校驗(yàn)的實(shí)驗(yàn)理解的更加透徹.在編寫程序的過(guò)程中,遇到了很多棘手的問(wèn)題,但是這些問(wèn)題,我通過(guò)了找老師,上網(wǎng)查詢問(wèn)題出錯(cuò)的原因等方法努力的尋求答案,到現(xiàn)在為止,程序已經(jīng)順利完成,運(yùn)行無(wú)阻。自己根據(jù)要求,從零開(kāi)始做一份實(shí)驗(yàn)真的不容易,需要對(duì)整體結(jié)構(gòu)局勢(shì)進(jìn)行把握,在做之前要做好多重準(zhǔn)備工作,例如運(yùn)行環(huán)境(軟、硬件環(huán)境)、輸入的形式和輸入值的范圍、輸出的形式描述、功能描述。細(xì)節(jié)決定成敗,對(duì)于我而言,這次的作業(yè)讓我清楚認(rèn)識(shí)到,
12、注重細(xì)節(jié)的重要性,有時(shí)候一個(gè)字母的大小寫,幾個(gè)變量的數(shù)據(jù)類型的統(tǒng)一性,考慮后選擇的更為合適的數(shù)據(jù)類型,重復(fù)執(zhí)行的問(wèn)題等等,這些都讓我不斷進(jìn)步.5、 源代碼加密:ifndef _WIN32_WINNT#define_WIN32_WINNT 0x0400endifinclude<stdio。hinclude<string。h>include<iostream#includeconio。h#includewindows。hincludewincrypt。h>defineMY_ENCODING_TYPE (PKCS_7_ASN_ENCODING X509_ASN_ENCO
13、DING)defineKEYLENGTH 0x00800000defineENCRYPT_ALGORITHMCALG_RC4defineENCRYPT_BLOCK_SIZE 8 classEncpublic:HCRYPTPROVGetCryptProv();BOOLEncryptFile(PCHARszSource, PCHARszDestination, PCHARszPassword); HCRYPTKEYGenKeyByPassword(HCRYPTPROVhCryptProv,PCHARszPassword);;includeiostreaminclude"Enc。h”usi
14、ngnamespacestd;/ 功能:加密原文szSource文件,加密后的數(shù)據(jù)存儲(chǔ)在szDestination文件中/ 參數(shù):/ szSource:原文文件名/ szDestination:加密后數(shù)據(jù)存儲(chǔ)文件/ szPassword:用戶輸入的密碼BOOLEnc::EncryptFile(PCHARszSource, PCHARszDestination, PCHARszPassword) / 變量申明與初始化。FILE hSource; FILE *hDestination; HCRYPTPROVhCryptProv; HCRYPTKEYhKey; PBYTEpbBuffer; DWOR
15、DdwBlockLen; DWORDdwBufferLen; DWORDdwCount; / 打開(kāi)原文文件。 if(hSource = fopen(szSource,”rb”)cout<”原文文件”szSource”已經(jīng)打開(kāi). n”;else cout<"打開(kāi)原文文件出錯(cuò)!”<endl; / 打開(kāi)目標(biāo)文件. if(hDestination = fopen(szDestination,"wb”)cout"目標(biāo)文件”szDestination<”已經(jīng)打開(kāi)。 n”endl;elsecout<<”打開(kāi)目標(biāo)文件出錯(cuò)!"<e
16、ndl; /獲取加密服務(wù)者句柄hCryptProv = GetCryptProv();/ 創(chuàng)建會(huì)話密鑰。if(!szPassword strcmp(szPassword,"”)=0 ) /hKey = GenKeyByRandom( hCryptProv, hDestination);當(dāng)輸入密碼為空時(shí),則創(chuàng)建隨機(jī)的加密密鑰,并導(dǎo)出創(chuàng)建的密鑰保存到文件中。cout<”你輸入的密鑰為空!請(qǐng)正確輸入!"endl; else / 當(dāng)輸入密碼不為空時(shí),則通過(guò)輸入密碼創(chuàng)建加密密鑰hKey=GenKeyByPassword( hCryptProv, szPassword); / 因
17、為加密算法按ENCRYPT_BLOCK_SIZE 大小塊加密,所以被加密的/ 數(shù)據(jù)長(zhǎng)度必須是ENCRYPT_BLOCK_SIZE 的整數(shù)倍.下面計(jì)算一次加密的/ 數(shù)據(jù)長(zhǎng)度。dwBlockLen = 1000 - 1000 ENCRYPT_BLOCK_SIZE; / 確定加密后密文數(shù)據(jù)塊大小。 若是分組密碼模式,則必須有容納額外塊的空間if(ENCRYPT_BLOCK_SIZE 1) dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; elsedwBufferLen = dwBlockLen; / 分配內(nèi)存空間。 if(pbBuffer = (BYTE
18、)malloc(dwBufferLen)cout”已經(jīng)為緩沖區(qū)分配了內(nèi)存. n”;else cout<<”所需內(nèi)存不夠。 n”; / 循環(huán)加密原文件do / 每次從原文件中讀取dwBlockLen字節(jié)數(shù)據(jù). dwCount = fread(pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)) cout<"讀取明文文件出錯(cuò)!n”;/-/ 加密數(shù)據(jù)。 if(!CryptEncrypt(hKey,/密鑰0,/如果數(shù)據(jù)同時(shí)進(jìn)行散列和加密,這里傳入一個(gè)散列對(duì)象feof(hSource),/如果是最后一個(gè)被加密的塊,輸入T
19、RUE。如果不是輸入FALSE./這里通過(guò)判斷是否到文件尾來(lái)決定是否為最后一塊。0,/保留pbBuffer,/輸入被加密數(shù)據(jù),輸出加密后的數(shù)據(jù)dwCount,/輸入被加密數(shù)據(jù)實(shí)際長(zhǎng)度,輸出加密后數(shù)據(jù)長(zhǎng)度dwBufferLen))/pbBuffer的大小。 cout”加密數(shù)據(jù)時(shí)出錯(cuò)。 n”; /-/ 把加密后數(shù)據(jù)寫到密文文件中fwrite(pbBuffer, 1, dwCount, hDestination); if(ferror(hDestination) cout”寫入密文時(shí)出錯(cuò)?!保?while(!feof(hSource)); /-/ 關(guān)閉文件if(hSource)if(fclose(h
20、Source))cout<”關(guān)閉原文文件出錯(cuò)!”;if(hDestination)if(fclose(hDestination))cout”關(guān)閉目標(biāo)文件出錯(cuò)!";/-/ 釋放內(nèi)存空間。 if(pbBuffer) free(pbBuffer); /-/ 銷毀會(huì)話密鑰if(hKey)if(!(CryptDestroyKey(hKey))cout<”銷毀會(huì)話密鑰時(shí)出錯(cuò)”endl;/-/ 釋放CSP句柄if(hCryptProv)if(!(CryptReleaseContext(hCryptProv, 0))cout<"釋放CSP句柄時(shí)出錯(cuò)”<endl;re
21、turn(TRUE); / end Encryptfile/獲取加密提供者句柄HCRYPTPROVEnc:GetCryptProv()HCRYPTPROVhCryptProv; / 加密服務(wù)提供者句柄/獲取加密提供者句柄if(CryptAcquireContext(hCryptProv, / 加密服務(wù)提供者句柄NULL, / 密鑰容器名,這里使用登陸用戶名MS_ENHANCED_PROV, / 加密服務(wù)提供者PROV_RSA_FULL, / 加密服務(wù)提供者類型,可以提供加密和簽名等功能0)) / 標(biāo)志cout”加密服務(wù)提供者句柄獲取成功!n"else/重新建立一個(gè)新的密鑰集if(!C
22、ryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)cout<"重新建立一個(gè)新的密鑰集出錯(cuò)!”;returnhCryptProv;/ GenKeyByRandom:通過(guò)輸入密碼創(chuàng)建會(huì)話密鑰/ 參數(shù):hCryptProv CSP句柄/ szPassword輸入密碼HCRYPTKEYEnc::GenKeyByPassword(HCRYPTPROVhCryptProv,PCHARszPassword)HCRYPTKEYhKey; HCRYPTHASHhHa
23、sh;/-/ 創(chuàng)建哈希句柄。 if(CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)cout”一個(gè)哈希句柄已經(jīng)被創(chuàng)建。 n”;else cout<”Error during CryptCreateHash!n"; /-/ 計(jì)算輸入密碼的哈希值. if(CryptHashData(hHash, (BYTE )szPassword, strlen(szPassword), 0) cout<<"密碼已經(jīng)被添加到了哈希表中。 n”; else cout"計(jì)算輸入密碼的哈希值時(shí)出錯(cuò)。 n”; /
24、-/ 通過(guò)哈希值創(chuàng)建會(huì)話密鑰。 if(CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, hKey) cout”通過(guò)密碼的哈希值獲得了加密密鑰. n”; else cout<”Error during CryptDeriveKey!n”; /-/ 銷毀哈希句柄。 if(hHash) if(!(CryptDestroyHash(hHash))cout”Error during CryptDestroyHash”<endl; hHash = 0;/返回創(chuàng)建的會(huì)話密鑰returnhKey;解密:ifndef_WI
25、N32_WINNT#define _WIN32_WINNT 0x0400endif#includestdio.hinclude<string。hincludeconio。h#include<windows.h#include<wincrypt.h#include<iostreamdefineMY_ENCODING_TYPE (PKCS_7_ASN_ENCODING X509_ASN_ENCODING)defineKEYLENGTH 0x00800000#defineENCRYPT_ALGORITHMCALG_RC4#defineENCRYPT_BLOCK_SIZE 8
26、classDec /加密文件的方法public:HCRYPTPROVGetCryptProv(); /方法的原型BOOLDecryptFile(PCHARszSource, PCHARszDestination, CHAR *szPassword); HCRYPTKEYGenKeyByPassword(HCRYPTPROVhCryptProv,PCHARszPassword); /通過(guò)輸入口令創(chuàng)建會(huì)話密鑰,我們的密碼HCRYPTKEYGenKeyFromFile(HCRYPTPROVhCryptProv,FILE hSource);;#ifndef _WIN32_WINNT#define_WI
27、N32_WINNT 0x0400#endif#includestdio。h#include<string。h>#includeconio.hincludewindows。h#includewincrypt。h#includeiostreamdefineMY_ENCODING_TYPE (PKCS_7_ASN_ENCODING X509_ASN_ENCODING)defineKEYLENGTH 0x00800000defineENCRYPT_ALGORITHMCALG_RC4defineENCRYPT_BLOCK_SIZE 8 includeiostream>#include&
28、quot;Dec。h"usingnamespacestd;/功能:解密密文szSource文件,解密后的數(shù)據(jù)存儲(chǔ)到szDestination文件中/BOOLDec::DecryptFile(PCHARszSource, /密文文件名PCHARszDestination, /解密后數(shù)據(jù)存儲(chǔ)文件PCHARszPassword) /口令,即密碼,其實(shí)口令和密碼是兩回事,了解一下就行了,作用一樣 /-/ 局部變量申明與初始化。FILE *hSource; FILE *hDestination; HCRYPTPROVhCryptProv; HCRYPTKEYhKey; PBYTEpbBuffe
29、r; DWORDdwBlockLen; DWORDdwBufferLen; DWORDdwCount; BOOL status = FALSE; /-/ 打開(kāi)密文文件。 if(!(hSource = fopen(szSource,"rb"))) cout<”打開(kāi)密文文件出錯(cuò)!”endl;/-/ 打開(kāi)目標(biāo)文件,用于存儲(chǔ)解密后的數(shù)據(jù)。 if(?。╤Destination = fopen(szDestination,”wb")cout<”打開(kāi)明文文件出錯(cuò)!”<endl;/獲取加密服務(wù)者句柄hCryptProv = GetCryptProv();/獲取或
30、創(chuàng)建會(huì)話密鑰if(!szPassword| strcmp(szPassword,"”)=0 ) /-/從密文文件導(dǎo)入保存的會(huì)話密鑰hKey = GenKeyFromFile( hCryptProv,hSource); else /-/ 通過(guò)輸入密碼重新創(chuàng)建會(huì)話密鑰。 hKey=GenKeyByPassword( hCryptProv, szPassword); / 計(jì)算一次解密的數(shù)據(jù)長(zhǎng)度,它是ENCRYPT_BLOCK_SIZE 的整數(shù)倍dwBlockLen = 1000 1000 % ENCRYPT_BLOCK_SIZE; dwBufferLen = dwBlockLen; /-/
31、 分配內(nèi)存空間。 if(!(pbBuffer = (BYTE *)malloc(dwBufferLen))cout”所需內(nèi)存不夠!"<endl; /-/ 解密密文文件,解密后數(shù)據(jù)保存在目標(biāo)文件do /-/ 每次從密文文件中讀取dwBlockLen字節(jié)數(shù)據(jù)。 dwCount = fread(pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)cout"讀取密文文件出錯(cuò)!"endl;/-/ 解密數(shù)據(jù)if(!CryptDecrypt(hKey, 0, feof(hSource), 0, pbBuffer, dw
32、Count)cout<"解密數(shù)據(jù)時(shí)出錯(cuò)!"<endl; /-/ 把解密后的數(shù)據(jù)寫入目標(biāo)文件中。 fwrite(pbBuffer, 1, dwCount, hDestination); if(ferror(hDestination))cout”把解密后的數(shù)據(jù)寫入目標(biāo)文件中時(shí)出錯(cuò)!"<<endl; while(!feof(hSource); status = TRUE; /-/ 關(guān)閉文件if(hSource)if(fclose(hSource)cout<”關(guān)閉原文件出錯(cuò)"<endl;if(hDestination)if(f
33、close(hDestination)cout”關(guān)閉目標(biāo)文件出錯(cuò)"<endl; /-/ 釋放內(nèi)存空間if(pbBuffer) free(pbBuffer); /-/ 銷毀會(huì)話密鑰if(hKey)if(!(CryptDestroyKey(hKey)cout<<"銷毀會(huì)話密鑰時(shí)出錯(cuò)"endl; /-/ 釋放CSP句柄if(hCryptProv)if(!(CryptReleaseContext(hCryptProv, 0)cout<<”釋放CSP句柄時(shí)出錯(cuò)!"endl; return status; / end Decryptfi
34、leHCRYPTPROVDec:GetCryptProv()HCRYPTPROVhCryptProv; / 加密服務(wù)提供者句柄/獲取加密提供者句柄if(CryptAcquireContext(&hCryptProv, / 加密服務(wù)提供者句柄NULL, / 密鑰容器名,這里使用登陸用戶名MS_ENHANCED_PROV, / 加密服務(wù)提供者PROV_RSA_FULL, / 加密服務(wù)提供者類型,可以提供加密和簽名等功能0)) / 標(biāo)志cout”加密服務(wù)提供者句柄獲取成功!n”;/cout"加密服務(wù)提供者句柄獲取成功”endl;else/重新建立一個(gè)新的密鑰集if(!CryptAc
35、quireContext(hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))cout<”重新建立一個(gè)新的密鑰集出錯(cuò)!”<<endl;returnhCryptProv;HCRYPTKEYDec::GenKeyFromFile(HCRYPTPROVhCryptProv,F(xiàn)ILE hSource)HCRYPTKEYhKey; PBYTEpbKeyBlob; DWORDdwKeyBlobLen; /從密文文件中獲取密鑰數(shù)據(jù)塊長(zhǎng)度,并分配內(nèi)存空間。 fread(dwKeyBlobLen, sizeof
36、(DWORD), 1, hSource); if(ferror(hSource) | feof(hSource))cout<”讀取密文文件中密鑰數(shù)據(jù)塊長(zhǎng)度出錯(cuò)!”<endl; if(!(pbKeyBlob = (BYTE )malloc(dwKeyBlobLen)cout”內(nèi)存分配出錯(cuò)”endl; /-/ 從密文文件中獲取密鑰數(shù)據(jù)塊fread(pbKeyBlob, 1, dwKeyBlobLen, hSource); if(ferror(hSource) | feof(hSource))cout<”讀取密文文件中密鑰數(shù)據(jù)塊出錯(cuò)!”endl; /-/ 導(dǎo)入會(huì)話密鑰到 CSP。
37、if(!CryptImportKey(hCryptProv, pbKeyBlob, dwKeyBlobLen, 0, 0, hKey)cout<”Error during CryptImportKey!”endl; if(pbKeyBlob) free(pbKeyBlob);/返回導(dǎo)出的會(huì)話密鑰returnhKey;HCRYPTKEYDec::GenKeyByPassword(HCRYPTPROVhCryptProv,PCHARszPassword)HCRYPTKEYhKey; HCRYPTHASHhHash;/-/ 創(chuàng)建哈希句柄。 if(CryptCreateHash(hCryptPr
38、ov, CALG_MD5, 0, 0, &hHash))cout”一個(gè)哈希句柄已經(jīng)被創(chuàng)建。 n”;else cout<”Error during CryptCreateHash!”endl; /-/ 計(jì)算輸入密碼的哈希值. if(CryptHashData(hHash, (BYTE )szPassword, strlen(szPassword), 0) cout<”此密碼已經(jīng)被添加到了哈希表中。 n" else cout<”Error during CryptHashData”endl; / 通過(guò)哈希值創(chuàng)建會(huì)話密鑰.if(CryptDeriveKey(hCr
39、yptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, hKey) cout”從這個(gè)密碼的哈希值獲得了一個(gè)加密密鑰。 n"; else cout<”哈希值創(chuàng)建會(huì)話密鑰時(shí)出錯(cuò)!"endl; / 銷毀哈希句柄. if(hHash) if(!(CryptDestroyHash(hHash)))cout"銷毀哈希句柄時(shí)出錯(cuò)”endl; hHash = 0;/返回創(chuàng)建的會(huì)話密鑰returnhKey;主函數(shù)ifndef _WIN32_WINNTdefine_WIN32_WINNT 0x0400endifinclude”Enc。h”/引
40、入我們寫的加密頭文件include”Dec。h"/引入我們寫的解密頭文件includestdio。hincludestring。h>includeiostreamincludeconio。h/需要的庫(kù)include<windows.h/需要的庫(kù)include<wincrypt。h>/需要的庫(kù)usingnamespacestd;defineMY_ENCODING_TYPE (PKCS_7_ASN_ENCODING X509_ASN_ENCODING) /* 這些宏定義有用,不可去除/#defineKEYLENGTH 0x00800000HCRYPTPROVGet
41、CryptProv(); /獲取加密提供者句柄的方法void main(void) Encenc; /加密對(duì)象Decdec; /解密對(duì)象PCHARszSource; /原文文件名PCHARszDestination; /加密后數(shù)據(jù)存儲(chǔ)文件CHARszPassword100 = "”; /用戶輸入口令,這里為ID碼char response; /提示密碼信息選擇int choose; /處理方式選擇,是加密還是解密 1加密 2解密intendflag=1;char done;docout<”請(qǐng)你選擇處理方式:”endl;cout"1.加密”endl;cout<<”2。解密”endl;coutendl;cinchoose;switch(choose)case 1:/加密模塊if(!(szSource=(char )malloc(100)) /c語(yǔ)言的分配內(nèi)存方法cout<<”內(nèi)存分配失敗。"endl;if(?。╯zDestination=(char *)malloc(100)cout<<”內(nèi)存分配失敗?!眅ndl;cout”加密一個(gè)文件. nn”;cout<”請(qǐng)輸入需要被加密文件的名稱(絕對(duì)路徑): "endl; /這里要很注意,輸入的需是絕對(duì)路徑,如:d:mytesta.txtcin
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 運(yùn)動(dòng)裝備定制銷售合同
- 2023-2024學(xué)年高中信息技術(shù)選修2(浙教版2019)-網(wǎng)絡(luò)基礎(chǔ)-教學(xué)設(shè)計(jì)-2.1-網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
- 13-2《上圖書(shū)館》 教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- Lesson 1 Nice to meet you. Period 1(教學(xué)設(shè)計(jì))-2024-2025學(xué)年接力版英語(yǔ)四年級(jí)上冊(cè)
- 11 四通八達(dá)的交通(教學(xué)設(shè)計(jì))-2023-2024學(xué)年道德與法治三年級(jí)下冊(cè)統(tǒng)編版
- 2 點(diǎn)亮小燈泡 教學(xué)設(shè)計(jì)-2023-2024學(xué)年科學(xué)四年級(jí)下冊(cè)教科版
- 2025年激光隧道斷面測(cè)量系統(tǒng)項(xiàng)目發(fā)展計(jì)劃
- 餐車訂購(gòu)合同范本
- 婚禮公司合同范本
- 17要是你在野外迷了路 教學(xué)設(shè)計(jì)-2023-2024學(xué)年語(yǔ)文二年級(jí)下冊(cè)統(tǒng)編版
- 《榜樣9》觀后感心得體會(huì)一
- 2024年上海普陀區(qū)司法局招聘人民調(diào)解員考試真題
- 駕照考試題庫(kù)及答案(完整版)
- 2024年3、6、9月青少年軟件編程Python等級(jí)考試一級(jí)真題(全3套 含答案)
- 大族激光打標(biāo)機(jī)培訓(xùn)
- 2025中國(guó)鐵塔公司社會(huì)招聘85人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 專題06 現(xiàn)代文閱讀(解析版)2015-2024單招考試語(yǔ)文(四川真題)
- 創(chuàng)傷中心臨床路徑管理制度
- 《教育研究方法》課程教學(xué)大綱
- 《固體食品罐用冷軋電鍍錫鋼板及鋼帶》編制說(shuō)明
- 2025年全國(guó)道路運(yùn)輸企業(yè)安全管理人員考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論