逸致

导航

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

不同的加密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

posted on 2024-04-08 19:15  逸致  阅读(6)  评论(0编辑  收藏  举报