不同的加密API研究
Crypto API
Crypto API功能
功能:为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographic service provider)之间。CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
Crypto API背景
因为过于复杂的加密算法实现起来非常困难,所以在过去,许多应用程序只能使用非常简单的加密技术,这样做的结果就是加密的数据很容易就可以被人破译。而使用Microsoft提供的加密应用程序接口(即Cryptography API),或称CryptoAPI,就可以方便地在应用程序中加入强大的加密功能,而不必考虑基本的算法。
Crypto API简介
CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。CryptoAPI的体系结构。
服务提供者函数
API |
功能 |
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 安装的却省上下文 |
密钥的产生和交换函数
API |
功能 |
CryptAcquireCertificatePrivateKey |
对于指定证书上下文得到一个HCRYPTPROV 句柄和dwKeySpec |
CryptDeriveKey |
从一个密码中派生一个密钥 |
CryptDestoryKey |
销毁密钥 |
CryptDuplicateKey |
制作一个密钥和密钥状态的精确复制 |
CryptExportKey |
把CSP 的密钥做成BLOB 传送到应用程序的内存空间中 |
CryptGenKey |
创建一个随机密钥 |
CryptGenRandom |
产生一个随机数 |
CryptGetKeyParam |
得到密钥的参数 |
CryptGetUserKey |
得到一个密钥交换或签名密钥的句柄 |
CryptImportKey |
把一个密钥BLOB 传送到CSP中 |
CryptSetKeyParam |
指定一个密钥的参数 |
编码/解码函数
API |
功能 |
CryptDecodeObject |
对lpszStructType 结构进行解码 |
CryptDecodeObjectEx |
对lpszStructType 结构进行解码,此函数支持内存分配选项 |
CryptEncodeObject |
对lpszStructType 结构进行编码 |
CyptEncodeObjectEx |
对lpszStructType 结构进行编码,此函数支持内存分配选项 |
数据加密/解密函数
API |
功能 |
CryptDecrypt |
使用指定加密密钥来解密一段密文 |
CryptEncrypt |
使用指定加密密钥来加密一段明文 |
CryptProtectData |
执行对DATA_BLOB 结构的加密 |
CryptUnprotectData |
执行对DATA_BLOB 结构的完整性验证和解密 |
哈希和数字签名函数
API |
功能 |
CryptCreateHash |
创建一个空哈希对象 |
CryptDestoryHash |
销毁一个哈希对象 |
CryptDuplicateHash |
复制一个哈希对象 |
CryptGetHashParam |
得到一个哈希对象参数 |
CryptHashData |
对一块数据进行哈希,把它加到指定的哈希对象中 |
CryptHashSessionKey |
对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
CryptSetHashParam |
设置一个哈希对象的参数 |
CryptSignHash |
对一个哈希对象进行签名 |
CryptVerifySignature |
校验一个数字签名 |
证书库函数
API |
功能 |
CertAddStoreToCollection |
在证书库中增加一个证书 |
CertCloseStore |
关闭一个证书库句柄 |
CertControlStore |
如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知 |
CertDuplicateStore |
通过增加引用计数来复制证书库句柄 |
CertEnumPhysicalStore |
对于指定系统库枚举物理库 |
CertEnumSystemStore |
枚举所有可用的系统库 |
CertEnumSystemStoreLocation |
枚举可用系统库的所有位置 |
CertGetStoreProperty |
得到一个库的属性 |
CertOpenStore |
使用指定库类型来打开证书库 |
CertOpenSystemStore |
打开一个系统证书库 |
CertRegisterPhysicalStore |
在一个注册系统库里增加一个物理库 |
CertRegisterSystemStore |
注册一个系统库 |
CertRemoveStoreFromCollection |
从一个库集合里删除证书库 |
CertSaveStore |
保存证书库 |
CertSetStoreProperty |
设置证书属性 |
CertUnregisterPhysicalStore |
从系统库中删除一个物理库 |
CertUnregisterSystemStore |
反注册一个指定系统库 |
证书函数
API |
功能 |
CertAddCertificateContextToStore |
在证书库里增加一个证书上下文 |
CertAddCertificateLinkToStore |
在证书库里增加一个对不同库里的证书上下文的链接 |
CertAddEncodedCertificateToStore |
把编码证书转换成证书上下文并且把它加到证书库里 |
CertCreateCertificateContext |
从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里 |
CertCreateSelfSignCertificate |
创建一个自签名证书 |
CertDeleteCertificateFromStore |
从证书库里删除一个证书 |
CertDuplicateCertificate |
通过增加引用计数来复制证书上下文 |
CertEnumCertificateInStore |
在证书库里枚举证书上下文 |
CertFindCertificateInStore |
在证书库里寻找证书上下文 |
CertFreeCertificateContext |
释放一个证书上下文 |
CertGetIssuerCertificateFromStore |
在证书库里得到指定主题证书的发行者 |
CertGetSubjectCertificateFromStore |
获得主题证书的上下文 |
CertGetValidUsages |
返回所有证书的用法 |
CertSerializeCertificateStoreElement |
串行化编码证书的证书上下文 |
CertVerifySubjectCertificateContext |
使用发行者来验证主题证书 |
CryptUIDlgViewContext |
显示证书、CRL 或CTL |
CryptUIDlgSelectCertificateFromStore |
从指定库中显示对话框,可以从中选择证书 |
证书撤销列表函数
API |
功能 |
CertAddCRLContextToStore |
在证书库里增加一个CRL 上下文 |
CertAddCRLLinkToStore |
在不同的库里增加一个CRL 上下文链接 |
CertAddEncodedCRLToStore |
把编码CRL 转化成CRL 上下文然后把它加入到证书库中 |
CertCreateCRLContext |
从编码CRL 中创建CRL 句柄,但不把它加到库中 |
CertDeleteCRLFromStore |
从证书库里删除一个CRL |
CertDuplicateCRLContext |
通过增加引用计数来复制CRL 上下文 |
CertEnumCRLsInStore |
枚举库里的CRL 句柄 |
CertFindCertificateInCRL |
从指定证书里寻找CRL 列表 |
CertFindCRLInStore |
在库里寻找CRL 上下文 |
CertFreeCRLContext |
释放CRL 上下文 |
CertGetCRLFromStore |
从库里得到CRL 上下文句柄 |
CertSerializeCRLStoreElement |
串行化CRL 上下文的编码CRL 和它的属性 |
PKCS#11
PKCS#11简介
PKCS#11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API,并将API本身命名为“Cryptoki”(来自“加密令牌接口”,发音为“crypto-key” - 但是“PKCS#11”通常用于指代API以及定义它的标准)。 API定义了最常用的加密对像类型(RSA密钥,X.509证书,DES / 三重DES密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。
通用接口
接口 |
功能 |
C_Initialize |
初始化Cryptoki |
C_Finalize |
清楚相关资源 |
C_GetFunctionList |
获取库函数列表 |
加密函数
接口 |
功能 |
C_EncryptInit |
初始化一个加密操作 |
C_Encrypt |
加密单部分数据 |
C_EncryptUpdate |
继续多部分加密操作 |
C_EncryptFinal |
结束一次多部分加密操作 |
解密函数
接口 |
功能 |
C_DecryptInit |
启动一项解密操作 |
C_Decrypt |
解密单部分中的加密数据 |
C_DecryptUpdate |
继续一项多部分的解密操作 |
C_DecryptFinal |
结束多部分解密操作 |
消息摘要
接口 |
功能 |
C_DigestInit |
预置消息摘要操作 |
C_Digest |
摘要单部分中的数据 |
C_DigestUpdate |
继续多部分消息摘要操作 |
C_DigestKey |
摘要保密密钥值 |
C_DigestFinal |
结束多部分消息摘要操作 |
签名和MAC
接口 |
功能 |
C_SignInit |
预置签名操作,其中签名是数据的附录 |
C_Sign |
给单部分中的数据签名 |
C_SignUpdate |
继续多部分签名操作,处理另一个数据部分 |
C_SignFinal |
结束多部分签名操作 |
验证签名和MAC
接口 |
功能 |
C_VerifyInit |
预置校验操作,其中签名是数据的附录 |
C_Verify |
校验单部分操作中的签名 |
C_VerifyUpdate |
继续一个多部分的校验操作 |
C_VerifyFinal |
结束一次多部分校验操作,检查签名 |
密钥管理
接口 |
功能 |
C_GenerateKey |
产生一个保密密钥,创建一个新的密钥对象 |
C_GenerateKeyPair |
生成一个公私钥对,创建新的密钥对象 |
C_WrapKey |
打包一个私有或保密密钥 |
C_UnwrapKey |
解包一个打包密钥 |
C_DeriveKey |
从基础密钥中衍生出一个密钥,创建一个新的密钥对象 |
随机数生成
接口 |
功能 |
C_SeedRandom |
将附加的种子材料混入令牌的随机数生成器 |
C_GenerateRandom |
产生随机或伪随机的数据 |
GM/T 0016-2012
这个标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。层次关系:智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间
设备管理类函数
访问控制系列函数
函数名称 |
功能 |
SKF WaitForDevEvent |
等待设备捶拔事件 |
SKF_CancelWaitForDevEvent |
取消等待设备插拔事件 |
SKF EnumDev |
枚举设备 |
SKF ConnectDev |
连接设备 |
SDF_GenerateKeyWithEPK_RSA |
生成会话密钥并用外部RSA公钥加密输出 |
SDF_ImportKeyWithISK_RSA |
生成会话密钥并用内部RSA公钥解密 |
SDF_ExchangeDigitEnvelopeBaseOnRSA |
基于RSA算法的数字信封转换 |
SDF_ExportSignPublicKey_ECC |
导出ECC签名公钥 |
SDF_ExportEncPublicKey_ECC |
导出ECC加密公钥 |
SDF_GenerateKeyPair_ECC |
产生ECC非对称密钥对并输出 |
SDF_GenerateKeyWithIPK_ECC |
生成会话密钥并用内部ECC公钥加密输出 |
SDF_GenerateKeyWithEPK_ECC |
生成会话密钥并用外部ECC公钥加密输出 |
SDF_ImportKeyWithISK_ECC |
导入会话密钥并用内部ECC私钥解密 |
SDF_GenerateAgreementDataWithECC |
生成密钥协商参数并输出 |
SDF_GenerateKeyWithECC |
计算会话密钥 |
SDF_GenerateAgreementDataAndKeyWithECC |
产生协商数据并计算会话密钥 |
SDF_ExchangeDigitEnvelopeBaseOnECC |
基于ECC算法的数字信封转换 |
SDF_GenerateKeyWithKEK |
生成会话密钥并用密钥加密密密钥加密输出 |
SDF_ImportKeyWithKEK |
导入会话密钥并用密钥加密密钥解密 |
SDF_DestroyKey |
销毁会话密钥 |
非对称算法运算类函数
接口 |
功能 |
SDF_ExternalPublicKeyOperation_RSA |
外部公钥RSA运算 |
SDF_InternalPublicKeyOperation_RSA |
内部公钥RSA运算 |
SDF_InternalPrivateKeyOperation_RSA |
内部私钥RSA运算 |
SDF_ExternalVerify_ECC |
外部密钥ECC验证 |
SDF_InternalSign_ECC |
内部密钥ECC签名 |
SDF_InternalVerify_ECC |
内部密钥ECC验证 |
SDF_ExternalEncrypt_ECC |
外部密钥ECC加密 |
对称算法运算类函数
接口 |
功能 |
SDF_Encrypt |
对称加密 |
SDF_Decrypt |
对称解密 |
SDF_CalculateMAC |
计算MAC |
杂凑运算类函数
接口 |
功能 |
SDF_HashInit |
杂凑运算初始化 |
SDF_HashUpdate |
多包杂凑运算 |
SDF_HashFinal |
杂凑运算结束 |
用户文件操作类函数
接口 |
功能 |
SDF_CreateFile |
创建文件 |
SDF_ReadFile |
读取文件 |
SDF_WriteFile |
写文件 |
SDF_DeleteFile |
删除文件 |
GMT 0018-2012
本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。范围:本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准,适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置:在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终瑞等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务
设备管理类函数:
密钥管理类函数:
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
Crypto API
龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile
加密结果
龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts
龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify
PKCS#11
龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos
龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest
使用DES
使用RC2
使用RSA
使用AES
SKF
代码链接
https://gitee.com/zhou-qingrui/gm3000-key/tree/master