实验一-密码引擎-加密API研究

密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)

GM/T 0019- -2012
s)
RSA验证签名运算:SAF_ RsaVerifySign
t)对文件 及其签名进行RSA验证: SAF_ _RsaV erifySignFile
u)
基于证书的RSA公钥验证:SAF_VerifySignByCert
v)生成 ECC密钥对: SAF_ _GenEccKeyPair .
w)获取ECC公钥:SAF_ GetEccPublicKey
x) ECC 签名:SAF_ EccSign
y) ECC 验证: SAF_ EcVerifySign
z) ECC 公钥加密:SAF_ EccPublicKeyEnc
aa)
基于证书的ECC公钥加密:SAF_ EccPublicKeyEncByCert
bb)基于证 书的ECC公钥验证:SAF_ EccVerifySignByCert
cc)创 建对称算法对象: SAF_ _CreateSymmAlgoObj
dd)生成会话密钥并用外部公钥加密输出:SAFGenerateKeyWithEPK
ee)导入加密 的会话密钥:SAF_ ImportEncedKey

1 总结这些API在编程中的使用方式(5分)

API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer
数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。

为了强制执行严格的类型检查,并避免上面提到的问题,一个办法是在函数里使用上面提到到Alias技术。如对API函数 GetDIBits 可进行另外一种声明方法。如下∶
GetDIBits函数的原型∶
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
GetDIBits函数的改型∶

Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
通过本课程前面所学到的知识,我们已经可以得知原型 GetDIBits函数也好,改型 GetDIBitsLong函数也好,实际将调用的都是Alias所指定的 GetDIBits原函数。但你应当看到,两者的区别在于,我们在改型的函数中强制指定lpBits参数为Long形。这样就会使得函数调用中发生的错误机率减少到了最小。这种方法叫做"安全类型"声明

2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)

 

1. API之网络函数

WNetAddConnection创建同一个网络资源的永久性连接

WNetAddConnection2创建同一个网络资源的连接

WNetAddConnection3创建同一个网络资源的连接

WNetCancelConnection结束一个网络连接

WNetCancelConnection2结束一个网络连接

WNetCloseEnum结束一次枚举操作

WNetConnectionDialog启动一个标准对话框,以便建立同网络资源的连接

WNetDisconnectDialog启动一个标准对话框,以便断开同网络资源的连接

WNetEnumResource枚举网络资源

WNetGetConnection获取本地或已连接的一个资源的网络名称

WNetGetLastError获取网络错误的扩展错误信息

WNetGetUniversalName获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称

WNetGetUser获取一个网络资源用以连接的名字

WNetOpenEnum启动对网络资源进行枚举的过程

 

2. API之消息函数

 

BroadcastSystemMessage将一条系统消息广播给系统中所有的顶级窗口

GetMessagePos取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置

GetMessageTime取得消息队列中上一条消息处理完毕时的时间

PostMessage将一条消息投递到指定窗口的消息队列

PostThreadMessage将一条消息投递给应用程序

RegisterWindowMessage获取分配给一个字串标识符的消息编号

ReplyMessage答复一个消息

SendMessage调用一个窗口的窗口函数,将一条消息发给那个窗口

SendMessageCallback将一条消息发给窗口

SendMessageTimeout向窗口发送一条消息

SendNotifyMessage向窗口发送一条消息

 

3. API之文件处理函数

 

CloseHandle关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等

CompareFileTime对比两个文件的时间

CopyFile复制文件

CreateDirectory创建一个新目录

CreateFile打开和创建文件、管道、邮槽、通信服务、设备以及控制台

CreateFileMapping创建一个新的文件映射对象

DeleteFile删除指定文件

DeviceIoControl对设备执行指定的操作

DosDateTimeToFileTime将DOS日期和时间值转换成一个 win32 FILETIME 值

FileTimeToDosDateTime将一个 win32 FILETIME 值转换成DOS日期和时间值

FileTimeToLocalFileTime将一个FILETIME结构转换成本地时间

FileTimeToSystemTime根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构

FindClose关闭由FindFirstFile函数创建的一个搜索句柄

FindFirstFile根据文件名查找文件

FindNextFile根据调用FindFirstFile函数时指定的一个文件名查找下一个文件

FlushFileBuffers针对指定的文件句柄,刷新内部文件缓冲区

FlushViewOfFile将写入文件映射缓冲区的所有数据都刷新到磁盘

GetBinaryType判断文件是否可以执行

GetCompressedFileSize判断一个压缩文件在磁盘上实际占据的字节数

GetCurrentDirectory在一个缓冲区中装载当前目录

GetDiskFreeSpace获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量

GetDiskFreeSpaceEx获取与一个磁盘的组织以及剩余空间容量有关的信息

GetDriveType判断一个磁盘驱动器的类型

