文件加解密完整性校验_第1页
文件加解密完整性校验_第2页
文件加解密完整性校验_第3页
文件加解密完整性校验_第4页
文件加解密完整性校验_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上海电力学院 网络安全程序设计 实验报告 题目: 基于CryptoAPI 实现文件加解密、完整性校验院系: 计算机科学与技术学院 专业年级: 信息安全 三年级 学生姓名:吴xx 学号: xxxxxxxx 一、实验目的和要求: 掌握基于CryptoAPI文件加密、解密、完整性校验的流程以及实现方法。二、实验内容:1) 基于CryptoAPI的文件加密;2) 基于CryptoAPI的文件解密;三、主要实验设备: PC机,Windows XP,VC+6.0. 四、实验步骤 1)在VC下配置CryptoAPI编译环境 2) 在VC+6.0下实现基于CryptoAPI的文件加密。3) 在VC+6.0下实

2、现基于CryptoAPI的文件解密。4)实现基于CryptAPI实现基于MD5的文件完整性校验。 要求:1) 给出算法的详细实现过程。a) 获得csp句柄b) 构造密钥c) 数据加密d) 数据解密e) 释放相关资源2) 给出算法实现的流程图1. 加密时:(1)创建会话密钥 (2)加密数据 (3)安全保存或交换会话密钥2. 解密时:(1)获取会话密钥 (2)解密数据基于CryptoAPI的文件加密#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif#include<stdio.h>#include<string.h>#

3、include<conio.h>#include<windows.h>#include<wincrypt.h>#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING|X509_ASN_ENCODING)#define KEYLENGTH 0x00800000void HandleError(char*s);HCRYPTPROV GetCryptProv();#define ENCRYPT_ALGORITHM CALG_RC4#define ENCRYPT_BLOCK_SIZE 8BOOL EncryptFile( PCHA

