ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:18.05KB ,
资源ID:29592636      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29592636.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用CryptoAPI进行数据加密.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用CryptoAPI进行数据加密.docx

1、用CryptoAPI进行数据加密用CryptoAPI进行数据加密南京理工大学计算机系 胡静 李蔚清 由于过于复杂的加密算法实现起来非常困难,所以在过去,许多应用程序只能使用非常简单的加密技术,这样做的结果就是加密的数据很容易被人破译。而使用Microsoft提供的加密应用程序接口(即Cryptography API),或称CryptoAPI,可以方便地在应用程序中加入强大的加密功能,而不必考虑基本的算法。本文将对CryptoAPI及其使用的数据加密原理作一简单的介绍,然后给出了用CryptoAPI编写加密程序的大致步骤,最后以一个文件的加密、解密程序为例演示CryptoAPI的部分功能。1.

2、CryptoAPI简介CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器

3、消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。CryptoAPI的体系结构如图1。图1 CryptoAPI体系结构目前支持CryptoAPI的Windows系统有:Windows 95 OSR2、Windows NT SP3及后续版本、Windows 98、Windows 2000等。CryptoAPI的配置信息存储在注册表中,包括如下密钥:HKEY_LOCAL_MACHINESOFTWAREMicrosoft Cryptography DefaultsHKEY_CURRENT_USER Software Microsoft Cryptography Provi

4、ders2. 数据加密原理数据加密流程如图2所示。图2 数据加密流程CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对。会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递。公共/私人密钥对使用一个公共密钥和一个私人密钥,私人密钥只有专人才能使用,公共密钥可以广泛传播。如果密钥对中的一个用于加密,另一个一定用于解密。公共/私人密钥对算法很慢,一般只用于加密小批量数据,例如用于加密会话密钥。CryptoAPI支持两种基本的编码方法:流式编码和块编码。流式编码在明码文本的每一位上创建编码位,速度较快,但安全性较低。块编码在一个完整的块上(一般为64位)工作,需要使用填充

5、的方法对要编码的数据进行舍入,以组成多个完整的块。这种算法速度较慢,但更安全。3. 应用举例下面以两个文件加密与解密的C程序片断为例,演示一下CryptoAPI的强大功能。这两个程序均为Win32控制台应用,程序省略了出错处理,实际运行时请加入。1 文件加密#include #include #include #include /确定使用RC2块编码或是RC4流式编码#ifdef USE_BLOCK_CIPHER#define ENCRYPT_ALGORITHM CALG_RC2#define ENCRYPT_BLOCK_SIZE 8#else#define ENCRYPT_ALGORITHM

6、 CALG_RC4#define ENCRYPT_BLOCK_SIZE 1#endifvoid CAPIDecryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword);void _cdecl main(int argc, char *argv)PCHAR szSource = NULL;PCHAR szDestination = NULL;PCHAR szPassword = NULL;/ 验证参数个数if(argc != 3 & argc != 4) printf( USAGE: decrypt n );exit(1);/

7、读取参数.szSource = argv1;szDestination = argv2;if(argc = 4) szPassword = argv3;CAPIDecryptFile(szSource, szDestination, szPassword);/*szSource为要加密的文件名称,szDestination为加密过的文件名称,szPassword为加密口令*/void CAPIEncryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword)FILE *hSource = NULL;FILE *hDestinat

8、ion = NULL;INT eof = 0;HCRYPTPROV hProv = 0;HCRYPTKEY hKey = 0;HCRYPTKEY hXchgKey = 0;HCRYPTHASH hHash = 0;PBYTE pbKeyBlob = NULL;DWORD dwKeyBlobLen;PBYTE pbBuffer = NULL;DWORD dwBlockLen;DWORD dwBufferLen;DWORD dwCount;hSource= fopen(szSource, rb );/ 打开源文件hDestination = fopen(szDestination, wb ) ;/