GetExpandedName取得一个压缩文件的全名

GetFileAttributes判断指定文件的属性

GetFileInformationByHandle这个函数提供了获取文件信息的一种机制

GetFileSize判断文件长度

GetFileTime取得指定文件的时间信息

GetFileType在给出文件句柄的前提下,判断文件类型

GetFileVersionInfo从支持版本标记的一个模块里获取文件版本信息

GetFileVersionInfoSize针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区

GetFullPathName获取指定文件的完整路径名

GetLogicalDrives判断系统中存在哪些逻辑驱动器字母

GetLogicalDriveStrings获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径

GetOverlappedResult判断一个重叠操作当前的状态

GetPrivateProfileInt为初始化文件(.ini文件)中指定的条目获取一个整数值

GetPrivateProfileSection获取指定小节(在.ini文件中)所有项名和值的一个列表

GetPrivateProfileString为初始化文件中指定的条目取得字串

GetProfileInt取得win.ini初始化文件中指定条目的一个整数值

GetProfileSection获取指定小节(在win.ini文件中)所有项名和值的一个列表

GetProfileString为win.ini初始化文件中指定的条目取得字串

GetShortPathName获取指定文件的短路径名

GetSystemDirectory取得Windows系统目录(即System目录)的完整路径名

GetTempFileName这个函数包含了一个临时文件的名字,它可由应用程序使用

GetTempPath获取为临时文件指定的路径

GetVolumeInformation获取与一个磁盘卷有关的信息

GetWindowsDirectory获取Windows目录的完整路径名

hread参考lread

hwrite参考lwrite函数

lclose关闭指定的文件

lcreat创建一个文件

llseek设置文件中进行读写的当前位置

LockFile锁定文件的某一部分,使其不与其他应用程序共享

LockFileEx与LockFile相似,只是它提供了更多的功能

lopen以二进制模式打开指定的文件

lread将文件中的数据读入内存缓冲区

lwrite将数据从内存缓冲区写入一个文件

LZClose关闭由LZOpenFile 或 LZInit函数打开的一个文件

LZCopy复制一个文件

LZInit这个函数用于初始化内部缓冲区

LZOpenFile该函数能执行大量不同的文件处理,而且兼容于压缩文件

LZRead将数据从文件读入内存缓冲区

LZSeek设置一个文件中进行读写的当前位置

MapViewOfFile将一个文件映射对象映射到当前应用程序的地址空间

MoveFile移动文件

OpenFile这个函数能执行大量不同的文件操作

OpenFileMapping打开一个现成的文件映射对象

QueryDosDevice在WindowsNT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况

ReadFile从文件中读出数据

ReadFileEx与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调

RegCloseKey关闭系统注册表中的一个项(或键)

RegConnectRegistry访问远程系统的部分注册表

RegCreateKey在指定的项下创建或打开一个项

RegCreateKeyEx在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数

RegDeleteKey删除现有项下方一个指定的子项

RegDeleteValue删除指定项下方的一个值

RegEnumKey枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx

RegEnumKeyEx枚举指定项下方的子项

RegEnumValue枚举指定项的值

RegFlushKey将对项和它的子项作出的改动实际写入磁盘

RegGetKeySecurity获取与一个注册表项有关的安全信息

RegLoadKey从以前用RegSaveKey函数创建的一个文件里装载注册表信息

RegNotifyChangeKeyValue注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制

RegOpenKey打开一个现有的注册表项

RegOpenKeyEx打开一个现有的项。在win32下推荐使用这个函数

RegQueryInfoKey获取与一个项有关的信息

RegQueryValue取得指定项或子项的默认(未命名)值

RegQueryValueEx获取一个项的设置值

RegReplaceKey用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息

RegRestoreKey从一个磁盘文件恢复注册表信息

RegSaveKey将一个项以及它的所有子项都保存到一个磁盘文件

RegSetKeySecurity设置指定项的安全特性

RegSetValue设置指定项或子项的默认值

RegSetValueEx设置指定项的值

RegUnLoadKey卸载指定的项以及它的所有子项

RemoveDirectory删除指定目录

SearchPath查找指定文件

SetCurrentDirectory设置当前目录

SetEndOfFile针对一个打开的文件,将当前文件位置设为文件末尾

SetFileAttributes设置文件属性

SetFilePointer在一个文件中设置当前的读写位置

SetFileTime设置文件的创建、访问及上次修改时间

SetHandleCount这个函数不必在win32下使用;即使使用,也不会有任何效果

SetVolumeLabel设置一个磁盘的卷标(Label)

SystemTimeToFileTime根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构

UnlockFile解除对一个文件的锁定

UnlockFileEx解除对一个文件的锁定

UnmapViewOfFile在当前应用程序的内存地址空间解除对一个文件映射对象的映射

VerFindFile用这个函数决定一个文件应安装到哪里