4、R szSource, PCHAR szDestination, PCHAR szPassword);HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword);HCRYPTKEY GenKeyByRandom(HCRYPTPROV hCryptProv,FILE*hDestination);void main(void)PCHAR szSource;PCHAR szDestination;CHAR szPassword100=""char response;if(!(szSource=(char*)

5、malloc(100)HandleError("Memory allocation failed.");if(!(szDestination=(char*)malloc(100)HandleError("Memory allocation failed.");printf("加密一个文件.nn");printf("请输入需要被加密文件的名称:");fgets(szSource,100,stdin);if(szSourcestrlen(szSource)-1='n')szSourcestrlen(sz

6、Source)-1='0'printf("请输入需要输出文件文件的名称:");fgets(szDestination,100,stdin);if(szDestinationstrlen(szDestination)-1='n')szDestinationstrlen(szDestination)-1='0'printf("要使用密码对这个文件加密吗?(y/n)");response=getchar();if(response='y')printf("请输入密码:");ge

7、tchar();gets(szPassword);elseprintf("密钥将生成但没有使用密码.n");if(EncryptFile(szSource,szDestination,szPassword)printf("对文件%s的加密已经成功1n",szSource);printf("加密后的数据存储在文件%s中.n",szDestination);elseHandleError("解密文件出错!");if(szSource)free(szSource);if(szDestination)free(szDest

8、ination);static BOOL EncryptFile(PCHAR szSource,PCHAR szDestination,PCHAR szPassword)FILE *hSource;FILE *hDestination;HCRYPTPROV hCryptProv;HCRYPTKEY hKey;PBYTE pbBuffer;DWORD dwBlockLen;DWORD dwBufferLen;DWORD dwCount;if(hSource=fopen(szSource,"rb")printf("原文件%s已经打开.n",szSource)

9、;elseHandleError("打开原文件出错!");if(hDestination=fopen(szDestination,"wb")printf("目标文件%s已经打开.n",szDestination);elseHandleError("打开目标文件出错!");hCryptProv=GetCryptProv();if(!szPassword|strcmp(szPassword,"")=0)hKey=GenKeyByRandom(hCryptProv,hDestination);else

10、hKey=GenKeyByPassword(hCryptProv,szPassword);dwBlockLen=1000-1000%ENCRYPT_BLOCK_SIZE;if(ENCRYPT_BLOCK_SIZE>1)dwBufferLen=dwBlockLen + ENCRYPT_BLOCK_SIZE;elsedwBufferLen=dwBlockLen;if(pbBuffer=(BYTE*)malloc(dwBufferLen)printf("已经为缓冲区分配了内存.n");elseHandleError("所需内存不够.n");dodwCou

11、nt=fread(pbBuffer,1,dwBlockLen,hSource);if(ferror(hSource)HandleError("读取明文文件出错!n");if(!CryptEncrypt(hKey,0,feof(hSource),0,pbBuffer,&dwCount,dwBufferLen)HandleError("Error during CryptEncrypt.n");fwrite(pbBuffer,1,dwCount,hDestination);if(ferror(hDestination)HandleError(&quo

12、t;写入密文时出错."); while(!feof(hSource);if(hSource)if(fclose(hSource)HandleError("关闭原文件出错!");if(hDestination)if(fclose(hDestination)HandleError("关闭目标文件出错!");if(pbBuffer)free(pbBuffer);if(hKey)if(!(CryptDestroyKey(hKey)HandleError("Error during CryptDestroyKey");if(hCryp

13、tProv)if(!(CryptReleaseContext(hCryptProv,0)HandleError("Error during CryptReleaseContext");return(TRUE);HCRYPTPROV GetCryptProv()HCRYPTPROV hCryptProv;if(CryptAcquireContext(&hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0)printf("加密服务提供者句柄获取成功!n");elseif(!CryptAcquireConte

14、xt(&hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET)HandleError("重新建立一个新的密钥集出错!");return hCryptProv;void HandleError(char*s)printf("程序执行发成错误!n");printf("%sn");printf("错误代码为:%x.n",GetLastError();printf("程序终止执行!n");exit(1);HCRYPTKEY

15、GenKeyByRandom(HCRYPTPROV hCryptProv,FILE*hDestination)HCRYPTKEY hKey;HCRYPTKEY hXchgKey;PBYTE pbKeyBlob;DWORD dwKeyBlobLen;if(CryptGenKey(hCryptProv,ENCRYPT_ALGORITHM,KEYLENGTH|CRYPT_EXPORTABLE,&hKey)printf("一个会话密钥已经被创建.n");elseHandleError("Error during CryptGenKey.n");if(Cr

16、yptGenKey(hCryptProv,AT_KEYEXCHANGE,0,&hXchgKey)printf("交换密钥对已经创建.n");elseHandleError("在试图创建交换密钥时出错.n");if(CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,NULL,&dwKeyBlobLen)printf("此密钥块的长度是%d字节.n",dwKeyBlobLen);elseHandleError("计算密钥数据块长度出错!n");if(pbKeyBlob=

17、(BYTE*)malloc(dwKeyBlobLen)printf("已经问此密钥分配了内存.n");elseHandleError("所需内存不够.n");if(CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,pbKeyBlob,&dwKeyBlobLen)printf("此回话密钥已经被导出.n");elseHandleError("Error during CryptEXprotKey!n");if(hXchgKey)if(!(CryptDestroyKey(hXc

18、hgKey)HandleError("Error during CryptDestroyKey");hXchgKey=0;fwrite(&dwKeyBlobLen,sizeof(DWORD),1,hDestination);if(ferror(hDestination)HandleError("写密钥块长度出错.");elseprintf("密钥块长度已经被写入.n");fwrite(pbKeyBlob,1,dwKeyBlobLen,hDestination);if(ferror(hDestination)HandleErro

19、r("写入密钥数据出错");elseprintf("此密钥块数据已经被写入目标文件.n");free(pbKeyBlob);return hKey; HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword) HCRYPTKEY hKey;HCRYPTHASH hHash;if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)printf("一个哈希句柄已经被创建.n");elseHandleErr

20、or("Error during CryptCreateHash!n");if(CryptHashData( hHash, (BYTE*)szPassword, strlen(szPassword), 0)printf("密码已经被添加到哈希表中.n");elseHandleError("Error during CryptHashData.n");if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey)printf("通过密

21、码的哈希值获得了加密密钥.n");elseHandleError("Error during CryptDeriveKey!n");if(hHash)if(!(CryptDestroyHash(hHash)HandleError("Error during CryptDestroyHash");hHash=0;return hKey;#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0400#endif#include <stdio.h>#include <stdlib.h>#incl

22、ude <windows.h>/#include <wincrypt.h>#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)#define KEYLENGTH 0x00800000#define ENCRYPT_ALGORITHM CALG_RC2 #define ENCRYPT_BLOCK_SIZE 8 void HandleError(char *s);BOOL CryEncryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szP

23、assword); BOOL CryDecryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szPassword); void Test_15_2()PCHAR szSource; PCHAR szDestination; PCHAR szPassword; char response;if(!(szSource=(char *)malloc(100)HandleError("malloc 失败.");if(!(szDestination=(char *)malloc(100)HandleError("mal

24、loc 失败.");if(!(szPassword=(char *)malloc(100)HandleError("malloc 失败.");printf("文件解密. nn");printf("输入待解密的文件名: ");scanf("%s",szSource);printf("输入明文保存文件名: ");scanf("%s",szDestination);printf("是否使用口令加密的文件? ( y/n ) ");getchar();sc

25、anf("%c",&response);if(response = 'y')printf("输入口令:");scanf("%s",szPassword);elseprintf("没有使用口令加密,加密密钥以密文的形式保存在文件中。n");free(szPassword);szPassword = NULL;if(!CryDecryptFile(szSource, szDestination, szPassword)printf("n解密文件失败. n"); else pr

26、intf("n解密文件%s 成功 n", szSource);printf("解密后的文件保存为 %s .n",szDestination);/*函数功能:解密文件 参数:szSource:IN,待解密的密文文件路径szDestination:IN 加密后的明文文件路径szPassword:IN 口令*/static BOOL CryDecryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szPassword) /-/ 声明变量FILE *hSource;/解密的密文文件句柄FILE *hDesti

27、nation;/明文文件句柄HCRYPTPROV hCryptProv; /CSP句柄HCRYPTKEY hKey;/密钥句柄HCRYPTHASH hHash;/摘要句柄PBYTE pbKeyBlob = NULL; DWORD dwKeyBlobLen; PBYTE pbBuffer; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; BOOL status = FALSE; /-/ 打开密文文件if(!(hSource = fopen(szSource,"rb") HandleError("打开密文文件失败

28、 !");/-/ 打开目标文件即解密后的明文文件if(!(hDestination = fopen(szDestination,"wb")HandleError("打开明文文件失败 !"); /-/ 获得CSP句柄if(!CryptAcquireContext( &hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) HandleError("调用 CryptAcquireContext 函数出错 !"); /-/ 检查szPassword是否为空if(!szPa

29、ssword) /szPassword为空 /-/ 使用保存在文件中的加密密钥解密 /从密文文件中读取密钥 fread(&dwKeyBlobLen, sizeof(DWORD), 1, hSource); if(ferror(hSource) | feof(hSource)HandleError("读文件头失败!"); if(!(pbKeyBlob = (BYTE *)malloc(dwKeyBlobLen)HandleError("申请内存失败!."); fread(pbKeyBlob, 1, dwKeyBlobLen, hSource); i

30、f(ferror(hSource) | feof(hSource)HandleError("读文件头失败!"); /-/ 导入密钥到CSP,使用私钥解密会话密钥,产生hKey。if(!CryptImportKey( hCryptProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey) HandleError("调用 CryptImportKey 函数出错 !"); else /口令非空,口令派生出的会话密钥解密文件 /-/ 创建哈希对象if(!CryptCreateHash( hCryptProv, CALG_MD5

31、, 0, 0, &hHash)HandleError("调用 CryptCreateHash 函数出错 !"); /-/ 哈希口令if(!CryptHashData( hHash, (BYTE *)szPassword, strlen(szPassword), 0) HandleError("调用 CryptHashData 函数出错 !"); /-/ 从哈希对象中派生出会话密钥if(!CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey) Handl

32、eError("调用 CryptDeriveKey 函数出错 !"); /-/ 销毁哈希对象CryptDestroyHash(hHash); hHash = 0; /-/现在已经获得了解密数据的会话密钥。dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; dwBufferLen = dwBlockLen; if(!(pbBuffer = (BYTE *)malloc(dwBufferLen) HandleError("Out of memory!n"); /-/ 解密密文,并把明文写到明文文件中。do /-/ 循环读取密文dwCount = fread( pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)HandleError("读取密文失败!");/-/ 数据解密if(!CryptDecrypt( hKey, 0, feof(hSource), 0, pbBuffer, &dwCount) HandleError("CryptDecrypt解密失败!"); /-/ 写明文数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论