一、微软的Crypto API
(一)研究学习
CryptoAPI 系统体系结构
Web Crypto API
Web Cryptography API
CSP开发基础--CryptoAPI函数简介
CryptoAPI是应用程序编程接口,使应用程序开发人员能够将身份验证、编码和加密添加到基于Windows的应用程序。
- CryptoAPI 系统体系结构由五个主要功能领域组成:基本加密函数、证书编码/解码函数、证书Microsoft Store函数、简化的消息函数、低级别消息函数。
(1)基本加密函数
- 用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。
- 用于生成和存储加密密钥的密钥生成函数。 完全支持更改 链接模式、 初始化向量和其他加密功能。 有关详细信息,请参阅密钥生成和Exchange函数。
- 用于交换或传输密钥的密钥交换函数。 有关详细信息,请参阅加密密钥存储和Exchange以及密钥生成和Exchange函数。
(2)证书编码/解码函数
(3)证书Microsoft Store函数
- 用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。
(4)简化的消息函数
(5)低级别消息函数
- 用于执行简化消息函数执行的所有任务的函数。 低级别消息函数比简化的消息函数更灵活,但需要更多的函数调用。 有关详细信息,请参阅低级别消息和低级别消息函数。
每个功能区域在其函数名称中都有一个关键字,指示其功能区域。
功能区域 | 函数名称约定 |
---|---|
基本加密函数 | Crypt |
编码/解码函数 | Crypt |
证书存储函数 | 存储 |
简化的消息函数 | 消息 |
低级别消息函数 | Msg |
应用程序在所有这些领域都使用函数。这些函数组合在一起,组成 CryptoAPI。 基本加密函数将 CSP 用于必要的加密算法以及加密密钥的生成和安全存储。 | |
使用了两种不同类型的加密密钥:会话密钥(用于单个加密/解密)和公钥/私钥对,这些密钥在更永久的基础上使用。 |
(二)使用方式
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
1.信息隐藏
信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文。
数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。
加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。
2.身份鉴别
安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。
身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。
因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。
数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。
数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。
证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。
3.完整性检验
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。
(三)API函数
服务提供者函数
密钥的产生和交换函数
编码/解码函数
数据加密/解密函数
哈希和数字签名函数
1.2.2 证书和证书库函数
这组函数是管理、使用和取得证书、证书撤销列表和证书信任列表。
证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
维护函数
证书函数
证书撤销列表函数
1.2.3 证书验证函数
证书验证是通过CTL 和证书列表进行的.
使用CTL的函数
证书链验证函数
总结这些API在编程中的使用方式
(一)Crypto API
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
信息隐藏
信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文.
数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。
加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。
身份鉴别
安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。
身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。
因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。
数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。
数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。
证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。
完整性检测
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。
二、RAS公司的PKCS#11标准
PKCS#11概述
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
GMT 0016-2012 智能密码钥匙密码应用接口规范:
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。本标准适用于智能密码钥匙产品的研制、使用和检测。
GMT 0018-2012密码设备应用接口规范:
本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
API函数
设备管理系列函数
概述
设备管理主要完成设备的插拔事件处理、枚举设备、连接设备、断开连接、获取设备状态、设置设备标签、获取设备信息、锁定设备、解锁设备和设备命令传输等操作。设备管理系列函数如下表所示:
1、等待设备插拔事件
函数原型:ULONG DEVAPI SKF_WaitForDevEvent(LPSTR szDevName,ULONG *pulDevNameLen, ULONG *pulEvent)
功能描述:该函数等待设备插入或者拔除事件。szDevName返回发生事件的设备名称。
参 数:szDevName:[OUT] 发生事件的设备名称。
pulDevNameLen:[IN/OUT] 输入/输出参数,当输入时表示缓冲区长度,输出时表示设备名称的有效长度,长度包含字符串结束符。
pulEvent:[OUT]事件类型。1表示插入,2表示拔出。
返 回 值:SAR_OK:成功;其他:错误码。
2、取消等待设备插拔事件
函数原型:ULONG DEVAPI SKF_CancelWaitForDevEvent()
功能描述:该函数取消等待设备插入或者拔除事件。
参 数:无
返 回 值:SAR_OK:成功;其他:错误码。
备 注:使本进程正在执行的SKF_WaitForDevEvent函数立即返回。
3、枚举设备
函数原型:ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize)
功能描述:获得当前系统中的设备列表。
参 数:bPresent:[IN] 为TRUE表示取当前设备状态为存在的设备列表。为FALSE表示取当前驱动支持的设备列表。
szNameList:[OUT] 设备名称列表。如果该参数为NULL,将由pulSize返回所需要的内存空间大小。每个设备的名称以单个‘\0’结束,以双‘\0’表示列表的结束。
pulSize:[IN,OUT] 输入时表示设备名称列表的缓冲区长度,输出时表示szNameList所占用的空间大小。
返 回 值:SAR_OK:成功;其他:错误码。
4、连接设备
函数原型:ULONG DEVAPI SKF_ConnectDev (LPSTR szName, DEVHANDLE *phDev)
功能描述:通过设备名称连接设备,返回设备的句柄。
参 数:szName: [IN] 设备名称。
phDev:[OUT] 返回设备操作句柄。
返 回 值:SAR_OK:成功;其他:错误码。
5、断开连接
函数原型:ULONG DEVAPI SKF_DisConnectDev (DEVHANDLE hDev)
功能描述:断开一个已经连接的设备,并释放句柄。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
返 回 值:SAR_OK:成功;其他:错误码。
备 注:如果该设备已被锁定,函数应首先解锁该设备。断开连接操作并不影响设备的权限状态。
6、获取设备状态
函数原型:ULONG DEVAPI SKF_GetDevState(LPSTR szDevName, ULONG *pulDevState)
功能描述:获取设备是否存在的状态。
参 数:szDevName:[IN] 设备名称。
pulDevState:[OUT] 返回设备状态。
返 回 值:SAR_OK:成功;其他:错误码。
7、设置设备标签
函数原型:ULONG DEVAPI SKF_SetLabel (DEVHANDLE hDev, LPSTR szLabel)
功能描述:设置设备标签。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
szLabel:[IN] 设备标签字符串。该字符串应小于32字节。
返 回 值:SAR_OK:成功;其他:错误码。
8、获取设备信息
函数原型:ULONG DEVAPI SKF_GetDevInfo (DEVHANDLE hDev, DEVINFO *pDevInfo)
功能描述:获取设备的一些特征信息,包括设备标签、厂商信息、支持的算法等。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
pDevInfo:[OUT] 返回设备信息。
返 回 值:SAR_OK:成功;其他:错误码。
9、锁定设备
函数原型:ULONG DEVAPI SKF_LockDev (DEVHANDLE hDev, ULONG ulTimeOut)
功能描述:获得设备的独占使用权。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
ulTimeOut:[IN] 超时时间,单位为毫秒。如果为0xFFFFFFFF表示无限等待。
返 回 值:SAR_OK:成功;其他:错误码。
10、解锁设备
函数原型:ULONG DEVAPI SKF_UnlockDev (DEVHANDLE hDev)
功能描述:释放对设备的独占使用权。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
返 回 值:SAR_OK:成功;其他:错误码。
11、设备命令传输
函数原型:ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev, BYTE* pbCommand, ULONG ulCommandLen,BYTE* pbData, ULONG* pulDataLen)
功能描述:将命令直接发送给设备,并返回结果。
参 数:hDev:[IN] 设备句柄。
pbCommand:[IN] 设备命令。
ulCommandLen:[IN] 命令长度。
pbData:[OUT] 返回结果数据。
pulDataLen:[IN,OUT] 输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。
返 回 值:SAR_OK:成功;其他:错误码。
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
(一)SKF接口
(二)PKCS#11
- DES
- RAS