9、.打开目标文件/ 连接缺省的CSPCryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);if(szPassword = NULL) /口令为空,使用随机产生的会话密钥加密/ 产生随机会话密钥。CryptGenKey(hProv, ENCRYPT_ALGORITHM, CRYPT_EXPORTABLE, &hKey)/ 取得密钥交换对的公共密钥CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey);/ 计算隐码长度并分配缓冲区CryptExportKey(hKey, hXchgKey, SI

10、MPLEBLOB, 0, NULL, &dwKeyBlobLen);pbKeyBlob=malloc(dwKeyBlobLen) = NULL) ;/ 将会话密钥输出至隐码CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwKeyBlobLen)/ 释放密钥交换对的句柄CryptDestroyKey(hXchgKey);hXchgKey = 0;/ 将隐码长度写入目标文件fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestination);/将隐码长度写入目标文件fwrite(pbKeyB

11、lob,1,dwKeyBlobLen, hDestination); else /口令不为空, 使用从口令派生出的密钥加密文件CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);/ 建立散列表CryptHashData(hHash, szPassword,strlen(szPassword), 0); /散列口令/ 从散列表中派生密钥CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey);/ 删除散列表CryptDestroyHash(hHash);hHash = 0;/计算一次加密的数据字节

12、数,必须为ENCRYPT_BLOCK_SIZE的整数倍dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;/如果使用块编码,则需要额外空间if(ENCRYPT_BLOCK_SIZE 1) dwBufferLen=dwBlockLen + ENCRYPT_BLOCK_SIZE; else dwBufferLen = dwBlockLen;/分配缓冲区pbBuffer = malloc(dwBufferLen);/加密源文件并写入目标文件do / 从源文件中读出dwBlockLen个字节dwCount = fread(pbBuffer, 1, dwBlock

13、Len, hSource);eof = feof(hSource);/加密数据CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, dwBufferLen);/ 将加密过的数据写入目标文件fwrite(pbBuffer, 1, dwCount, hDestination); while(!feof(hSource);printf( OKn );./关闭文件、释放内存2 文件解密void CAPIDecryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword)./变量声明、文件操作同

14、文件加密程序CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);if(szPassword = NULL) / 口令为空,使用存储在加密文件中的会话密钥解密/ 读隐码的长度并分配内存fread(&dwKeyBlobLen,sizeof(DWORD),1,hSource);pbKeyBlob=malloc(dwKeyBlobLen)= NULL);/ 从源文件中读隐码.fread(pbKeyBlob, 1, dwKeyBlobLen, hSource);/ 将隐码输入CSPCryptImportKey(hProv, pbKeyBlo

15、b, dwKeyBlobLen, 0, 0, &hKey); else / 口令不为空, 使用从口令派生出的密钥解密文件CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);CryptHashData(hHash, szPassword, strlen(szPassword), 0);CryptDeriveKey(hProv, ENCRYPT_ALGORITHM,hHash, 0, &hKey);CryptDestroyHash(hHash);hHash = 0;dwBlockLen=1000-1000%ENCRYPT_BLOCK_SIZE;if(ENC

16、RYPT_BLOCK_SIZE 1) dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; else dwBufferLen = dwBlockLen;pbBuffer = malloc(dwBufferLen);/解密源文件并写入目标文件do dwCount = fread(pbBuffer, 1, dwBlockLen,hSource);eof = feof(hSource);/ 解密数据CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &dwCount);/ 将解密过的数据写入目标文件fwrite(pbBuffer,

17、1, dwCount, hDestination); while(!feof(hSource);printf( OKn );./关闭文件、释放内存正文:给文件加密的技术很多,其中又分为不同等级,以适合不同场合的需要.这里给出最简单的文件加密技术,即采用文件逐字节与密码异或方式对文件进行加密,当解密时,只需再运行一遍加密程序即可.下面是一个实例程序,能对任意一个文件进行加密,密码要求用户输入,限8位以内(当然你可以再更改).程序有很好的容错设计,这是我们应该学习的./* Turbo 2.0 pass. give file a password! */#include#include#includ

18、e#includevoid dofile(char *in_fname,char *pwd,char *out_fname);/*对文件进行加密的具体函数*/void main(int argc,char *argv)/*定义main()函数的命令行参数*/char in_fname30;/*用户输入的要加密的文件名*/char out_fname30;char pwd8;/*用来保存密码*/if(argc!=4)/*容错处理*/printf(nIn-fname:n);gets(in_fname);/*得到要加密的文件名*/printf(Password:n);gets(pwd);/*得到密码

19、*/printf(Out-file:n);gets(out_fname);/*得到加密后你要的文件名*/dofile(in_fname,pwd,out_fname);else/*如果命令行参数正确,便直接运行程序*/strcpy(in_fname,argv1);strcpy(pwd,argv2);strcpy(out_fname,argv3);dofile(in_fname,pwd,out_fname);/*加密子函数开始*/void dofile(char *in_fname,char *pwd,char *out_file)FILE *fp1,*fp2;register char ch;int j=0;int j0=0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1