![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa1.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa2.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa3.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa4.gif)
![基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa/71bb7655-9a3b-4e6b-bec8-6796b4c6e3aa5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)摘要:隨著網(wǎng)絡(luò)技術(shù)的快速發(fā)展,使我們的生活豐富多彩,工作的效率也提高了不少。盡管網(wǎng)絡(luò)的出現(xiàn)給我們帶來了很多的福利和方便,但網(wǎng)絡(luò)安全問題也在時時困擾著我們,病毒、黑客的侵犯,各種威脅之聲的不斷傳出,網(wǎng)絡(luò)安全問題也就成為了社會關(guān)注的重點問題。文件的安全就是安全問題之一,文件可能會包含了很多的機密,一旦被黑客竊取,那損失是不可想象的。所以下面我們簡單的談?wù)勎募咏饷艿南嚓P(guān)算法。因為過于復雜的加密算法實現(xiàn)起來非常困難,所以在過去,許多應用程序只能使用非常簡單的加密技術(shù),這樣做的結(jié)果就是加密的數(shù)據(jù)很容易就可以被人破譯。而使用Microsoft提供的加密應
2、用程序接口(即Cryptography API),或稱CryptoAPI,就可以方便地在應用程序中加入強大的加密功能,而不必考慮基本的算法。我們利用CryptoAPI來實現(xiàn)對文件的加密和解密。關(guān)鍵詞:文件的加解密,CryptoAPI。1、 設(shè)計要求與實現(xiàn):基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn)2、 設(shè)計環(huán)境與工具1 軟件環(huán)境、工具Windows 8.1 、visual studio 20122 CryptoAPI加密服務(wù)提供者CSP加密服務(wù)相關(guān)的所有操作都在CSP實現(xiàn),它是真正實現(xiàn)加密相關(guān)服務(wù)的獨立模塊,既可以由軟件實現(xiàn)也可以由硬件實現(xiàn)。每個CSP必須包含一個動態(tài)鏈接庫和一個簽名文
3、件,簽名文件用于保證底層CSP的安全性,CryptoAPI接口在加載每個CSP時,需要驗證CSP的簽名,如果簽名無效,則拒絕加載,CSP的簽名由微軟公司簽發(fā)。同時,每個CSP都有一個名字和一個類型,名字必須是唯一的,這樣便于CryptoAPI找到對應的CSP。CSP是真正實行加密的獨立模塊,可以由軟件實現(xiàn)也可以由硬件實現(xiàn)。CSP必須符合CryptoAPI接口規(guī)范。每個CSP有一個密鑰庫,密鑰庫用于存儲密鑰。每個密鑰庫包括一個或多個密鑰容器(Key Containers)。每個密鑰容器中包含屬于一個特定用戶的所有密鑰對。每個密鑰容器被賦予一個唯一的名字。在銷毀密鑰容器前,CSP將永久保存每一個密
4、鑰容器,包括保存每個密鑰容器中的公/私鑰對。每個CSP都有一個名字和一個類型。每個CSP的名字是唯一的,這樣便于CryptoAPI找到對應的CSP。目前已經(jīng)有9種CSP類型,并且還在增長。下表列出它們支持的密鑰交換算法、簽名算法、對稱加密算法和Hash算法。二、詳細設(shè)計(1)原理概述CryptoAPI是一組函數(shù),為了完成數(shù)學計算,必須具有密碼服務(wù)提供者模塊(CSP)。Microsoft通過捆綁RSA Base Provider在操作系統(tǒng)級提供一個CSP,使用RSA公司的公鑰加密算法,更多的CSP可以根據(jù)需要增加到應用中。事實上,CSP有可能與特殊硬件設(shè)備(如智能卡)一起來進行數(shù)據(jù)加密。Cryp
5、toAPI接口允許簡單的函數(shù)調(diào)用來加密數(shù)據(jù),交換公鑰,散列一個消息來建立摘要以及生成數(shù)字簽名。它還提供高級的管理操作,如從一組可能的CSP中使用一個CSP。此外,CryptoAPI還為許多高級安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET,用于加密客戶機/服務(wù)器消息的PCT,用于在各個平臺之間來回傳遞機密數(shù)據(jù)和密鑰的PFX,代碼簽名等等。數(shù)據(jù)加解密,程序分為四大主要部分:1、 獲取CSP句柄:真正實現(xiàn)加密相關(guān)服務(wù)的獨立模塊。2、 獲取加密密鑰:進行加、解密,必然需要構(gòu)造密鑰。 兩種方法:通過哈希值構(gòu)造通過隨機數(shù)構(gòu)造。3、 數(shù)據(jù)加密與解密:實現(xiàn)對數(shù)據(jù)進行加密解密操作。4、 相關(guān)資源釋放:釋放申請
6、的相關(guān)資源。 (下圖為數(shù)據(jù)加解密的流程) (參考網(wǎng)絡(luò)安全程序設(shè)計教程李紅嬌著) (2) CryptoAPI應用程序的編譯環(huán)境包含的頭文件 #include <windows.h> #include <wincrypt.h>包含的靜態(tài)鏈接庫鏈接CryptoAPI函數(shù)必須有靜態(tài)庫Crypto32.lib的支持,部分CryptoAPI函數(shù)可能還需要靜態(tài)庫advapi32.lib及CryptUI.lib的支持。若在VC+6.0和VS2012上編譯程序,則需加上以下語句# ifndef _WIN32_WINNT# define _WIN32_WINNT 0x0400# endif
7、(3)實驗步驟1) 在VS2012下實現(xiàn)基于CryptoAPI的文件加密。 a、創(chuàng)建會話密鑰 為保證數(shù)據(jù)加密效率,CryptoAPI規(guī)定數(shù)據(jù)加密操作必須基于對稱密碼進行。于是,加密方進行加密操作首先必須創(chuàng)建會話密鑰,一般可以通過調(diào)用函數(shù)CryptoGenKey或CryptDeriveKey創(chuàng)建,在創(chuàng)建會話密鑰時指定加密算法。b、加密數(shù)據(jù) 在創(chuàng)建會話密鑰后,則可以調(diào)用CryptEncrypt函數(shù)進行加密操作。加密操作需要注意的是每次加密數(shù)據(jù)塊的長度必須根據(jù)具體的算法和算法類型確定,一般來說,加密數(shù)據(jù)塊長度為算法規(guī)定的基準加密塊長度的整數(shù)倍。對于分組密碼,需為密文數(shù)據(jù)
8、塊預留一個基準塊長度的空間。c、安全保存或交換會話密鑰數(shù)據(jù)加密完成后,當在今后的某個時間或其他用戶需要解密數(shù)據(jù)時,必須保存會話密鑰以備后用,或者是傳輸會話密鑰給特定用戶以使其能正確進行解密操作。2) 在VS2012下實現(xiàn)基于CryptoAPI的文件解密。 a、獲取會話密鑰 根據(jù)保存或傳輸會話密鑰方式不同,進行相應的操作正確獲取會話密鑰b、解密數(shù)據(jù)利用獲取的會話密鑰調(diào)用函數(shù)CryptDecrypt解密數(shù)據(jù),它和函數(shù)CryptEncrypt互為逆操作。同樣的,解密操作需要注意的是每次解密數(shù)據(jù)塊的長度必須根據(jù)具體的算法和算法類型確定,一般來說,解密數(shù)據(jù)塊長度為算法基準加
9、密塊長度的整數(shù)倍。要求: 1) 算法的詳細實現(xiàn)過程。 a) 獲得csp句柄 b) 構(gòu)造密鑰 c) 數(shù)據(jù)加密 d) 數(shù)據(jù)解密e) 釋放相關(guān)資源 2) 算法實現(xiàn)的流程圖 三、實驗結(jié)果原文件加密后解密后PS:我們在加密的時候,沒有采用通過隨機數(shù)創(chuàng)建密鑰,然后只能通過輸入密碼創(chuàng)建加密密鑰。截圖:未加密四、設(shè)計總結(jié)由于多方嘗試并編寫Openssl對文件的加解密方法,均以失敗告終,所以我們小組決定采用新的加密算法,即Windows CryptoAPI,由微軟公司提出
10、的一種安全加密應用服務(wù)框架。本次試驗的主要內(nèi)容是基于CryptoAPI的文件加解密系統(tǒng)的設(shè)計與實現(xiàn),在仔細看懂代碼的基礎(chǔ)上,真正明白了CryptoAPI的結(jié)構(gòu)體系。在加密操作時,首先要創(chuàng)建會話密鑰,在創(chuàng)建會話密鑰時指定加密算法,注意的是,創(chuàng)建會話密鑰時,它制定具體的加密算法應該注意具體的CSP是否支持此算法。我們在做加密的時候,沒有加入通過隨機數(shù)創(chuàng)建會話密鑰,只能進行輸入密碼創(chuàng)建加密密鑰。然后是進行數(shù)據(jù)的加密操作,當完成以后要進行安全保存或者交換會話密鑰。解密時要獲取會話密鑰,然后進行數(shù)據(jù)解密。CryptoAPI除直接用于加密數(shù)據(jù)外,還為許多高級安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET,
11、用于加密客戶機/服務(wù)器消息的PCT,用于在各個平臺之間來回傳遞機密數(shù)據(jù)和密鑰的PFX,代碼簽名等等。通過此次編寫程序,我對基于CryptoAPI的文件加解密系統(tǒng)有了更深層次的了解,對之前做過的基于CryptoAPI 實現(xiàn)文件完整性校驗的實驗理解的更加透徹。在編寫程序的過程中,遇到了很多棘手的問題,但是這些問題,我通過了找老師,上網(wǎng)查詢問題出錯的原因等方法努力的尋求答案,到現(xiàn)在為止,程序已經(jīng)順利完成,運行無阻。自己根據(jù)要求,從零開始做一份實驗真的不容易,需要對整體結(jié)構(gòu)局勢進行把握,在做之前要做好多重準備工作,例如運行環(huán)境(軟、硬件環(huán)境)、輸入的形式和輸入值的范圍、輸出的形式描述、功能描述。細節(jié)決
12、定成敗,對于我而言,這次的作業(yè)讓我清楚認識到,注重細節(jié)的重要性,有時候一個字母的大小寫,幾個變量的數(shù)據(jù)類型的統(tǒng)一性,考慮后選擇的更為合適的數(shù)據(jù)類型,重復執(zhí)行的問題等等,這些都讓我不斷進步。5、 源代碼加密:#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif #include <stdio.h>#include <string.h>#include <iostream>#include <conio.h>#include <windows.h>#include <wincry
13、pt.h>#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)#define KEYLENGTH 0x00800000#define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 class Encpublic:HCRYPTPROV GetCryptProv();BOOL EncryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword); HCRYPTKEY GenKeyByP
14、assword(HCRYPTPROV hCryptProv,PCHAR szPassword);#include<iostream>#include "Enc.h"using namespace std;/ 功能:加密原文szSource文件,加密后的數(shù)據(jù)存儲在szDestination文件中/ 參數(shù):/ szSource:原文文件名/ szDestination:加密后數(shù)據(jù)存儲文件/ szPassword:用戶輸入的密碼 BOOL Enc:EncryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szPas
15、sword) / 變量申明與初始化.FILE *hSource; FILE *hDestination; HCRYPTPROV hCryptProv; HCRYPTKEY hKey; PBYTE pbBuffer; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; / 打開原文文件. if(hSource = fopen(szSource,"rb") cout<<"原文文件"<<szSource<<"已經(jīng)打開. n"else cout<&l
16、t;"打開原文文件出錯!"<<endl; / 打開目標文件. if(hDestination = fopen(szDestination,"wb") cout<<"目標文件"<<szDestination<<"已經(jīng)打開. n"<<endl;elsecout<<"打開目標文件出錯!"<<endl; /獲取加密服務(wù)者句柄hCryptProv = GetCryptProv();/ 創(chuàng)建會話密鑰.if(!szPasswo
17、rd | strcmp(szPassword,"")=0 ) /hKey = GenKeyByRandom( hCryptProv, hDestination);當輸入密碼為空時,則創(chuàng)建隨機的加密密鑰,并導出創(chuàng)建的密鑰保存到文件中.cout<<"你輸入的密鑰為空!請正確輸入!"<<endl; else / 當輸入密碼不為空時,則通過輸入密碼創(chuàng)建加密密鑰hKey=GenKeyByPassword( hCryptProv, szPassword); / 因為加密算法按ENCRYPT_BLOCK_SIZE 大小塊加密,所以被加密的/ 數(shù)
18、據(jù)長度必須是ENCRYPT_BLOCK_SIZE 的整數(shù)倍。下面計算一次加密的/ 數(shù)據(jù)長度。dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; / 確定加密后密文數(shù)據(jù)塊大小. 若是分組密碼模式,則必須有容納額外塊的空間if(ENCRYPT_BLOCK_SIZE > 1) dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; else dwBufferLen = dwBlockLen; / 分配內(nèi)存空間. if(pbBuffer = (BYTE *)malloc(dwBufferLen)cout<<
19、;"已經(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<<"讀取明文文件出錯!n"/-/ 加密數(shù)據(jù). if(!CryptEncrypt(hKey,/密鑰0,/如果數(shù)據(jù)同時進行散列和加密,這里傳入一個散列對象feof(hSource),/如果是最后一個被加密的塊,
20、輸入TRUE.如果不是輸入FALSE./這里通過判斷是否到文件尾來決定是否為最后一塊。0,/保留pbBuffer,/輸入被加密數(shù)據(jù),輸出加密后的數(shù)據(jù)&dwCount,/輸入被加密數(shù)據(jù)實際長度,輸出加密后數(shù)據(jù)長度dwBufferLen)/pbBuffer的大小。 cout<<"加密數(shù)據(jù)時出錯. n" /-/ 把加密后數(shù)據(jù)寫到密文文件中 fwrite(pbBuffer, 1, dwCount, hDestination); if(ferror(hDestination) cout<<"寫入密文時出錯." while(!feof
21、(hSource); /-/ 關(guān)閉文件if(hSource)if(fclose(hSource)cout<<"關(guān)閉原文文件出錯!"if(hDestination)if(fclose(hDestination)cout<<"關(guān)閉目標文件出錯!"/-/ 釋放內(nèi)存空間. if(pbBuffer) free(pbBuffer); /-/ 銷毀會話密鑰if(hKey)if(!(CryptDestroyKey(hKey)cout<<"銷毀會話密鑰時出錯"<<endl;/-/ 釋放CSP句柄if(hC
22、ryptProv)if(!(CryptReleaseContext(hCryptProv, 0)cout<<"釋放CSP句柄時出錯"<<endl;return(TRUE); / end Encryptfile/獲取加密提供者句柄HCRYPTPROV Enc:GetCryptProv()HCRYPTPROV hCryptProv; / 加密服務(wù)提供者句柄/獲取加密提供者句柄if(CryptAcquireContext(&hCryptProv, / 加密服務(wù)提供者句柄NULL, / 密鑰容器名,這里使用登陸用戶名MS_ENHANCED_PROV,
23、 / 加密服務(wù)提供者 PROV_RSA_FULL, / 加密服務(wù)提供者類型,可以提供加密和簽名等功能0) / 標志cout<<"加密服務(wù)提供者句柄獲取成功!n"else/重新建立一個新的密鑰集 if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) cout<<"重新建立一個新的密鑰集出錯!"return hCryptProv;/ GenKeyByRandom:通過輸入密碼創(chuàng)建會話密鑰/ 參數(shù):
24、hCryptProv CSP句柄/ szPassword 輸入密碼HCRYPTKEY Enc:GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword)HCRYPTKEY hKey; HCRYPTHASH hHash;/-/ 創(chuàng)建哈希句柄. if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)cout<<"一個哈希句柄已經(jīng)被創(chuàng)建. n"else cout<<"Error during CryptCreateHash!n&q
25、uot; /-/ 計算輸入密碼的哈希值. if(CryptHashData( hHash, (BYTE *)szPassword, strlen(szPassword), 0) cout<<"密碼已經(jīng)被添加到了哈希表中. n" else cout<<"計算輸入密碼的哈希值時出錯. n" /-/ 通過哈希值創(chuàng)建會話密鑰. if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey) cout<<"通過密碼的哈希值獲得
26、了加密密鑰. n" else cout<<"Error during CryptDeriveKey!n" /-/ 銷毀哈希句柄. if(hHash) if(!(CryptDestroyHash(hHash) cout<<"Error during CryptDestroyHash"<<endl; hHash = 0;/返回創(chuàng)建的會話密鑰return hKey;解密:#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif #include <stdio.
27、h>#include <string.h>#include <conio.h>#include <windows.h>#include <wincrypt.h>#include <iostream>#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)#define KEYLENGTH 0x00800000#define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 class Dec
28、/加密文件的方法public:HCRYPTPROV GetCryptProv(); /方法的原型BOOL DecryptFile( PCHAR szSource, PCHAR szDestination, CHAR *szPassword); HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword); /通過輸入口令創(chuàng)建會話密鑰,我們的密碼HCRYPTKEY GenKeyFromFile(HCRYPTPROV hCryptProv,FILE* hSource);#ifndef _WIN32_WINNT#define _
29、WIN32_WINNT 0x0400#endif #include <stdio.h>#include <string.h>#include <conio.h>#include <windows.h>#include <wincrypt.h>#include <iostream>#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)#define KEYLENGTH 0x00800000#define ENCRYPT_ALGORITHM CALG
30、_RC4 #define ENCRYPT_BLOCK_SIZE 8 #include <iostream>#include "Dec.h"using namespace std;/*功能:解密密文szSource文件,解密后的數(shù)據(jù)存儲到szDestination文件中*/BOOL Dec:DecryptFile( PCHAR szSource, /密文文件名 PCHAR szDestination, /解密后數(shù)據(jù)存儲文件 PCHAR szPassword) /口令,即密碼,其實口令和密碼是兩回事,了解一下就行了,作用一樣 /-/ 局部變量申明與初始化.FILE
31、*hSource; FILE *hDestination; HCRYPTPROV hCryptProv; HCRYPTKEY hKey; PBYTE pbBuffer; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; BOOL status = FALSE; /-/ 打開密文文件. if(!(hSource = fopen(szSource,"rb") cout<<"打開密文文件出錯!"<<endl;/-/ 打開目標文件,用于存儲解密后的數(shù)據(jù). if(!(hDestinati
32、on = fopen(szDestination,"wb")cout<<"打開明文文件出錯!"<<endl;/獲取加密服務(wù)者句柄hCryptProv = GetCryptProv();/獲取或創(chuàng)建會話密鑰if(!szPassword| strcmp(szPassword,"")=0 ) /-/從密文文件導入保存的會話密鑰 hKey = GenKeyFromFile( hCryptProv,hSource); else /-/ 通過輸入密碼重新創(chuàng)建會話密鑰. hKey=GenKeyByPassword( hCry
33、ptProv, szPassword); / 計算一次解密的數(shù)據(jù)長度,它是ENCRYPT_BLOCK_SIZE 的整數(shù)倍dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; dwBufferLen = dwBlockLen; /-/ 分配內(nèi)存空間. if(!(pbBuffer = (BYTE *)malloc(dwBufferLen) cout<<"所需內(nèi)存不夠!"<<endl; /-/ 解密密文文件,解密后數(shù)據(jù)保存在目標文件 do /-/ 每次從密文文件中讀取dwBlockLen字節(jié)數(shù)據(jù). dwCount =
34、 fread( pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)cout<<"讀取密文文件出錯!"<<endl;/-/ 解密 數(shù)據(jù)if(!CryptDecrypt( hKey, 0, feof(hSource), 0, pbBuffer, &dwCount) cout<<"解密數(shù)據(jù)時出錯!"<<endl; /-/ 把解密后的數(shù)據(jù)寫入目標文件中. fwrite(pbBuffer, 1, dwCount, hDestination); if(fe
35、rror(hDestination) cout<<"把解密后的數(shù)據(jù)寫入目標文件中時出錯!"<<endl; while(!feof(hSource); status = TRUE; /-/ 關(guān)閉文件if(hSource)if(fclose(hSource)cout<<"關(guān)閉原文件出錯"<<endl;if(hDestination)if(fclose(hDestination)cout<<"關(guān)閉目標文件出錯"<<endl; /-/ 釋放內(nèi)存空間 if(pbBuffer
36、) free(pbBuffer); /-/ 銷毀會話密鑰if(hKey)if(!(CryptDestroyKey(hKey)cout<<"銷毀會話密鑰時出錯"<<endl; /-/ 釋放CSP句柄if(hCryptProv)if(!(CryptReleaseContext(hCryptProv, 0)cout<<"釋放CSP句柄時出錯!"<<endl; return status; / end DecryptfileHCRYPTPROV Dec:GetCryptProv()HCRYPTPROV hCrypt
37、Prov; / 加密服務(wù)提供者句柄/獲取加密提供者句柄if(CryptAcquireContext(&hCryptProv, / 加密服務(wù)提供者句柄NULL, / 密鑰容器名,這里使用登陸用戶名MS_ENHANCED_PROV, / 加密服務(wù)提供者 PROV_RSA_FULL, / 加密服務(wù)提供者類型,可以提供加密和簽名等功能0) / 標志cout<<"加密服務(wù)提供者句柄獲取成功!n"/cout<<"加密服務(wù)提供者句柄獲取成功"<<endl;else/重新建立一個新的密鑰集 if(!CryptAcquireCo
38、ntext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) cout<<"重新建立一個新的密鑰集出錯!"<<endl;return hCryptProv;HCRYPTKEY Dec:GenKeyFromFile(HCRYPTPROV hCryptProv,FILE* hSource)HCRYPTKEY hKey; PBYTE pbKeyBlob; DWORD dwKeyBlobLen; /從密文文件中獲取密鑰數(shù)據(jù)塊長度,并分配內(nèi)存空間. fread(&a
39、mp;dwKeyBlobLen, sizeof(DWORD), 1, hSource); if(ferror(hSource) | feof(hSource)cout<<"讀取密文文件中密鑰數(shù)據(jù)塊長度出錯!"<<endl; if(!(pbKeyBlob = (BYTE *)malloc(dwKeyBlobLen)cout<<"內(nèi)存分配出錯"<<endl; /-/ 從密文文件中獲取密鑰數(shù)據(jù)塊fread(pbKeyBlob, 1, dwKeyBlobLen, hSource); if(ferror(hSourc
40、e) | feof(hSource)cout<<"讀取密文文件中密鑰數(shù)據(jù)塊出錯!"<<endl; /-/ 導入會話密鑰到 CSP. if(!CryptImportKey( hCryptProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey) cout<<"Error during CryptImportKey!"<<endl; if(pbKeyBlob) free(pbKeyBlob);/返回導出的會話密鑰return hKey;HCRYPTKEY Dec:GenKey
41、ByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword)HCRYPTKEY hKey; HCRYPTHASH hHash;/-/ 創(chuàng)建哈希句柄. if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)cout<<"一個哈希句柄已經(jīng)被創(chuàng)建. n"else cout<<"Error during CryptCreateHash!"<<endl; /-/ 計算輸入密碼的哈希值. if(CryptHashData( hH
42、ash, (BYTE *)szPassword, strlen(szPassword), 0) cout<<"此密碼已經(jīng)被添加到了哈希表中. n" else cout<<"Error during CryptHashData"<<endl; / 通過哈希值創(chuàng)建會話密鑰.if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey) cout<<"從這個密碼的哈希值獲得了一個加密密鑰. n" el
43、se cout<<"哈希值創(chuàng)建會話密鑰時出錯!"<<endl; / 銷毀哈希句柄. if(hHash) if(!(CryptDestroyHash(hHash) cout<<"銷毀哈希句柄時出錯"<<endl; hHash = 0;/返回創(chuàng)建的會話密鑰return hKey;主函數(shù)#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif #include "Enc.h" /引入我們寫的加密頭文件#include "Dec.h&q
44、uot; /引入我們寫的解密頭文件#include <stdio.h>#include <string.h>#include <iostream>#include <conio.h> /需要的庫#include <windows.h> /需要的庫#include <wincrypt.h> /需要的庫using namespace std;#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) /* 這些宏定義有用,不可去除*/#define KE
45、YLENGTH 0x00800000HCRYPTPROV GetCryptProv(); /獲取加密提供者句柄的方法void main(void) Enc enc; /加密對象Dec dec; /解密對象 PCHAR szSource; /原文文件名 PCHAR szDestination; /加密后數(shù)據(jù)存儲文件CHAR szPassword100 = "" /用戶輸入口令,這里為ID碼 char response; /提示密碼信息選擇int choose; /處理方式選擇,是加密還是解密 1加密 2解密int endflag=1;char done;docout<&
46、lt;"請你選擇處理方式:"<<endl;cout<<"1.加密"<<endl;cout<<"2.解密"<<endl;cout<<endl;cin>>choose;switch(choose)case 1:/加密模塊if(!(szSource=(char *)malloc(100) /c語言的分配內(nèi)存方法cout<<"內(nèi)存分配失敗."<<endl;if(!(szDestination=(char *)mall
47、oc(100)cout<<"內(nèi)存分配失敗."<<endl;cout<<"加密一個文件. nn"cout<<"請輸入需要被加密文件的名稱(絕對路徑): "<<endl; /這里要很注意,輸入的需是絕對路徑,如:d:mytesta.txtcin>>szSource;cout<<"請輸入要輸出文件的名稱:"<<endl; /同樣絕對路徑,解密時也一樣cin>>szDestination;cout<<"要使用密碼對這個文件加密嗎(絕對路徑)? ( y/n )"<<endl;cin>>response;if(response = 'y')cout<<"請輸入密碼:"<<endl;cin&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度競業(yè)限制合同在體育產(chǎn)業(yè)的合同應用
- 第十七章第一節(jié)《電流與電壓和電阻的關(guān)系》教學設(shè)計-2024-2025學年人教版物理九年級上學期
- 2025年度網(wǎng)絡(luò)安全防護咨詢股權(quán)合作協(xié)議
- 2025年衛(wèi)浴三件套項目可行性研究報告
- 二零二五年度股東合伙出資協(xié)議書:現(xiàn)代農(nóng)業(yè)產(chǎn)業(yè)投資合作協(xié)議
- 三年級數(shù)學100以內(nèi)整數(shù)除法計算題綜合作業(yè)例題帶答案
- 2025年中國圣誕裝飾蘋果行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 全國蘇科版初中信息技術(shù)七年級上冊第三單元第1節(jié)《文本加工工具》教學設(shè)計
- 2025年免疫分析儀器及試劑項目合作計劃書
- Unit4 I have a pen pal PartA let's learn(教學設(shè)計)-2024-2025學年人教PEP版英語六年級上冊
- 新產(chǎn)品開發(fā)(toshiba案例分析組)
- 4.1.1 有理數(shù)指數(shù)冪-參考課件
- 人教版六年級數(shù)學下冊全冊大單元教學任務(wù)單
- JJF(新) 112-2023 微量殘?zhí)繙y定儀校準規(guī)范
- 2024銷售人員年終工作總結(jié)2篇
- 2024年牛排行業(yè)分析報告及未來發(fā)展趨勢
- 食品投訴處理培訓課件
- 血液科品管圈PDCA案例合集
- 創(chuàng)傷患者護理和評估
- 【全套】醫(yī)院智能化系統(tǒng)報價清單
- 北師大版五年級數(shù)學上冊典型例題系列之期中專項練習:分段計費問題(解析版)
評論
0/150
提交評論