L006001006CryptoAPI安全服务的编程数据加密实验.docx
《L006001006CryptoAPI安全服务的编程数据加密实验.docx》由会员分享,可在线阅读,更多相关《L006001006CryptoAPI安全服务的编程数据加密实验.docx(16页珍藏版)》请在冰豆网上搜索。
L006001006CryptoAPI安全服务的编程数据加密实验
课程编写
类别
内容
实验课题名称
CryptoAPI安全服务的编程-数据加密实验
实验目的与要求
通过实验了解CryptoAPI对数据文件加、解密过程,加深安全加密应用服务框架的理解。
实验环境
VPC1(虚拟PC)
操作系统类型:
windowsxp,网络接口:
eth0
VPC1 连接要求
与实验网络相连
软件描述
VC6.0
预备知识
WindowsCryptoAPI是微软公司提出的安全加密应用服务框架,也是PKI推荐使用的应用程序编程接口(API),它提供了在Win32环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。
应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。
CryptoAPI提供的功能主要有:
密钥管理、数据编码和解码、数据加密和解密、数字签名和验证、证书及证书库管理等。
文件加密
创建会话密钥
为保证数据加密的效率,CryptoAPI规定数据加密操作必须基于对称密码进行。
于是加密方进行加密操作首先必须创建会话密钥,一般可以通过调用函数CryptGenKey或CryptDeriveKey创建,在创建会话密钥时指定加密算法。
加密数据
在创建会话密钥后,则可以调用CryptEncrypt函数进行加密操作。
加密操作需要注意饿是每次加密数据库的长度必须根据具体的算法和算法类型确定,一般来说,加密数据块长度为算法规定的基准加密块长度的整数倍。
对于分组密码,需为密文数据块预留一个基准加密块长度的空间。
安全保存或交换会话密钥
数据加密完成后,当在今后的某个时间或其他用户需要解密数据时,必须保存会话密钥以备后用,或者是传输会话密钥给特定用户以使其能正常进行解密操作。
程序设计
如教材图1所示
图1程序流图
获取CSP
当进行加密服务等相关服务时,必须先获取某个CSP句柄,这是一般CryptoAPI编程的第一步。
获取CSP句柄的函数为CryptAcquireContext,取得指定CSP句柄,以后的任何加密操作就针对此CSP句柄,函数首先查找有dwProvType和pszProvider指定的CSP,如果找到了CSP,函数就查找由此CSP指定的密钥容器。
有适当的dwFlag标志,这个函数就可以创建或销毁密钥容器,如果不要求访问私钥的话,也可以提供对CSP临时密钥容器的访问。
会话密钥创建与交换
创建会话密钥会根据是否输入口令选择不同的创建方法,当输入口令时,则调用GenKeyByPassword函数通过数据基创建;当不输入口令时,则调用GenKeyByRandom函数随机创建。
GenKeyByPassword创建会话密钥的方式是以输入口令为数据基,然后调用CryptDeriveKey函数来创建会话密钥。
这种方式创建的会话密钥,只要知道输入口令、创建会话密钥的CSP和加密算法,则可以再次创建一样的会话密钥,于是在这种方式下可以不用在程序中与其他用户交换会话密钥,而通过某种线下的方式来交换会话密钥,比如通过电话告诉对方,并且这种方式更为安全。
GenKeyByRandom创建会话密钥的方式是调用CryptGenKey创建一个随机会话密钥。
由于这个会话密钥是随机产生的,以后几乎不可能再现,于是必须以某种方式与其他用户交换会话密钥。
这里选择的方式为先调用函数CryptExportKey导出会话密钥到密钥数据块中,导出时用目标用户的交换密钥对的公钥加密会话密钥,然后把密钥数据块写到明白文件中。
如此则可以保证其他用户可以从目标文件中还原会话密钥。
文件加密
创建好会话密钥后就可以进行加密操作。
加密首先要确定每次加密数据长度,每种加密算法都有一个基准加密块长度,加密数据块长度须为算法规定的基准加密块长度的整数倍,对于分组密码,须为密文数据块预留一个基准加密块长度的空间。
这里的算法为RC4,它是分组算法,基准加密块长度为8,程序确定的加密长度dwBlock-Len为1000-1000%ENCRYPT_BLOCK_SIZE,加密后密文数据dwBufferLen长度为但我BlockLen+ENCRYPT_BLOCK_SIZE,确定加密长度和加密后密文数据长度后,循环加密源文件,每次从源文件中取出dwBlockLen长度数据,加密,密文存入目标文件。
实验内容
使用VC编程,实现对文件的加、解密。
实验步骤
学生单击“试验环境”按钮,出现如教材所示图2网络拓扑
图2
点击桌面MicrosoftVisualC++6.0进入实验环境,如教材图所示
点击文件——新建,在弹出的窗口中选择选项卡“工程”,并选中win32ControlApplication,工程名称填写test,位置存储在C盘目录下,点击确定,则可出现如图所示窗口,选中“一个空工程”,顶级确定,则出现如教材图8所示窗口,点击确定,则工程新建成功,可看到工作区出现如图所示。
图5
图6
图7
图8
图9
点击文件——新建,选中“文件”选项卡,并选中C++SourceFile,将文件名命名为encryptfile,并点击“确定”,如教材图10,11所示,则为工程新建了一个C++文件。
图10
图11
进入D:
\BUPT6008B进入如教材图12所示目录,选中encryptfile.cpp用UltraEdit打开,全选代码,复制到VC6.0新建的encryptfile.cpp中,并保存。
并将该目录下的plaint.txt复制到C:
\test目录下。
如教材图13所示
图12
图13
在VC6.0中,点击如教材图14所示按钮,编译文件。
在点击如教材图15所示按钮执行文件,按如教材图16所示填写相应的信息,可发现plaint.txt进行了密码加密,并在C:
\test下生成了encry1.txt加密文件。
图14
图15
图16
重新执行文件,对文件plaint.txt不使用密码进行加密,如教材图17所示,可发现plaint.txt进行了不使用密码的加密,并在C:
\test下生成了encry2.txt加密文件。
图17
在C:
\test目录下可查看加密生成的文件。
如教材图18所示。
图18