VerInstallFile用这个函数安装一个文件

VerLanguageName这个函数能根据16位语言代码获取一种语言的名称

VerQueryValue这个函数用于从版本资源中获取信息

WriteFile将数据写入一个文件

WriteFileEx与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调

WritePrivateProfileSection为一个初始化文件(.ini)中指定的小节设置所有项名和值

WritePrivateProfileString在初始化文件指定小节内设置一个字串

WriteProfileSection为Win.ini初始化文件中一个指定的小节设置所有项名和值

WriteProfileString在Win.ini初始化文件指定小节内设置一个字串

 

4. API之打印函数

AbortDoc取消一份文档的打印

AbortPrinter删除与一台打印机关联在一起的缓冲文件

AddForm为打印机的表单列表添加一个新表单

AddJob用于获取一个有效的路径名,以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号

AddMonitor为系统添加一个打印机监视器

AddPort启动“添加端口”对话框,允许用户在系统可用端口列表中加入一个新端口

AddPrinter在系统中添加一台新打印机

AddPrinterConnection连接指定的打印机

AddPrinterDriver为指定的系统添加一个打印驱动程序

AddPrintProcessor为指定的系统添加一个打印处理器

AddPrintProvidor为系统添加一个打印供应商

AdvancedDocumentProperties启动打印机文档设置对话框

ClosePrinter关闭一个打开的打印机对象

ConfigurePort针对指定的端口,启动一个端口配置对话框

ConnectToPrinterDlg启动连接打印机对话框,用它同访问网络的打印机连接

DeleteForm从打印机可用表单列表中删除一个表单

DeleteMonitor删除指定的打印监视器

DeletePort启动“删除端口”对话框,允许用户从当前系统删除一个端口

DeletePrinter将指定的打印机标志为从系统中删除

DeletePrinterConnection删除与指定打印机的连接

DeletePrinterDriver从系统删除一个打印机驱动程序

DeletePrintProcessor从指定系统删除一个打印处理器

DeletePrintProvidor从系统中删除一个打印供应商

DeviceCapabilities利用这个函数可获得与一个设备的能力有关的信息

DocumentProperties打印机配置控制函数

EndDocAPI结束一个成功的打印作业

EndDocPrinter在后台打印程序的级别指定一个文档的结束

EndPage用这个函数完成一个页面的打印,并准备设备场景,以便打印下一个页

EndPagePrinter指定一个页在打印作业中的结尾

EnumForms枚举一台打印机可用的表单

EnumJobs枚举打印队列中的作业

EnumMonitors枚举可用的打印监视器

EnumPorts枚举一个系统可用的端口

EnumPrinterDrivers枚举指定系统中已安装的打印机驱动程序

EnumPrinters枚举系统中安装的打印机

EnumPrintProcessorDatatypes枚举由一个打印处理器支持的数据类型

EnumPrintProcessors枚举系统中可用的打印处理器

Escape设备控制函数

FindClosePrinterChangeNotification关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象

FindFirstPrinterChangeNotification创建一个新的改变通告对象,以便我们注意打印机状态的各种变化

FindNextPrinterChangeNotification用这个函数判断触发一次打印机改变通告信号的原因

FreePrinterNotifyInfo释放由FindNextPrinterChangeNotification函数分配的一个缓冲区

GetForm取得与指定表单有关的信息

GetJob获取与指定作业有关的信息

GetPrinter取得与指定打印机有关的信息

GetPrinterData为打印机设置注册表配置信息

GetPrinterDriver针对指定的打印机,获取与打印机驱动程序有关的信息

GetPrinterDriverDirectory判断指定系统中包含了打印机驱动程序的目录是什么

GetPrintProcessorDirectory判断指定系统中包含了打印机处理器驱动程序及文件的目录

OpenPrinter打开指定的打印机,并获取打印机的句柄

PrinterMessageBox在拥有指定打印作业的系统上显示一个打印机出错消息框

PrinterProperties启动打印机属性对话框,以便对打印机进行配置

ReadPrinter从打印机读入数据

ResetDC重设一个设备场景

ResetPrinter改变指定打印机的默认数据类型及文档设置

ScheduleJob提交一个要打印的作业

SetAbortProc为Windows指定取消函数的地址

SetForm为指定的表单设置信息

SetJob对一个打印作业的状态进行控制

SetPrinter对一台打印机的状态进行控制

SetPrinterData设置打印机的注册表配置信息

StartDoc开始一个打印作业

StartDocPrinter在后台打印的级别启动一个新文档

StartPage打印一个新页前要先调用这个函数

StartPagePrinter在打印作业中指定一个新页的开始

WritePrinter将发送目录中的数据写入打印机

 

3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)
posted @ 2021-04-25 21:48  20181220王冠杰  阅读(215)  评论(0编辑  收藏  举报