密码引擎API的主要标准和规范:
1.总结这些API在编程中的使用方式:
1.1微软的Crypto API
1.1.1CryptoAPI系统架构由五个主要功能区域组成:
基本密码功能
证书编码/解码功能
证书存储功能
简化的消息功能
低级消息功能
1.1.2基本密码功能
用于连接到CSP的上下文功能。这些功能使应用程序可以按名称选择特定的CSP或选择可以提供所需功能类别的特定CSP。
密钥生成功能,用于生成和存储加密密钥。包括对更改链接模式,初始化向量和其他加密功能的全面支持。有关更多信息,请参见密钥生成和交换功能。
密钥交换功能,用于交换或传输密钥。有关更多信息,请参见加密密钥存储和交换以及密钥生成和交换功能。
1.1.3证书编码/解码功能
用于加密或解密数据的功能。还包括对哈希数据的支持。有关更多信息,请参见数据加密和解密功能和数据加密和解密。
1.1.4证书存储功能
用于管理数字证书收集的功能。有关更多信息,请参见数字证书和证书存储功能。
1.1.5简化的消息功能
用于加密和解密消息和数据的功能。
用于签名消息和数据的功能。
用于验证接收到的消息和相关数据上签名真实性的功能。
1.1.6低级消息功能
用于执行由简化消息功能执行的所有任务的功能。与简化的消息功能相比,低级消息功能提供了更大的灵活性,但需要更多的函数调用。有关更多信息,请参见低级消息和低级消息功能。
image-20210412093302813
1.2 RAS公司的PKCS#11标准:
PKCS#11(简称P11)就是针对密码设备的接口指令标准。P11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限。而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象。P11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
CSP接口标准:CSP接口标准为微软所颁发,在windows操作系统上通行。CSP中重要的概念是容器(container)。一个容器中具有一对公私钥。而证书却是这一对密钥的附加属性了。
1.3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范:
GMT 0016-2012 智能密码钥匙密码应用接口规范:
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。本标准适用于智能密码钥匙产品的研制、使用和检测。
GMT 0018-2012密码设备应用接口规范:
本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
2.列出这些API包含的函数,进行分类,并总结它们的异同:
2.1 微软的Crypto API:
2.1.1服务提供者函数
应用程序使用服务提供者函数来连接和断开一个CSP。
CryptAcquireContext获得指定CSP的密钥容器的句柄
CryptContextAddRef对HCRYPTPROV句柄增加一个应用计数
CryptEnumProviders枚举当前计算机中的CSP
CryptEnumProviderTypes枚举CSP的类型
CryptGetDefaultProvider对于指定CSP类型的却省CSP
CryptGetProvParam得到一个CSP的属性
CryptInstallDefaultContext安装先前得到的HCRYPTPROV上下文作为当前却省的上下文
CryptReleaseContext释放由CryptAcquireContext得到的句柄
CryptSetProvider和CryptSetProviderEx为指定CSP类型指定一个却省的CSP
CryptSetProvParam指定一个CSP的属性
CryptUninstallDefaultContext删除先前由CryptInstallDefaultContext安装的却省上下文
2.1.2密钥的产生和交换函数
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:
CryptAcquireCertificatePrivateKey对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec
CryptDeriveKey从一个密码中派生一个密钥
CryptDestoryKey销毁密钥
CryptDuplicateKey制作一个密钥和密钥状态的精确复制
CryptExportKey把CSP的密钥做成BLOB 传送到应用程序的内存空间中
CryptGenKey创建一个随机密钥
CryptGenRandom产生一个随机数
CryptGetKeyParam得到密钥的参数
CryptGetUserKey得到一个密钥交换或签名密钥的句柄
CryptImportKey把一个密钥BLOB传送到CSP 中
CryptSetKeyParam指定一个密钥的参数
2.1.3编码/解码函数
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
CryptDecodeObject对lpszStructType结构进行解码
CryptDecodeObjectEx对lpszStructType结构进行解码,此函数支持内存分配选项
CryptEncodeObject对lpszStructType结构进行编码
CyptEncodeObjectEx对lpszStructType结构进行编码,此函数支持内存分配选项
2.1.4数据加密/解密函数
这些函数支持数据的加密/解密操作。
CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。
注:这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。
CryptSetKeyParam函数可以指定额外的加密参数。
CryptDecrypt使用指定加密密钥来解密一段密文
CryptEncrypt使用指定加密密钥来加密一段明文
CryptProtectData执行对DATA_BLOB结构的加密
CryptUnprotectData执行对DATA_BLOB结构的完整性验证和解密
2.1.5哈希和数字签名函数
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
CryptCreateHash创建一个空哈希对象
CryptDestoryHash销毁一个哈希对象
CryptDuplicateHash复制一个哈希对象
CryptGetHashParam得到一个哈希对象参数
CryptHashData对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam设置一个哈希对象的参数
CryptSignHash对一个哈希对象进行签名
CryptVerifySignature校验一个数字签名
2.2 RAS公司的PKCS#11标准:
CSP总共有23个函数接口。简介如下:
2.2.1CSP连接函数:
CPAcquireContext:为应用程序创建一个上下文
CPGetProvParam:返回CSP相关的信息
CPReleaseContext:释放CPAcquireContext创建的上下文
CPSetProvParam :设置CSP的参数操作
2.2.2 CSP密钥生成和交换函数:
CPDeriveKey:从一个数据散列中生成一个会话密钥,它保证生成的密钥 互不相同
CPDestroyKey:释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问
CPExportKey:从CSP容器中导出密钥
CPGenKey:用来生成密钥或密钥对
CPGenRandom:使用随机数填充一个缓冲
CPGetKeyParam:用来得到加密操作密钥的属性
CPGetUserKey:用来获取CSP容器中的持久密钥对
CPImportKey:从一个blob中导入密钥到CSP容器中
CPSetKeyParam:设置密钥的属性
2.2.3 CSP加解密函数:
CPDecrypt:用来解密先前被加密的数据
CPEncrypt:用来加密明文
CSP散列和数字签名函数:
CPCreateHash:初始化并散列输入数据
CPDestroyHash:删除一个散列对象句柄
CPDuplicateHash:创建一个散列对象的拷贝
CPGetHashParam:获取散列对象的计算结果
CPHashData:散列输入的数据
CPSetHashParam:定制一个散列对象的属性
CPSignHash:签名一个散列对象
CPVerifySignature:校验一个数字签名
2.3 GMT 0016-2012
2.3.1 设备管理系列函数:
SKF_WaitForDevEvent:等待设备插拔事件
SKF_ CancelWaitForDevEvent:取消等待设备插拔事件
SKF_ EnumDev :枚举设备
SKF_ ConnectDev:连接设备
SKF_ DisconnectDev :断开连接
SKF_ GetDevState:获取设备状态
SKF_ SetLabel:设置设备标签
SKF_ GetDevInfo:获取设备信息
SKF_ LockDev:锁定设备
SKF_ UnlockDev:解锁设备
SKF_Transmit:设备命令传输
2.3.2 访问控制系列函数:
SKF_ ChangeDevAuthKey:修改设备认证密钥
SKF_DevAuth:设备认证
SKF_ ChangePIN:修改PIN
SKF_ GetPINInfo:获得PIN码信息
SKF_ VerifyPIN:校验PIN
SKF_ UnblockPIN:解锁PIN
SKF_ ClearSecueState:清除应用安全状态
2.3.3 应用管理系列函数:
SKF_ CreateApplication:创建应用
SKF_ EnumApplication:枚举应用
SKF_ DeleteApplication:删除应用
SKF_ OpenApplication:打开应用
SKF_ CloseApplication:关闭应用
2.3.4 文件管理系列函数:
SKF_ CreateFile:创建文件
SKF_ DeleteFile :删除文件
SKF_ EnumFiles:枚举文件
SKF_ GetFileInfo:获取文件信息
SKF_ ReadFile:读文件
SKF_ WriteFile :写文件
2.3.5 容器管理系列函数:
SKF_CreateContainer:创建容器
SKF_ DeleteContainer:删除容器
SKF_ EnumContainer:枚举容器
SKF_ OpenContainer:打开容器
SKF_ CloseContainer:关闭容器
SKF_ GetContainerType:获得容器类型
SKF_ ImportCertificate:导人数字证书
SKF_ ExportCertificate:导出数字证书
2.3.6 密码服务系列函数:
SKF_ GenRandom :生成随机数
SKF_ GenExtRSAKey:生成外部RSA密钥对
SKF_ GenRSAKeyPair:生成RSA签名密钥对
SKF_ ImportRSAKeyPair:导人RSA加密密钥对
SKF_ RSASignDataRSA:签名
SKF_ RSAVerify:RSA验签
SKF_ RSAExportSessionKey:RSA生成并导出会话密钥
SKF_ ExtRSAPubKeyOperation:RSA外来公钥运算
SKF_ ExtRSAPriKeyOperation:RSA外来私钥运算
SKF_ GenECCKeyPair:生成ECC签名密钥对
SKF_ ImportECCKeyPair:导入ECC加密密钥对
SKF_ ECCSignData :ECC签名
SKF_ ECCVerify:ECC验签
SKF_ ECCExportSessionKey:ECC生成并导出会话密钥
SKF_ExtECCEncrypt:ECC外来公钥加密.
SKF_ ExtECCDecrypt:ECC外来私钥解密.
SKF_ ExtECCSign:ECC外来私钥签名.
SKF_ ExtECCVerify :ECC外来公钥验签.
SKF_ GenerateAgreementDataWithECC:ECC生成密钥协商参数并输出
SKF_ GenerateKeyWithECC:ECC计算会话密钥.
SKF_ GenerateAgreementDataAndKeyWithECC:ECC产生协商数据并计算会话密钥
SKF_ExportPablicKey:导出公钥
SKF_ImportSessionKey:导入会话密钥
SKF_ SetSymmKey:明文导人会话密钥
SKF_ EncrypInit:加密初始化
SKF_ Encrypt:单组数据加密
SKF_ EncryptUpdate:多组数据加密
SKF_ EncryptFinal:结束加密
SKF_ Digestlnit:密码杂凑初始化
SKF_Digest:单组数据密码杂凑
SKF_ DigestUpdate:多组数据密码杂凑
SKP_ DigestFinal:结束密码杂凑
SKF_ MacInit:消息鉴别码运算初始化
SKF_ Mac:单组数据消息鉴别码运算
SKF_ MacUpdate:多组数据消息鉴别码运算
SKF_ MacFinal:结束消息鉴别码运算
SKF_ CloseHandle:关闭密码对象句柄
2.4 GMT 0018-2012
2.4.1设备管理:
打开设备:SDEOpenDerice
关闭设备:SDF_ Cias eDevice
创建会话:SDF_ OpenSesion
关闭会话: SDF _CloseSession
获取设备信息:SDF _GetDeviceInfo
产生随机数:SDF_enerateRandom
获取私钥使用权限:SDF _GetPrivateKeyAccessRight
释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
2.4.2 密钥管理:
导出 RSA签名公钥:SDF_ ExportSignPublicKey_ RSA
导出 RSA加密公钥:SDF_ ExportEncPublicKey_ RSA
产生 RSA非对称密钥对并输出:SDF_ GenerateKeyPair_RSA
生成 会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK ,RSA
生成会 话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_ RSA
导人会 话密钥并用内部RSA私钥解密:SDF_ ImportKeyWithISK_ RSA
基于 RSA算法的数字信封转换:SDF_ ExchangeDigitEnvelopeBaseOnRSA
导出 ECC签名公钥:SDF_ ExportSignPublicKey_ ECC
导出 ECC加密公钥:SDF_ ExportEncPublicKey_ ECC
产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ ECC
生成会 话密钥并用内部:ECC公钥加密输出:SDF_ GenerateKeyWithIPK_ ECC
生成会话密 钥并用外部:ECC公钥加密输出: SDF_ GenerateKeyWithEPK_ ECC
导人会话密钥并用内部:ECC私钥解密:SDF_ ImportKeyWithISK_ ECC
生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
计算会话密钥:SDF_GenerateKeyWithECC
产生协商数据并计算会话密钥:SDF_ GenerateAgreementDataAndKeyWithECC
基于ECC算法的数字信封转换:SDF_ ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出:SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密:SDF_ ImportKeyWithKEK
销毁会话密钥:SDF_DestroyKey
2.4.3 非对称算法运算类函数:
外部公钥RSA运算:SDF_ ExternalPublicKeyOperation_ RSA
内部公钥RSA运算:SDF_ InternalPublicKeyOperation_ RSA
内部私钥RSA运算:SDF_InternalPrivateKeyOperation_ RSA
外部密钥ECC验证:SDF_ ExternalVerify_ECC
内部密钥ECC签名:SDF_ nternalSign_ ECC
内部密钥ECC验证:SDF_ InternalVerify_ ECC
外部密钥ECC加密:SDF_ ExternalEncrypt_ECC
2.4.4 对称算法运算类函数
对称加密:SDF_Encrypt
对称解密:SDF_Decrypt
计算MAC:SDF_CalculateMAC
2.4.5 杂凑运算类函数
杂凑运算初始化:SDF_HashInit
多包杂凑运算:SDF_HashUpdate
杂凑运算结束:SDF_HashFinal
2.4.6 用户文件操作类函数:
创建文件:SDF_CreatFile
读取文件:SDF_ReadFile
写文件:SDF_WriteFile
删除文件:SDF_DeleteFile
2.5 总结异同:
这三类标准中都包含加解密的函数,并且自成体系。
具体函数名称有些许不同,但大同小异。
还有GM涉及到了设备的管理,所以有设备管理接口还有访问控制函数。
3.以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口)
CryptoAPI
EncrypteFile:
DecryptFile: